diff --git a/README.md b/README.md
index f91d7ec..ed0dd8f 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,10 @@
# HTTP-клиент
-Подсистема 1С для работы с HTTP. Представляет собой библиотеку методов и инструменты выполнения HTTP-запросов. Реализованы:
+Подсистема 1С для работы с HTTP. Представляет собой библиотеку методов и инструменты выполнения HTTP-запросов.
+Цель создания подсистемы – предоставить программисту библиотеку с готовым функционалом, решающим прикладные задачи отправки HTTP-запросов исключительно средствами платформы 1С. [Подробнее](/doc/clue.md)
+
+Реализованы:
- исполнение запросов по URI (Клиент "понимает" IDN)
- текучий интерфейс методов настройки выполнения запроса
- хранение данных результатов запросов в рамках сессии
@@ -11,6 +14,7 @@
- настройка консоли в соответствии с командой curl
- выполнение запросов в серверном и клиентском (асинхронно с версии 2) контексте 1С
- выполнение запросов в мобильном приложении 1С
+- повторение попыток выполнить запрос после неуспешного результата (retry) с настраиваемой задержкой (backoff)
Разрабатывается на платформе 8.3.21.1302
@@ -44,6 +48,8 @@
## Ссылки
+[URI - Uniform Resource Identifier (RFC 3986)](https://www.ietf.org/rfc/rfc3986)
+
[Cookies: HTTP State Management Mechanism](https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis)
[Punycode](https://datatracker.ietf.org/doc/html/rfc3492)
@@ -51,3 +57,5 @@
[Описание формата ZIP файла](https://blog2k.ru/archives/3391), [Запись ZIP файла](https://blog2k.ru/archives/3397)
[curl man page](https://curl.se/docs/manpage.html)
+
+[Создание подписанного запроса для AWS API](https://docs.aws.amazon.com/IAM/latest/UserGuide/create-signed-request.html) и [аутентификация AWS Signature v4](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html) от Amazon.
diff --git a/doc/clue.md b/doc/clue.md
new file mode 100644
index 0000000..5bfc4ab
--- /dev/null
+++ b/doc/clue.md
@@ -0,0 +1,57 @@
+# Зачем
+
+Платформа 1С (по состоянию на время версии 8.3.21) предоставляет достаточно низкоуровневый кодовый функционал настройки HTTP-запроса. Такие вопросы, как описание конкретного типа авторизации, формирование тела запроса, переадресация, работа с Cookie, повторное отложенное выполнение и т.д., оставались на откуп программисту.
+
+Цель создания подсистемы – предоставить программисту библиотеку с готовым функционалом, решающим прикладные задачи отправки HTTP-запросов исключительно средствами платформы 1С.
+
+Подсистема состоит из:
+- библиотеки – набора процедур и функций (API);
+- Клиента – обработки для интерактивных настройки и выполнения HTTP-запросов.
+
+### Богатый функционал
+
+Библиотека содержит расширенный набор прикладных процедур и функций для настройки и выполнения HTTP-запроса. Говорящие названия функций и процедур, обширная документация, дизайн API в целом позволяют писать лаконичный, человекопонятный и эффективный код классическим подходом и в виде текучего (fluent) интерфейса.
+
+### Полностью платформенная реализация
+
+Весь функционал библиотеки реализован исключительно средствами платформы 1С.
+
+### Набор констант
+
+Названия методов, типы контента, коды ответа сервера, наименования заголовков и многое другое оформлены в виде констант (функции модуля повторного использования).
+
+### Формирование тела запроса
+
+Простота API библиотеки скрывает эффективную подготовку тела запроса различных видов: текст, файл, HTML-форма, компоновка формы multipart.
+
+### Аутентификация
+
+Библиотека берёт на себя подготовку запроса и работу с ответом для обеспечения успешной аутентификации различными способами.
+
+### Отложенное повторное выполнение
+
+Реализованы retry и backoff через механизм фоновых заданий. Библиотека анализирует ответ и может автоматически выполнять retry.
+
+### Перенаправления
+
+Библиотека позволяет автоматизировать выполнение цепочки запросов перенаправлений.
+
+### Мобильное приложение
+
+Библиотека почти полноценно работает в коде для мобильного приложения. Имеется версия Клиента для мобильной платформы.
+
+### Обработка Cookie
+
+Автоматизированы чтение заголовка `Set-Cookie`, хранение и отправка Cookie. Хранение Cookie по хостам реализовано в виде in-memory базе данных, которая находится в дополнительных параметрах запроса.
+
+### Клиент
+
+Клиент (обработка) даёт возможность получить код 1С по интерактивно настроенному запросу. Также есть функционал импорта из `Postman` и экспорт/импорт команды `curl`. Пример использования:
+1. Импорт запроса из Postman или curl
+2. Генерация кода 1С
+
+### И ещё много всего
+
+[Подробное описание](https://github.com/SpaceHead1C/1c_http/wiki/%D0%94%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D1%8F) функционала библиотеки.
+
+[Примеры использования](https://github.com/SpaceHead1C/1c_http/wiki/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B).
diff --git a/doc/code_examples.md b/doc/code_examples.md
index a31108a..118126b 100644
--- a/doc/code_examples.md
+++ b/doc/code_examples.md
@@ -56,7 +56,7 @@ URI = "https://evilinsult.com/generate_insult.php";
```bsl
// Пример сохранения тела ответа в файл
-URI = "https://epic.gsfc.nasa.gov/archive/natural/2015/10/31/png/epic_1b_20151031074844.png";
+URI = "https://upload.wikimedia.org/wikipedia/commons/0/0d/Africa_and_Europe_from_a_Million_Miles_Away.png";
ДП = КлиентHTTPКлиентСервер.НовыеДополнительныеПараметры();
Ответ = КлиентHTTPКлиентСервер
diff --git "a/src/v1/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP/Ext/Module.bsl" "b/src/v1/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP/Ext/Module.bsl"
index 411cf30..aa33be6 100644
--- "a/src/v1/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP/Ext/Module.bsl"
+++ "b/src/v1/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP/Ext/Module.bsl"
@@ -54,6 +54,15 @@
Возврат ТекущаяУниверсальнаяДата();
КонецФункции
+// Возвращает текущий Unix Timestamp
+//
+// Возвращаемое значение:
+// Число - количество секунд, прошедших с 01.01.1970 по текущее время UTC
+//
+Функция ВременнаяМеткаUnix() Экспорт
+ Возврат ТекущаяУниверсальнаяДата() - КлиентHTTPПовтИсп.ЭпохаUnix();
+КонецФункции
+
// Возвращает раскодированный URI в URL кодировке
//
// Параметры:
@@ -73,7 +82,7 @@
// КонтекстВыполненияАдресВХ - Строка - адрес контекста выполнения запроса во временном хранилище
//
// Возвращаемое значение:
-// Строка - значение заголовка Digest-авторизации
+// Строка - значение заголовка Digest-аутентификации
//
Функция ЗаголовокDigest(Знач Конфигурация, Знач КонтекстВыполненияАдресВХ) Экспорт
КонтекстВыполнения = ПолучитьИзВременногоХранилища(КонтекстВыполненияАдресВХ);
@@ -81,7 +90,7 @@
Параметры = Конфигурация.ДополнительныеПараметры.Сессия.ПараметрыDigest;
Аутентификация = Конфигурация.ДополнительныеПараметры.Аутентификация;
- АдресРесурсаСПараметрами = Конфигурация.ДанныеURI.АдресРесурса + Конфигурация.Параметры;
+ ПутьСПараметрами = Конфигурация.ДанныеURI.Путь + Конфигурация.ПараметрыСтрокой;
АлгоритмХеширования = НРег(Параметры.algorithm);
УникальныйКлючКлиента = Лев(СтрЗаменить(НРег(Новый УникальныйИдентификатор), "-", ""), 16);
@@ -98,8 +107,8 @@
A2 = ?(
КачествоЗащиты = "auth-int",
- СтрШаблон("%1:%2:%3", КонтекстВыполнения.Метод, АдресРесурсаСПараметрами, ХешСтрока(КонтекстВыполнения.Данные, АлгоритмХеширования)),
- СтрШаблон("%1:%2", КонтекстВыполнения.Метод, АдресРесурсаСПараметрами)
+ СтрШаблон("%1:%2:%3", КонтекстВыполнения.Метод, ПутьСПараметрами, ХешСтрока(КонтекстВыполнения.Данные, АлгоритмХеширования)),
+ СтрШаблон("%1:%2", КонтекстВыполнения.Метод, ПутьСПараметрами)
);
HA2 = ХешСтрока(A2, АлгоритмХеширования);
@@ -134,7 +143,7 @@
Конфигурация.ДополнительныеПараметры.Аутентификация.Пользователь,
Параметры.realm,
Параметры.nonce,
- АдресРесурсаСПараметрами,
+ ПутьСПараметрами,
Ответ
)
);
@@ -152,7 +161,219 @@
Возврат СтрСоединить(фРезультат);
КонецФункции
-// Возвращает коллекцию раскодированных строк
+// Возвращает заголовки AWS4-аутентификации
+//
+// Параметры:
+// Метод - Строка - имя HTTP-метода
+// Конфигурация - Структура - конфигурация выполнения запроса
+// ДанныеАдресВХ - Строка - адрес данных тела запроса во временном хранилище
+//
+// Возвращаемое значение:
+// Массив - заголовки AWS4-аутентификации
+//
+Функция ЗаголовкиAWS4(Знач Метод, Знач Конфигурация, Знач ДанныеАдресВХ) Экспорт
+ фРезультат = Новый Массив;
+
+ Данные = ПолучитьИзВременногоХранилища(ДанныеАдресВХ);
+ УдалитьИзВременногоХранилища(ДанныеАдресВХ);
+
+ ЗаголовокAmzContent = ХешСтрока(Данные, ХешФункция.SHA256);
+
+ СпецификацияЗапроса = "aws4_request";
+ АлгоритмШифрования = "AWS4-HMAC-SHA256";
+ Аутентификация = Конфигурация.ДополнительныеПараметры.АвторизоватьсяAWS4;
+ Регион = ?(ПустаяСтрока(Аутентификация.Регион), КлиентHTTPПовтИсп.РегионAWSПоУмолчанию(), Аутентификация.Регион);
+ ТУД = ТекущаяУниверсальнаяДата();
+ ЗаголовокAmzDate = Формат(ТУД, "ДФ=yyyyMMddTHHmmssZ");
+ ДатаДействия = Формат(ТУД, "ДФ=yyyyMMdd");
+
+ фРезультат.Добавить(Новый Структура("Ключ, Значение", "X-Amz-Date", ЗаголовокAmzDate));
+ фРезультат.Добавить(Новый Структура("Ключ, Значение", "X-Amz-Content-Sha256", ЗаголовокAmzContent));
+
+ СписокЗаголовков = СписокЗаголовковAWS4(Конфигурация.Заголовки, фРезультат);
+ ПодписываемыеЗаголовки = ПодписываемыеЗаголовкиAWS4(СписокЗаголовков);
+
+ ЧастиСтроки = Новый Массив;
+ ЧастиСтроки.Добавить(Метод);
+ ЧастиСтроки.Добавить(Конфигурация.ДанныеURI.Путь);
+ ЧастиСтроки.Добавить(КаноническиеПараметрыAWS4(Конфигурация.Параметры));
+ ЧастиСтроки.Добавить(КаноническиеЗаголовкиAWS4(СписокЗаголовков));
+ ЧастиСтроки.Добавить(ПодписываемыеЗаголовки);
+ ЧастиСтроки.Добавить(ЗаголовокAmzContent);
+ КаноническийЗапрос = СтрСоединить(ЧастиСтроки, Символы.ПС);
+
+ ЧастиСтроки = Новый Массив;
+ ЧастиСтроки.Добавить(ДатаДействия);
+ ЧастиСтроки.Добавить(Регион);
+ ЧастиСтроки.Добавить(Аутентификация.Сервис);
+ ЧастиСтроки.Добавить(СпецификацияЗапроса);
+ ОбластьДействия = СтрСоединить(ЧастиСтроки, "/");
+
+ ЧастиСтроки = Новый Массив;
+ ЧастиСтроки.Добавить(АлгоритмШифрования);
+ ЧастиСтроки.Добавить(ЗаголовокAmzDate);
+ ЧастиСтроки.Добавить(ОбластьДействия);
+ ЧастиСтроки.Добавить(ХешСтрока(КаноническийЗапрос, ХешФункция.SHA256));
+ СтрокаДляПодписи = СтрСоединить(ЧастиСтроки, Символы.ПС);
+
+ Подпись = HMAC256(ПолучитьДвоичныеДанныеИзСтроки("AWS4" + Аутентификация.СекретныйКлюч), ПолучитьДвоичныеДанныеИзСтроки(ДатаДействия));
+ Подпись = HMAC256(Подпись, ПолучитьДвоичныеДанныеИзСтроки(Регион));
+ Подпись = HMAC256(Подпись, ПолучитьДвоичныеДанныеИзСтроки(Аутентификация.Сервис));
+ Подпись = HMAC256(Подпись, ПолучитьДвоичныеДанныеИзСтроки(СпецификацияЗапроса));
+ Подпись = НРег(ПолучитьHexСтрокуИзДвоичныхДанных(HMAC256(Подпись, ПолучитьДвоичныеДанныеИзСтроки(СтрокаДляПодписи))));
+
+ фРезультат.Добавить(Новый Структура(
+ "Ключ, Значение",
+ КлиентHTTPПовтИсп.ЗаголовокТипАутентификации(),
+ СтрШаблон(
+ "%1 Credential=%2/%3, SignedHeaders=%4, Signature=%5",
+ АлгоритмШифрования,
+ Аутентификация.КлючДоступа,
+ ОбластьДействия,
+ ПодписываемыеЗаголовки,
+ Подпись
+ )
+ ));
+
+ Возврат Новый ФиксированныйМассив(фРезультат);
+КонецФункции
+
+// Возвращает значение заголовка Hawk-аутентификации
+// Расчёт подписи содержимого тела запроса не обязателен для Hawk-аутентификации.
+//
+// Параметры:
+// Метод - Строка - имя HTTP-метода
+// Конфигурация - Структура - конфигурация выполнения запроса
+// ДанныеАдресВХ - Строка, Неопределено - адрес данных тела запроса во временном хранилище
+//
+// Возвращаемое значение:
+// Строка - значение заголовка Hawk-аутентификации
+//
+Функция ЗаголовокHawk(Знач Метод, Конфигурация, Знач ДанныеАдресВХ = Неопределено) Экспорт
+ фРезультат = Новый Массив;
+
+ ПодписьТела = "";
+ Если ДанныеАдресВХ <> Неопределено Тогда
+ Данные = ПолучитьИзВременногоХранилища(ДанныеАдресВХ);
+ УдалитьИзВременногоХранилища(ДанныеАдресВХ);
+
+ ПодписьТела = ПодписьТелаHawk(
+ Данные,
+ КлиентHTTPКлиентСервер.ТипMIMEИзЗаголовков(Конфигурация.Заголовки)
+ );
+ КонецЕсли;
+
+ Аутентификация = Конфигурация.ДополнительныеПараметры.АвторизоватьсяHawk;
+ ДополнительныеДанные = НормализованныеДополнительныеДанныеHawk(Аутентификация.Дополнение);
+ РазовоеСлово = НовоеРазовоеСлово();
+ ВременнаяМетка = XMLСтрока(ВременнаяМеткаUnix());
+
+ ЧастиСтроки = Новый Массив;
+ ЧастиСтроки.Добавить("hawk.1.header");
+ ЧастиСтроки.Добавить(ВременнаяМетка);
+ ЧастиСтроки.Добавить(РазовоеСлово);
+ ЧастиСтроки.Добавить(Метод);
+ ЧастиСтроки.Добавить(Конфигурация.ДанныеURI.Путь);
+ ЧастиСтроки.Добавить(НРег(Конфигурация.ДанныеURI.Сервер));
+ ЧастиСтроки.Добавить(XMLСтрока(Конфигурация.ДанныеURI.Порт));
+ ЧастиСтроки.Добавить(ПодписьТела);
+ ЧастиСтроки.Добавить(ДополнительныеДанные);
+
+ Если НЕ ПустаяСтрока(Аутентификация.ИдентификаторПриложения) Тогда
+ ЧастиСтроки.Добавить(Аутентификация.ИдентификаторПриложения);
+ ЧастиСтроки.Добавить(Аутентификация.Делегирование);
+ КонецЕсли;
+
+ ЧастиСтроки.Добавить("");
+
+ Подпись = Base64Строка(HMAC256(
+ ПолучитьДвоичныеДанныеИзСтроки(Аутентификация.Ключ),
+ ПолучитьДвоичныеДанныеИзСтроки(СтрСоединить(ЧастиСтроки, Символы.ПС))
+ ));
+
+ фРезультат.Добавить(СтрШаблон("Hawk id=""%1"", ts=""%2"", nonce=""%3""", Аутентификация.Идентификатор, ВременнаяМетка, РазовоеСлово));
+ Если ПодписьТела <> "" Тогда
+ фРезультат.Добавить(СтрШаблон("hash=""%1""", ПодписьТела));
+ КонецЕсли;
+ Если ДополнительныеДанные <> "" Тогда
+ фРезультат.Добавить(СтрШаблон("ext=""%1""", ДополнительныеДанные));
+ КонецЕсли;
+ фРезультат.Добавить(СтрШаблон("mac=""%1""", Подпись));
+ Если НЕ ПустаяСтрока(Аутентификация.ИдентификаторПриложения) Тогда
+ фРезультат.Добавить(СтрШаблон("app=""%1""", Аутентификация.ИдентификаторПриложения));
+ Если НЕ ПустаяСтрока(Аутентификация.Делегирование) Тогда
+ фРезультат.Добавить(СтрШаблон("dlg=""%1""", Аутентификация.Делегирование));
+ КонецЕсли;
+ КонецЕсли;
+
+ Аутентификация = Новый Структура(Аутентификация);
+ Аутентификация.Вставить("РазовоеСлово", РазовоеСлово);
+ Аутентификация.Вставить("ВременнаяМетка", ВременнаяМетка);
+
+ Конфигурация.ДополнительныеПараметры.АвторизоватьсяHawk = Новый ФиксированнаяСтруктура(Аутентификация);
+
+ Возврат СтрСоединить(фРезультат, ", ");
+КонецФункции
+
+// Возвращает результат валидации ответа сервера по указанному заголовку (Hawk аутентификация)
+// Если валидация прошла успешно, вернётся Истина.
+//
+// Параметры:
+// ЗначениеЗаголовка - Строка - значение заголовка ответа сервера с данными Hawk аутентификации
+// КонтекстHawk - Структура - данные Hawk аутентификации запроса
+// ДанныеАдресВХ - Строка - адрес данных тела ответа и MIME-типа во временном хранилище
+// ОписаниеОшибки - Строка - описание ошибки валидации ответа
+//
+// Возвращаемое значение:
+// Булево - результат валидации
+//
+Функция ОтветСЗаголовкомHawkКорректен(Знач ЗначениеЗаголовка, Знач КонтекстHawk, Знач ДанныеАдресВХ, ОписаниеОшибки) Экспорт
+ ДанныеСервера = ДанныеЗаголовкаОтветаHawk(ЗначениеЗаголовка);
+
+ ПодписьТела = "";
+ Если ДанныеСервера.ПодписьТела <> "" Тогда
+ Данные = ПолучитьИзВременногоХранилища(ДанныеАдресВХ);
+ ПодписьТела = ПодписьТелаHawk(Данные.Тело, Данные.ТипMIME);
+ КонецЕсли;
+ УдалитьИзВременногоХранилища(ДанныеАдресВХ);
+
+ Если ПодписьТела <> ДанныеСервера.ПодписьТела Тогда
+ ОписаниеОшибки = СтрШаблон("Не совпадают подписи тела ответа: рассчитана '%1', получена '%2'", ПодписьТела, ДанныеСервера.ПодписьТела);
+ Возврат Ложь;
+ КонецЕсли;
+
+ ЧастиСтроки = Новый Массив;
+ ЧастиСтроки.Добавить("hawk.1.response");
+ ЧастиСтроки.Добавить(КонтекстHawk.ВременнаяМетка);
+ ЧастиСтроки.Добавить(КонтекстHawk.РазовоеСлово);
+ ЧастиСтроки.Добавить(КонтекстHawk.Метод);
+ ЧастиСтроки.Добавить(КонтекстHawk.Путь);
+ ЧастиСтроки.Добавить(НРег(КонтекстHawk.Хост));
+ ЧастиСтроки.Добавить(XMLСтрока(КонтекстHawk.Порт));
+ ЧастиСтроки.Добавить(ПодписьТела);
+ ЧастиСтроки.Добавить(ДанныеСервера.Дополнение);
+
+ Если НЕ ПустаяСтрока(КонтекстHawk.ИдентификаторПриложения) Тогда
+ ЧастиСтроки.Добавить(КонтекстHawk.ИдентификаторПриложения);
+ ЧастиСтроки.Добавить(КонтекстHawk.Делегирование);
+ КонецЕсли;
+
+ ЧастиСтроки.Добавить("");
+
+ Подпись = Base64Строка(HMAC256(
+ ПолучитьДвоичныеДанныеИзСтроки(КонтекстHawk.Ключ),
+ ПолучитьДвоичныеДанныеИзСтроки(СтрСоединить(ЧастиСтроки, Символы.ПС))
+ ));
+
+ Если Подпись <> ДанныеСервера.Подпись Тогда
+ ОписаниеОшибки = СтрШаблон("Не совпадают подписи ответа: рассчитана '%1', получена '%2'", Подпись, ДанныеСервера.Подпись);
+ Возврат Ложь;
+ КонецЕсли;
+
+ Возврат Истина;
+КонецФункции
+
+// (УСТАРЕЛО) Возвращает коллекцию раскодированных строк
//
// Параметры:
// КоллекцияСтрок - Структура - коллекция строк для раскодирования (обрабатываются только значения)
@@ -175,7 +396,31 @@
Возврат фРезультат;
КонецФункции
-// Возвращает коллекцию кодированных строк
+// Возвращает множество раскодированных строк способом КодировкаURL
+//
+// Параметры:
+// МножествоСтрок - Соответствие - множество строк для раскодирования
+//
+// Возвращаемое значение:
+// Соответствие - множество раскодированных строк
+//
+Функция РаскодированныеСтрокиURL(Знач МножествоСтрок) Экспорт
+ Возврат РаскодированныеСтрокиСпособом(МножествоСтрок, СпособКодированияСтроки.КодировкаURL);
+КонецФункции
+
+// Возвращает множество раскодированных строк способом URLВКодировкеURL
+//
+// Параметры:
+// МножествоСтрок - Соответствие - множество строк для раскодирования
+//
+// Возвращаемое значение:
+// Соответствие - множество раскодированных строк
+//
+Функция РаскодированныеСтрокиURLвURL(Знач МножествоСтрок) Экспорт
+ Возврат РаскодированныеСтрокиСпособом(МножествоСтрок, СпособКодированияСтроки.URLВКодировкеURL);
+КонецФункции
+
+// (УСТАРЕЛО) Возвращает коллекцию кодированных строк
//
// Параметры:
// КоллекцияСтрок - Структура - коллекция строк для кодирования (обрабатываются только значения)
@@ -198,6 +443,30 @@
Возврат фРезультат;
КонецФункции
+// Возвращает множество кодированных строк способом КодировкаURL
+//
+// Параметры:
+// МножествоСтрок - Соответствие - множество строк для кодирования
+//
+// Возвращаемое значение:
+// Соответствие - множество кодированных строк
+//
+Функция КодированныеСтрокиURL(Знач МножествоСтрок) Экспорт
+ Возврат КодированныеСтрокиСпособом(МножествоСтрок, СпособКодированияСтроки.КодировкаURL);
+КонецФункции
+
+// Возвращает множество кодированных строк способом URLВКодировкеURL
+//
+// Параметры:
+// МножествоСтрок - Соответствие - множество строк для кодирования
+//
+// Возвращаемое значение:
+// Соответствие - множество кодированных строк
+//
+Функция КодированныеСтрокиURLвURL(Знач МножествоСтрок) Экспорт
+ Возврат КодированныеСтрокиСпособом(МножествоСтрок, СпособКодированияСтроки.URLВКодировкеURL);
+КонецФункции
+
// Возвращает коллекцию раскодированных полей HTML-Формы
//
// Параметры:
@@ -238,7 +507,7 @@
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
-// Добавляет запись ошибки в журнал регистрации
+// (СЛУЖЕБНЫЙ) Добавляет запись ошибки в журнал регистрации
//
// Параметры:
// Данные - Ссылка, Число, Строка, Дата, Булево, Неопределено, Null, Тип - данные, с которыми связано событие
@@ -257,6 +526,31 @@
?(СобытиеВТранзакции, РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная, РежимТранзакцииЗаписиЖурналаРегистрации.Независимая)
);
КонецПроцедуры
+
+// (СЛУЖЕБНЫЙ) Запуск паузы выполнения кода по ключу процесса
+// Используется механика фоновых заданий.
+//
+// Параметры:
+// Длительность - Число - длительность ожидания в секундах
+// Ключ - Строка - ключ процесса, требующего паузу (используется как ключ фонового задания)
+//
+Процедура ПаузаПередПовторнымВыполнением(Знач Длительность, Знач Ключ) Экспорт
+ Перем ФЗ;
+
+ ИмяМетода = "КлиентHTTP.ПаузаПередПовторнымВыполнением";
+ ФЗя = ФоновыеЗадания.ПолучитьФоновыеЗадания(Новый Структура("ИмяМетода, Ключ, Состояние", ИмяМетода, Ключ, СостояниеФоновогоЗадания.Активно));
+ Если ФЗя.Количество() = 0 Тогда
+ Параметры = Новый Массив;
+ Параметры.Добавить(Длительность);
+ Параметры.Добавить(Ключ);
+
+ ФЗ = ФоновыеЗадания.Выполнить(ИмяМетода, Параметры, Ключ);
+ Иначе
+ ФЗ = ФЗя[0];
+ КонецЕсли;
+
+ ФЗ.ОжидатьЗавершенияВыполнения(Длительность);
+КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
@@ -374,8 +668,11 @@
// собирать значение печеньки пока не придёт знак (ТипТокена В {1, 2}) его записать
Действие.ЗаписатьЗначениеПеченьки = Ложь;
Действие.СобиратьЗначениеПеченьки = Истина;
- СостояниеПеченьки.Построитель.Добавить(СостояниеПеченьки.Объект.Значение + ЧастьОписанияПеченья(ОписанияПеченья.Исходное, СостояниеЧтения));
- СостояниеПеченьки.Построитель.Добавить(СостояниеЧтения.Токен.Токен);
+ ЧастиОписания = ЧастьОписанияПеченья(ОписанияПеченья.Исходное, СостояниеЧтения);
+ Если НЕ ПустаяСтрока(ЧастиОписания) Тогда
+ СостояниеПеченьки.Построитель.Добавить(СостояниеПеченьки.Объект.Значение + ЧастиОписания);
+ СостояниеПеченьки.Построитель.Добавить(СостояниеЧтения.Токен.Токен);
+ КонецЕсли;
СостояниеЧтения.Позиция = СостояниеЧтения.Токен.Позиция + 1;
ПереключитьСостояниеДКА(СостояниеДКА);
КонецПроцедуры
@@ -552,6 +849,10 @@
КонецПроцедуры
Функция ЧастьОписанияПеченья(Знач ОписаниеПеченьки, Знач СостояниеЧтения, Знач Смещение = 0)
+ Если СостояниеЧтения.Токен.Позиция - СостояниеЧтения.Позиция + Смещение < 1 Тогда
+ Возврат "";
+ КонецЕсли;
+
Возврат Сред(
ОписаниеПеченьки,
СостояниеЧтения.Позиция,
@@ -659,7 +960,7 @@
КонецФункции
Функция ХешСтрока(Знач Данные, Знач Алгоритм)
- ТипФункции = ТипХешФункции(Алгоритм);
+ ТипФункции = ?(ТипЗнч(Алгоритм) = Тип("ХешФункция"), Алгоритм, ТипХешФункции(Алгоритм));
Если ТипЗнч(Данные) = Тип("Строка") Тогда
Данные = ПолучитьДвоичныеДанныеИзСтроки(Данные, КлиентHTTPПовтИсп.КодировкаUTF8(), Ложь);
@@ -683,4 +984,209 @@
Возврат фРезультат;
КонецФункции
+
+Функция РаскодированныеСтрокиСпособом(Знач МножествоСтрок, Знач Способ)
+ фРезультат = Новый Соответствие;
+
+ Для Каждого КЗ Из МножествоСтрок Цикл
+ фРезультат.Вставить(КЗ.Ключ, РаскодироватьСтроку(КЗ.Ключ, Способ));
+ КонецЦикла;
+
+ Возврат фРезультат;
+КонецФункции
+
+Функция КодированныеСтрокиСпособом(Знач МножествоСтрок, Знач Способ)
+ фРезультат = Новый Соответствие;
+
+ Для Каждого КЗ Из МножествоСтрок Цикл
+ фРезультат.Вставить(КЗ.Ключ, КодироватьСтроку(КЗ.Ключ, Способ));
+ КонецЦикла;
+
+ Возврат фРезультат;
+КонецФункции
+
+Функция НовоеРазовоеСлово()
+ фРезультат = Новый Массив;
+
+ База = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+ ДлинаБазы = СтрДлина(База);
+ ГСЧ = Новый ГенераторСлучайныхЧисел(13);
+ Для я = 1 По 32 Цикл
+ Позиция = ГСЧ.СлучайноеЧисло(1, ДлинаБазы);
+ фРезультат.Добавить(Сред(База, Позиция, 1));
+ КонецЦикла;
+
+ Возврат СтрСоединить(фРезультат);
+КонецФункции
+
+Функция HMAC256(Знач Ключ, Знач Данные)
+ АлгоритмХеширования = ХешФункция.SHA256;
+ РазмерБлока = 64;
+ Если Ключ.Размер() > РазмерБлока Тогда
+ Хеширование = Новый ХешированиеДанных(АлгоритмХеширования);
+ Хеширование.Добавить(Ключ);
+
+ Ключ = Хеширование.ХешСумма;
+ КонецЕсли;
+
+ ВнутренняяОснова = Новый БуферДвоичныхДанных(РазмерБлока);
+ ВнешняяОснова = Новый БуферДвоичныхДанных(РазмерБлока);
+ Для Позиция = 0 По РазмерБлока - 1 Цикл
+ ВнутренняяОснова.Установить(Позиция, 54); // 0x36
+ ВнешняяОснова.Установить(Позиция, 92); // 0x5C
+ КонецЦикла;
+
+ Буфер = Новый БуферДвоичныхДанных(РазмерБлока);
+ Буфер.Записать(0, ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Ключ));
+
+ ВнутреннийКлюч = Буфер.Скопировать();
+ ВнутреннийКлюч.ЗаписатьПобитовоеИсключительноеИли(0, ВнутренняяОснова);
+
+ ВнешнийКлюч = Буфер;
+ ВнешнийКлюч.ЗаписатьПобитовоеИсключительноеИли(0, ВнешняяОснова);
+
+ ВнутреннийХеш = Новый ХешированиеДанных(АлгоритмХеширования);
+ ВнешнийХеш = Новый ХешированиеДанных(АлгоритмХеширования);
+
+ ВнутреннийХеш.Добавить(ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ВнутреннийКлюч));
+ ВнешнийХеш.Добавить(ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ВнешнийКлюч));
+
+ Если ЗначениеЗаполнено(Данные) Тогда
+ ВнутреннийХеш.Добавить(Данные);
+ КонецЕсли;
+
+ ВнешнийХеш.Добавить(ВнутреннийХеш.ХешСумма);
+
+ Возврат ВнешнийХеш.ХешСумма;
+КонецФункции
+
+Функция КаноническиеПараметрыAWS4(Знач ПараметрыЗапроса)
+ фРезультат = Новый Массив;
+
+ СписокПараметров = Новый СписокЗначений;
+ Для Каждого Параметр Из ПараметрыЗапроса Цикл
+ Ключ = КодироватьСтроку(КлиентHTTPСлужебный.ФорматированноеИмяПараметраЗапроса(Параметр.Ключ), СпособКодированияСтроки.URLВКодировкеURL);
+ Если ПустаяСтрока(Ключ) Тогда
+ Продолжить;
+ КонецЕсли;
+ Если Параметр.Значение.Количество() = 0 Тогда
+ СписокПараметров.Добавить(Ключ);
+ Продолжить;
+ КонецЕсли;
+ Для Каждого Значение Из Параметр.Значение Цикл
+ СписокПараметров.Добавить(Ключ, КодироватьСтроку(КлиентHTTPСлужебный.ФорматированноеИмяПараметраЗапроса(Значение), СпособКодированияСтроки.URLВКодировкеURL));
+ КонецЦикла;
+ КонецЦикла;
+ СписокПараметров.СортироватьПоПредставлению();
+ СписокПараметров.СортироватьПоЗначению();
+
+ Для Каждого Параметр Из СписокПараметров Цикл
+ фРезультат.Добавить(Параметр.Значение + "=" + Параметр.Представление);
+ КонецЦикла;
+
+ Возврат СтрСоединить(фРезультат, "&");
+КонецФункции
+
+Функция СписокЗаголовковAWS4(Знач ЗаголовкиЗапроса, Знач ЗаголовкиAWS)
+ фРезультат = Новый СписокЗначений;
+
+ МножествоЗаголовков = Новый Соответствие;
+
+ Для Каждого Заголовок Из ЗаголовкиЗапроса Цикл
+ Ключ = НРег(Заголовок.Ключ);
+ Если Ключ = "host" ИЛИ СтрНачинаетсяС(Ключ, "x-amz-") Тогда
+ МножествоЗаголовков.Вставить(Ключ, Заголовок.Значение);
+ КонецЕсли;
+ КонецЦикла;
+ Для Каждого Заголовок Из ЗаголовкиAWS Цикл
+ МножествоЗаголовков.Вставить(НРег(Заголовок.Ключ), Заголовок.Значение);
+ КонецЦикла;
+
+ Для Каждого Заголовок Из МножествоЗаголовков Цикл
+ фРезультат.Добавить(Заголовок.Ключ, Заголовок.Значение);
+ КонецЦикла;
+ фРезультат.СортироватьПоЗначению(НаправлениеСортировки.Возр);
+
+ Возврат фРезультат;
+КонецФункции
+
+Функция КаноническиеЗаголовкиAWS4(Знач СписокЗаголовков)
+ фРезультат = Новый Массив;
+ Для Каждого Заголовок Из СписокЗаголовков Цикл
+ фРезультат.Добавить(СтрШаблон("%1:%2", Заголовок.Значение, Заголовок.Представление));
+ КонецЦикла;
+ фРезультат.Добавить("");
+
+ Возврат СтрСоединить(фРезультат, Символы.ПС);
+КонецФункции
+
+Функция ПодписываемыеЗаголовкиAWS4(Знач СписокЗаголовков)
+ фРезультат = Новый Массив;
+ Для Каждого Заголовок Из СписокЗаголовков Цикл
+ фРезультат.Добавить(Заголовок.Значение);
+ КонецЦикла;
+
+ Возврат СтрСоединить(фРезультат, ";");
+КонецФункции
+
+Функция НормализованныеДополнительныеДанныеHawk(Знач ДополнительныеДанные)
+ Возврат СтрЗаменить(СтрЗаменить(ДополнительныеДанные, "\", "\\"), Символы.ПС, "\n");
+КонецФункции
+
+Функция ПодписьТелаHawk(Знач Данные, Знач ТипКонтента)
+ Если Данные.Размер() = 0 ИЛИ НЕ ЗначениеЗаполнено(ТипКонтента) Тогда
+ Возврат "";
+ КонецЕсли;
+
+ Поток = Новый ПотокВПамяти;
+ Запись = Новый ЗаписьДанных(Поток);
+
+ Запись.ЗаписатьСимволы("hawk.1.payload");
+ Запись.ЗаписатьБайт(10); // символ '\n'
+ Запись.ЗаписатьСимволы(НРег(ТипКонтента));
+ Запись.ЗаписатьБайт(10);
+ Запись.Записать(Данные);
+ Запись.ЗаписатьБайт(10);
+
+ Хеширование = Новый ХешированиеДанных(ХешФункция.SHA256);
+ Хеширование.Добавить(Поток.ЗакрытьИПолучитьДвоичныеДанные());
+
+ Возврат Base64Строка(Хеширование.ХешСумма);
+КонецФункции
+
+Функция ДанныеЗаголовкаОтветаHawk(Знач ЗначениеЗаголовка)
+ фРезультат = Новый Структура("Подпись, ПодписьТела, Дополнение", "", "", "");
+
+ ПозицияНачала = СтрНайти(ЗначениеЗаголовка, " mac=""");
+ ПозицияОкончания = 0;
+ Если ПозицияНачала > 0 Тогда
+ ПозицияНачала = ПозицияНачала + 6;
+ ПозицияОкончания = СтрНайти(ЗначениеЗаголовка, """", , ПозицияНачала);
+ Если ПозицияОкончания > 0 Тогда
+ фРезультат.Подпись = Сред(ЗначениеЗаголовка, ПозицияНачала, ПозицияОкончания - ПозицияНачала);
+ КонецЕсли;
+ КонецЕсли;
+
+ ПозицияНачала = СтрНайти(ЗначениеЗаголовка, " hash=""");
+ ПозицияОкончания = 0;
+ Если ПозицияНачала > 0 Тогда
+ ПозицияНачала = ПозицияНачала + 7;
+ ПозицияОкончания = СтрНайти(ЗначениеЗаголовка, """", , ПозицияНачала);
+ Если ПозицияОкончания > 0 Тогда
+ фРезультат.ПодписьТела = Сред(ЗначениеЗаголовка, ПозицияНачала, ПозицияОкончания - ПозицияНачала);
+ КонецЕсли;
+ КонецЕсли;
+
+ ПозицияНачала = СтрНайти(ЗначениеЗаголовка, " ext=""");
+ ПозицияОкончания = 0;
+ Если ПозицияНачала > 0 Тогда
+ ПозицияНачала = ПозицияНачала + 6;
+ ПозицияОкончания = СтрНайти(ЗначениеЗаголовка, """", , ПозицияНачала);
+ Если ПозицияОкончания > 0 Тогда
+ фРезультат.Дополнение = Сред(ЗначениеЗаголовка, ПозицияНачала, ПозицияОкончания - ПозицияНачала);
+ КонецЕсли;
+ КонецЕсли;
+
+ Возврат фРезультат;
+КонецФункции
#КонецОбласти
diff --git "a/src/v1/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Ext/Module.bsl" "b/src/v1/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Ext/Module.bsl"
index 762dd87..ea95c77 100644
--- "a/src/v1/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Ext/Module.bsl"
+++ "b/src/v1/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Ext/Module.bsl"
@@ -22,6 +22,15 @@
Возврат КлиентHTTP.ТекущаяУниверсальнаяДатаНаСервере();
КонецФункции
+// Возвращает текущий Unix Timestamp
+//
+// Возвращаемое значение:
+// Число - количество секунд, прошедших с 01.01.1970 по текущее время UTC
+//
+Функция ВременнаяМеткаUnix() Экспорт
+ Возврат КлиентHTTP.ВременнаяМеткаUnix();
+КонецФункции
+
// Возвращает раскодированный URI
//
// Параметры:
@@ -47,6 +56,51 @@
Возврат КлиентHTTP.ЗаголовокDigest(Конфигурация, КонтекстВыполненияАдресВХ);
КонецФункции
+// Возвращает заголовки AWS4-аутентификации
+//
+// Параметры:
+// Метод - Строка - имя HTTP-метода
+// Конфигурация - Структура - конфигурация выполнения запроса
+// ДанныеАдресВХ - Строка - адрес данных тела запроса во временном хранилище
+//
+// Возвращаемое значение:
+// Массив - заголовки AWS4-авторизации
+//
+Функция ЗаголовкиAWS4(Знач Метод, Знач Конфигурация, Знач ДанныеАдресВХ) Экспорт
+ Возврат КлиентHTTP.ЗаголовкиAWS4(Метод, Конфигурация, ДанныеАдресВХ);
+КонецФункции
+
+// Возвращает значение заголовка Hawk-аутентификации
+// Расчёт подписи содержимого тела запроса не обязателен для Hawk-аутентификации.
+//
+// Параметры:
+// Метод - Строка - имя HTTP-метода
+// Конфигурация - Структура - конфигурация выполнения запроса
+// ДанныеАдресВХ - Строка, Неопределено - адрес данных тела запроса во временном хранилище
+//
+// Возвращаемое значение:
+// Строка - значение заголовка Hawk-аутентификации
+//
+Функция ЗаголовокHawk(Знач Метод, Конфигурация, Знач ДанныеАдресВХ = Неопределено) Экспорт
+ Возврат КлиентHTTP.ЗаголовокHawk(Метод, Конфигурация, ДанныеАдресВХ);
+КонецФункции
+
+// Возвращает результат валидации ответа сервера по указанному заголовку (Hawk аутентификация)
+// Если валидация прошла успешно, вернётся Истина.
+//
+// Параметры:
+// ЗначениеЗаголовка - Строка - значение заголовка ответа сервера с данными Hawk аутентификации
+// КонтекстHawk - Структура - данные Hawk аутентификации запроса
+// ДанныеАдресВХ - Строка - адрес данных тела ответа и MIME-типа во временном хранилище
+// ОписаниеОшибки - Строка - описание ошибки валидации ответа
+//
+// Возвращаемое значение:
+// Булево - результат валидации
+//
+Функция ОтветСЗаголовкомHawkКорректен(Знач ЗначениеЗаголовка, Знач КонтекстHawk, Знач ДанныеАдресВХ, ОписаниеОшибки) Экспорт
+ Возврат КлиентHTTP.ОтветСЗаголовкомHawkКорректен(ЗначениеЗаголовка, КонтекстHawk, ДанныеАдресВХ, ОписаниеОшибки);
+КонецФункции
+
// Добавляет запись ошибки в журнал регистрации
//
// Параметры:
@@ -58,7 +112,7 @@
КлиентHTTP.ДобавитьЗаписьОшибкиВЖурналРегистрации(Данные, Комментарий, СобытиеВТранзакции);
КонецПроцедуры
-// Возвращает коллекцию раскодированных строк
+// (УСТАРЕЛО) Возвращает коллекцию раскодированных строк
//
// Параметры:
// КоллекцияСтрок - Структура - коллекция строк для раскодирования (обрабатываются только значения)
@@ -71,7 +125,31 @@
Возврат КлиентHTTP.РаскодированныеСтроки(КоллекцияСтрок, Способ);
КонецФункции
-// Возвращает коллекцию кодированных строк
+// Возвращает множество раскодированных строк способом КодировкаURL
+//
+// Параметры:
+// МножествоСтрок - Соответствие - множество строк для раскодирования
+//
+// Возвращаемое значение:
+// Соответствие - множество раскодированных строк
+//
+Функция РаскодированныеСтрокиURL(Знач МножествоСтрок) Экспорт
+ Возврат КлиентHTTP.РаскодированныеСтрокиURL(МножествоСтрок);
+КонецФункции
+
+// Возвращает множество раскодированных строк способом URLВКодировкеURL
+//
+// Параметры:
+// МножествоСтрок - Соответствие - множество строк для раскодирования
+//
+// Возвращаемое значение:
+// Соответствие - множество раскодированных строк
+//
+Функция РаскодированныеСтрокиURLвURL(Знач МножествоСтрок) Экспорт
+ Возврат КлиентHTTP.РаскодированныеСтрокиURLвURL(МножествоСтрок);
+КонецФункции
+
+// (УСТАРЕЛО) Возвращает коллекцию кодированных строк
//
// Параметры:
// КоллекцияСтрок - Структура - коллекция строк для кодирования (обрабатываются только значения)
@@ -84,6 +162,30 @@
Возврат КлиентHTTP.ЗакодированныеСтроки(КоллекцияСтрок, Способ);
КонецФункции
+// Возвращает множество кодированных строк способом КодировкаURL
+//
+// Параметры:
+// МножествоСтрок - Соответствие - множество строк для кодирования
+//
+// Возвращаемое значение:
+// Соответствие - множество кодированных строк
+//
+Функция КодированныеСтрокиURL(Знач МножествоСтрок) Экспорт
+ Возврат КлиентHTTP.КодированныеСтрокиURL(МножествоСтрок);
+КонецФункции
+
+// Возвращает множество кодированных строк способом URLВКодировкеURL
+//
+// Параметры:
+// МножествоСтрок - Соответствие - множество строк для кодирования
+//
+// Возвращаемое значение:
+// Соответствие - множество кодированных строк
+//
+Функция КодированныеСтрокиURLвURL(Знач МножествоСтрок) Экспорт
+ Возврат КлиентHTTP.КодированныеСтрокиURLвURL(МножествоСтрок);
+КонецФункции
+
// Возвращает коллекцию раскодированных полей HTML-Формы
//
// Параметры:
@@ -107,4 +209,15 @@
Функция ЗакодированныеПоляФормыHTML(Знач ПоляФормыHTML) Экспорт
Возврат КлиентHTTP.ЗакодированныеПоляФормыHTML(ПоляФормыHTML);
КонецФункции
+
+// Запуск паузы выполнения кода по ключу процесса
+// Используется механика фоновых заданий.
+//
+// Параметры:
+// Длительность - Число - длительность ожидания в секундах
+// Ключ - Строка - ключ процесса, требующего паузу (используется как ключ фонового задания)
+//
+Процедура ПаузаПередПовторнымВыполнением(Знач Длительность, Знач Ключ) Экспорт
+ КлиентHTTP.ПаузаПередПовторнымВыполнением(Длительность, Ключ);
+КонецПроцедуры
#КонецОбласти
diff --git "a/src/v1/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl" "b/src/v1/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl"
index c6714c2..9145794 100644
--- "a/src/v1/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl"
+++ "b/src/v1/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl"
@@ -6,8 +6,8 @@
//
// Параметры:
// ИдентификаторРесурса - Строка, Структура - URI сервиса либо объект идентификатора ресурса
-// ПараметрыЗапроса - Соответствие - коллекция параметров GET-запроса (необязательный)
-// ДополнительныеПараметры - Структура - конфигурация выполнения POST-запроса (необязательный)
+// ПараметрыЗапроса - Соответствие - коллекция параметров GET-запроса
+// ДополнительныеПараметры - Структура - конфигурация выполнения POST-запроса
//
// Возвращаемое значение:
// ФиксированнаяСтруктура - объект ответа:
@@ -15,9 +15,10 @@
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * КонтекстВыполнения - Структура - служебный набор значений процесса выполнения запроса
//
Функция Получить(Знач ИдентификаторРесурса, Знач ПараметрыЗапроса = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт
- Возврат ВыполнитьЗапросHTTP(
+ Возврат ВыполненныйЗапросHTTP(
КлиентHTTPПовтИсп.МетодGET(),
КонфигурацияЗапроса(ИдентификаторРесурса, ПараметрыЗапроса, ДополнительныеПараметры)
);
@@ -27,8 +28,8 @@
//
// Параметры:
// ИдентификаторРесурса - Строка, Структура - URI сервиса либо объект идентификатора ресурса
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
//
// Возвращаемое значение:
// ФиксированнаяСтруктура - объект ответа:
@@ -36,9 +37,10 @@
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * КонтекстВыполнения - Структура - служебный набор значений процесса выполнения запроса
//
Функция ПолучитьЗаголовки(Знач ИдентификаторРесурса, Знач ПараметрыЗапроса = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт
- Возврат ВыполнитьЗапросHTTP(
+ Возврат ВыполненныйЗапросHTTP(
КлиентHTTPПовтИсп.МетодHEAD(),
КонфигурацияЗапроса(ИдентификаторРесурса, ПараметрыЗапроса, ДополнительныеПараметры)
);
@@ -49,8 +51,8 @@
// Параметры:
// ИдентификаторРесурса - Строка, Структура - URI сервиса либо объект идентификатора ресурса
// Данные - ДвоичныеДанные - тело запроса
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
//
// Возвращаемое значение:
// ФиксированнаяСтруктура - объект ответа:
@@ -58,13 +60,14 @@
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * КонтекстВыполнения - Структура - служебный набор значений процесса выполнения запроса
//
Функция ОтправитьДвоичныеДанные(Знач ИдентификаторРесурса, Знач Данные, ДополнительныеПараметры = Неопределено, Знач ПараметрыЗапроса = Неопределено) Экспорт
Конфигурация = КонфигурацияЗапроса(ИдентификаторРесурса, ПараметрыЗапроса, ДополнительныеПараметры);
ДобавитьРазмерДанныхВЗаголовкиЗапроса(Конфигурация.Заголовки, Конфигурация.ДополнительныеПараметры, Данные);
- Возврат ВыполнитьЗапросHTTP(КлиентHTTPПовтИсп.МетодPOST(), Конфигурация, Данные);
+ Возврат ВыполненныйЗапросHTTP(КлиентHTTPПовтИсп.МетодPOST(), Конфигурация, Данные);
КонецФункции
// Реализация PUT
@@ -72,8 +75,8 @@
// Параметры:
// ИдентификаторРесурса - Строка, Структура - URI сервиса либо объект идентификатора ресурса
// Данные - ДвоичныеДанные - тело запроса
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
//
// Возвращаемое значение:
// ФиксированнаяСтруктура - объект ответа:
@@ -81,13 +84,14 @@
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * КонтекстВыполнения - Структура - служебный набор значений процесса выполнения запроса
//
Функция ЗаписатьДвоичныеДанные(Знач ИдентификаторРесурса, Знач Данные, ДополнительныеПараметры = Неопределено, Знач ПараметрыЗапроса = Неопределено) Экспорт
Конфигурация = КонфигурацияЗапроса(ИдентификаторРесурса, ПараметрыЗапроса, ДополнительныеПараметры);
ДобавитьРазмерДанныхВЗаголовкиЗапроса(Конфигурация.Заголовки, Конфигурация.ДополнительныеПараметры, Данные);
- Возврат ВыполнитьЗапросHTTP(КлиентHTTPПовтИсп.МетодPUT(), Конфигурация, Данные);
+ Возврат ВыполненныйЗапросHTTP(КлиентHTTPПовтИсп.МетодPUT(), Конфигурация, Данные);
КонецФункции
// Реализация PATCH
@@ -95,8 +99,8 @@
// Параметры:
// ИдентификаторРесурса - Строка, Структура - URI сервиса либо объект идентификатора ресурса
// Данные - ДвоичныеДанные - тело запроса
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
//
// Возвращаемое значение:
// ФиксированнаяСтруктура - объект ответа:
@@ -104,22 +108,23 @@
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * КонтекстВыполнения - Структура - служебный набор значений процесса выполнения запроса
//
Функция ИзменитьДвоичныеДанные(Знач ИдентификаторРесурса, Знач Данные, ДополнительныеПараметры = Неопределено, Знач ПараметрыЗапроса = Неопределено) Экспорт
Конфигурация = КонфигурацияЗапроса(ИдентификаторРесурса, ПараметрыЗапроса, ДополнительныеПараметры);
ДобавитьРазмерДанныхВЗаголовкиЗапроса(Конфигурация.Заголовки, Конфигурация.ДополнительныеПараметры, Данные);
- Возврат ВыполнитьЗапросHTTP(КлиентHTTPПовтИсп.МетодPATCH(), Конфигурация, Данные);
+ Возврат ВыполненныйЗапросHTTP(КлиентHTTPПовтИсп.МетодPATCH(), Конфигурация, Данные);
КонецФункции
// Реализация DELETE
//
// Параметры:
// ИдентификаторРесурса - Строка, Структура - URI сервиса либо объект идентификатора ресурса
-// Данные - Строка - тело запроса (необязательный)
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
+// Данные - Строка - тело запроса
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
//
// Возвращаемое значение:
// ФиксированнаяСтруктура - объект ответа:
@@ -127,6 +132,7 @@
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * КонтекстВыполнения - Структура - служебный набор значений процесса выполнения запроса
//
Функция Удалить(Знач ИдентификаторРесурса, Знач Данные = "", ДополнительныеПараметры = Неопределено, Знач ПараметрыЗапроса = Неопределено) Экспорт
Конфигурация = КонфигурацияЗапроса(ИдентификаторРесурса, ПараметрыЗапроса, ДополнительныеПараметры);
@@ -136,7 +142,7 @@
ДобавитьРазмерДанныхВЗаголовкиЗапроса(Конфигурация.Заголовки, Конфигурация.ДополнительныеПараметры, Данные);
КонецЕсли;
- Возврат ВыполнитьЗапросHTTP(КлиентHTTPПовтИсп.МетодDELETE(), Конфигурация, Данные);
+ Возврат ВыполненныйЗапросHTTP(КлиентHTTPПовтИсп.МетодDELETE(), Конфигурация, ПолучитьДвоичныеДанныеИзСтроки(Данные, КодировкаИзДопПараметров(Конфигурация.ДополнительныеПараметры)));
КонецФункции
#Область ДЕКОРАТОРЫ
@@ -145,8 +151,8 @@
// Параметры:
// ИдентификаторРесурса - Строка, Структура - URI сервиса либо объект идентификатора ресурса
// Данные - Строка - тело запроса
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
//
// Возвращаемое значение:
// ФиксированнаяСтруктура - объект ответа:
@@ -154,6 +160,7 @@
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * КонтекстВыполнения - Структура - служебный набор значений процесса выполнения запроса
//
Функция ОтправитьТекст(Знач ИдентификаторРесурса, Знач Данные, ДополнительныеПараметры = Неопределено, Знач ПараметрыЗапроса = Неопределено) Экспорт
Если ДополнительныеПараметры = Неопределено Тогда
@@ -180,8 +187,8 @@
// Параметры:
// ИдентификаторРесурса - Строка, Структура - URI сервиса либо объект идентификатора ресурса
// Данные - Файл - тело запроса
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
//
// Возвращаемое значение:
// ФиксированнаяСтруктура - объект ответа:
@@ -189,10 +196,11 @@
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * КонтекстВыполнения - Структура - служебный набор значений процесса выполнения запроса
//
Функция ОтправитьФайл(Знач ИдентификаторРесурса, Знач Данные, ДополнительныеПараметры = Неопределено, Знач ПараметрыЗапроса = Неопределено) Экспорт
Если НЕ Данные.Существует() Тогда
- ВызватьИсключение СтрШаблон("Файл %1 не существует", Данные.ПолноеИмя);
+ ВызватьИсключение СтрШаблон("Файл не обнаружен '%1'", Данные.ПолноеИмя);
КонецЕсли;
Если ДополнительныеПараметры = Неопределено Тогда
@@ -218,8 +226,8 @@
// Данные - Массив - поля HTML-формы. Элементы - Структура с ключами:
// * Ключ - Строка - имя поля
// * Значение - Строка - значение поля
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
//
// Возвращаемое значение:
// ФиксированнаяСтруктура - объект ответа:
@@ -227,6 +235,7 @@
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * КонтекстВыполнения - Структура - служебный набор значений процесса выполнения запроса
//
Функция ОтправитьДанныеHTMLФормы(Знач ИдентификаторРесурса, Знач Данные, ДополнительныеПараметры = Неопределено, Знач ПараметрыЗапроса = Неопределено) Экспорт
Если ДополнительныеПараметры = Неопределено Тогда
@@ -262,13 +271,13 @@
// Данные - Массив - тело запроса. Элементы - Структура с ключами:
// * Ключ - Строка - имя поля
// * Значение - Строка, Файл - значение поля
-// * ТипMIME - Строка - тип значения поля (необязательный)
-// * Файл - Структура (необязательный), ключи:
-// ** Имя - Строка - имя файла (необязательный),
-// ** ТипMIME - Строка - MIME-тип содержимого файла (необязательный),
-// ** Кодировка - Строка - кодировка файла (необязательный)
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
+// * ТипMIME - Строка - тип значения поля
+// * Файл - Структура, ключи:
+// ** Имя - Строка - имя файла,
+// ** ТипMIME - Строка - MIME-тип содержимого файла,
+// ** Кодировка - Строка - кодировка файла
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
//
// Возвращаемое значение:
// ФиксированнаяСтруктура - объект ответа:
@@ -276,6 +285,7 @@
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * КонтекстВыполнения - Структура - служебный набор значений процесса выполнения запроса
//
Функция ОтправитьДанныеФормы(Знач ИдентификаторРесурса, Знач Данные, ДополнительныеПараметры = Неопределено, Знач ПараметрыЗапроса = Неопределено) Экспорт
Если ДополнительныеПараметры = Неопределено Тогда
@@ -312,8 +322,8 @@
// Параметры:
// ИдентификаторРесурса - Строка, Структура - URI сервиса либо объект идентификатора ресурса
// Данные - Строка - тело запроса
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
//
// Возвращаемое значение:
// ФиксированнаяСтруктура - объект ответа:
@@ -321,6 +331,7 @@
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * КонтекстВыполнения - Структура - служебный набор значений процесса выполнения запроса
//
Функция ЗаписатьТекст(Знач ИдентификаторРесурса, Знач Данные, ДополнительныеПараметры = Неопределено, Знач ПараметрыЗапроса = Неопределено) Экспорт
Если ДополнительныеПараметры = Неопределено Тогда
@@ -347,8 +358,8 @@
// Параметры:
// ИдентификаторРесурса - Строка, Структура - URI сервиса либо объект идентификатора ресурса
// Данные - Файл - тело запроса
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
//
// Возвращаемое значение:
// ФиксированнаяСтруктура - объект ответа:
@@ -356,10 +367,11 @@
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * КонтекстВыполнения - Структура - служебный набор значений процесса выполнения запроса
//
Функция ЗаписатьФайл(Знач ИдентификаторРесурса, Знач Данные, ДополнительныеПараметры = Неопределено, Знач ПараметрыЗапроса = Неопределено) Экспорт
Если НЕ Данные.Существует() Тогда
- ВызватьИсключение СтрШаблон("Файл %1 не существует", Данные.ПолноеИмя);
+ ВызватьИсключение СтрШаблон("Файл не обнаружен '%1'", Данные.ПолноеИмя);
КонецЕсли;
Если ДополнительныеПараметры = Неопределено Тогда
@@ -383,8 +395,8 @@
// Параметры:
// ИдентификаторРесурса - Строка, Структура - URI сервиса либо объект идентификатора ресурса
// Данные - Строка - тело запроса
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
//
// Возвращаемое значение:
// ФиксированнаяСтруктура - объект ответа:
@@ -392,6 +404,7 @@
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * КонтекстВыполнения - Структура - служебный набор значений процесса выполнения запроса
//
Функция ИзменитьТекст(Знач ИдентификаторРесурса, Знач Данные, ДополнительныеПараметры = Неопределено, Знач ПараметрыЗапроса = Неопределено) Экспорт
Если ДополнительныеПараметры = Неопределено Тогда
@@ -418,8 +431,8 @@
// Параметры:
// ИдентификаторРесурса - Строка, Структура - URI сервиса либо объект идентификатора ресурса
// Данные - Файл - тело запроса
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
//
// Возвращаемое значение:
// ФиксированнаяСтруктура - объект ответа:
@@ -427,10 +440,11 @@
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * КонтекстВыполнения - Структура - служебный набор значений процесса выполнения запроса
//
Функция ИзменитьФайл(Знач ИдентификаторРесурса, Знач Данные, ДополнительныеПараметры = Неопределено, Знач ПараметрыЗапроса = Неопределено) Экспорт
Если НЕ Данные.Существует() Тогда
- ВызватьИсключение СтрШаблон("Файл %1 не существует", Данные.ПолноеИмя);
+ ВызватьИсключение СтрШаблон("Файл не обнаружен '%1'", Данные.ПолноеИмя);
КонецЕсли;
Если ДополнительныеПараметры = Неопределено Тогда
@@ -602,6 +616,20 @@
Возврат КлиентHTTPКлиентСервер;
КонецФункции
+// Отмена требования попытки преобразования тела полученного ответа
+//
+// Параметры:
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+//
+// Возвращаемое значение:
+// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
+//
+Функция ТелоОтветаКакДвоичныеДанные(ДополнительныеПараметры) Экспорт
+ ДополнительныеПараметры.Удалить("ПрочитатьТелоОтветаКак");
+
+ Возврат КлиентHTTPКлиентСервер;
+КонецФункции
+
// Требование попытки преобразования тела полученного ответа в текст
//
// Параметры:
@@ -758,6 +786,30 @@
Возврат КлиентHTTPКлиентСервер;
КонецФункции
+// Требование принудительно переключаться на метод GET для кодов перенаправления 301 и 302
+//
+// Параметры:
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// КакGET - Булево - установить переключение на GET
+//
+// Возвращаемое значение:
+// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
+//
+Функция ПеренаправленияКакGET(ДополнительныеПараметры, Знач КакGET = Истина) Экспорт
+ СессияАктивирована = ДополнительныеПараметры.Свойство("Сессия");
+ Если КакGET Тогда
+ Если НЕ СессияАктивирована Тогда
+ ИспользоватьСессию(ДополнительныеПараметры);
+ КонецЕсли;
+
+ ДополнительныеПараметры.Сессия.Вставить("ПеренаправлениеКакGET");
+ ИначеЕсли СессияАктивирована Тогда
+ ДополнительныеПараметры.Сессия.Удалить("ПеренаправлениеКакGET");
+ КонецЕсли;
+
+ Возврат КлиентHTTPКлиентСервер;
+КонецФункции
+
// Установка Basic-авторизации
//
// Параметры:
@@ -819,7 +871,65 @@
// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
//
Функция УстановитьBearerАвторизацию(ДополнительныеПараметры, Знач Токен) Экспорт
- ДополнительныеПараметры.Вставить("Аутентификация", ОбъектАутентификации("Bearer", Токен, ""));
+ ДополнительныеПараметры.Вставить("Аутентификация", ОбъектАутентификацииBearer(Токен));
+
+ Возврат КлиентHTTPКлиентСервер;
+КонецФункции
+
+// Установка AWS4-авторизации
+//
+// Параметры:
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// КлючДоступа - Строка - AWS ключ доступа
+// СекретныйКлюч - Строка - AWS секретный ключ
+// Регион - Строка - AWS регион получателя запроса
+// Сервис - Строка - AWS сервис получателя запроса
+//
+// Возвращаемое значение:
+// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
+//
+Функция УстановитьAWS4Авторизацию(ДополнительныеПараметры, Знач КлючДоступа, Знач СекретныйКлюч, Знач Регион = "", Знач Сервис = "") Экспорт
+ ДополнительныеПараметры.Вставить(
+ "Аутентификация",
+ ОбъектАутентификацииAWS4(КлючДоступа, СекретныйКлюч, СокрЛП(Регион), СокрЛП(Сервис))
+ );
+
+ Возврат КлиентHTTPКлиентСервер;
+КонецФункции
+
+// Установка Hawk-авторизации
+//
+// Параметры:
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// Идентификатор - Строка - ID аутентификации
+// Ключ - Строка - секретный ключ
+// Дополнение - Строка - (ext) специфические данные клиента
+// ИдентификаторПриложения - Строка - (app) идентификатор приложения
+// Делегирование - Строка - (dlg) выданный идентификатор приложения
+//
+// Возвращаемое значение:
+// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
+//
+Функция УстановитьHawkАвторизацию(ДополнительныеПараметры, Знач Идентификатор, Знач Ключ, Знач Дополнение = "", Знач ИдентификаторПриложения = "", Знач Делегирование = "") Экспорт
+ ДополнительныеПараметры.Вставить(
+ "Аутентификация",
+ ОбъектАутентификацииHawk(Идентификатор, Ключ, СокрЛП(Дополнение), СокрЛП(ИдентификаторПриложения), СокрЛП(Делегирование))
+ );
+
+ Возврат КлиентHTTPКлиентСервер;
+КонецФункции
+
+// Установка пользовательского значения заголовка "User-Agent"
+//
+// Параметры:
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// АгентПользователя - Строка - значение для заголовка User-Agent
+//
+// Возвращаемое значение:
+// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
+//
+Функция УстановитьАгентаПользователя(ДополнительныеПараметры, Знач АгентПользователя) Экспорт
+ ДополнительныеПараметры.Вставить("АгентПользователя", СокрЛП(АгентПользователя));
Возврат КлиентHTTPКлиентСервер;
КонецФункции
@@ -843,7 +953,7 @@
//
// Параметры:
// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
-// Кодировка - КодировкаТекста, Строка, Неопределено - кодировка (необязательный) - -
+// Кодировка - КодировкаТекста, Строка, Неопределено - кодировка
//
// Возвращаемое значение:
// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
@@ -1026,6 +1136,42 @@
Возврат КлиентHTTPКлиентСервер;
КонецФункции
+// Использовать файл клиентского сертификата OpenSSL (с приватным ключом) для установки защищённого соединения.
+// Допустимо применение форматов PEM и PKCS#12 (формат определяется по расширению имени файла).
+//
+// Параметры:
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ЗащищенноеСоединение - ЗащищенноеСоединениеOpenSSL - объект защищенного соединения OpenSSL
+// Сертификат - Файл - клиентский сертификат
+// Пароль - Строка - пароль файла клиентского сертификата
+//
+// Возвращаемое значение:
+// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
+//
+Функция ИспользоватьФайлСертификатаКлиента(ДополнительныеПараметры, Знач Сертификат, Знач Пароль = "") Экспорт
+ ДополнительныеПараметры.Вставить("СертификатК", Новый Структура("Тип, Файл, Пароль", "Файл", Сертификат, Пароль));
+
+ Возврат КлиентHTTPКлиентСервер;
+КонецФункции
+
+// Использовать файл сертификатов удостоверяющих центров OpenSSL.
+// Допустимо применение форматов PEM и PKCS#12 (формат определяется по расширению имени файла).
+//
+// Параметры:
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ЗащищенноеСоединение - ЗащищенноеСоединениеOpenSSL - объект защищенного соединения OpenSSL
+// СертификатыУЦ - Файл - файл сертификатов удостоверяющих центров
+// Пароль - Строка - пароль файла сертификатов удостоверяющих центров
+//
+// Возвращаемое значение:
+// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
+//
+Функция ИспользоватьФайлСертификатовУдостоверяющихЦентров(ДополнительныеПараметры, Знач СертификатыУЦ, Знач Пароль = "") Экспорт
+ ДополнительныеПараметры.Вставить("СертификатыУЦ", Новый Структура("Тип, Файл, Пароль", "Файл", СертификатыУЦ, Пароль));
+
+ Возврат КлиентHTTPКлиентСервер;
+КонецФункции
+
// Установка режима использования аутентификации NTLM или Negotiate
//
// Параметры:
@@ -1078,8 +1224,8 @@
// ПоляФормы - Массив - коллекция полей формы
// Ключ - Строка - наименование поля
// Значение - Строка - значение текстового поля
-// ТипMIME - Строка, Неопределено - MIME-тип (необязательный)
-// Кодировка - КодировкаТекста, Строка, Неопределено - кодировка текста поля формы (необязательный)
+// ТипMIME - Строка, Неопределено - MIME-тип
+// Кодировка - КодировкаТекста, Строка, Неопределено - кодировка текста поля формы
//
// Возвращаемое значение:
// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
@@ -1105,9 +1251,9 @@
// ПоляФормы - Массив - коллекция полей формы
// Ключ - Строка - наименование поля
// Значение - Файл - объект доступа к файлу
-// ИмяФайла - Строка, Неопределено - имя файла в поле формы (необязательный)
-// ТипMIME - Строка, Неопределено - MIME-тип содержимого файла (необязательный)
-// Кодировка - КодировкаТекста, Строка, Неопределено - кодировка содержимого файла (необязательный)
+// ИмяФайла - Строка, Неопределено - имя файла в поле формы
+// ТипMIME - Строка, Неопределено - MIME-тип содержимого файла
+// Кодировка - КодировкаТекста, Строка, Неопределено - кодировка содержимого файла
//
// Возвращаемое значение:
// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
@@ -1144,6 +1290,129 @@
Возврат КлиентHTTPКлиентСервер;
КонецФункции
+
+// Отмена требования повторять попытки выполнить запрос после неуспешного результата
+// Неуспешным считается вызов исключения и ответ с кодом состояния 5хх или каким-либо из определённых пользователем.
+// ВНИМАНИЕ! Неуспешный HTTP-запрос вызывает исключение, что отменит цепочку транзаций, в которой выполнялся запрос.
+//
+// Параметры:
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+//
+// Возвращаемое значение:
+// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
+//
+Функция РазовоеВыполнение(ДополнительныеПараметры) Экспорт
+ ДополнительныеПараметры.Удалить("ПовторноеВыполнение");
+
+ Возврат КлиентHTTPКлиентСервер;
+КонецФункции
+
+// Требование повторять попытки выполнить запрос после неуспешного результата через фиксированный интервал времени
+// Неуспешным считается вызов исключения и ответ с кодом состояния 5хх или каким-либо из определённых пользователем.
+//
+// Параметры:
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// Длительность - Число - длительность задержки между попытками в секундах
+// ПорогКоличестваПопыток - Число - максимальное количество неуспешных попыток выполнить HTTP-запрос
+// МаксимальнаяДлительность - Число - максимальная длительность паузы между попытками в секундах (ограничение фреймворка 3600)
+// КодыСостояния - Массив - коды состояния ответа (Число), при получении которых необходимо повторять попытки
+//
+// Возвращаемое значение:
+// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
+//
+Функция ФиксированоОтложенныеВыполнения(ДополнительныеПараметры, Знач Длительность = 1, Знач ПорогКоличестваПопыток = 9, Знач МаксимальнаяДлительность = 600, Знач КодыСостояния = Неопределено) Экспорт
+ МножествоКодов = Новый Соответствие;
+ Если КодыСостояния <> Неопределено Тогда
+ Для Каждого Код Из КодыСостояния Цикл
+ МножествоКодов.Вставить(Код, Истина);
+ КонецЦикла;
+ КонецЕсли;
+
+ ДополнительныеПараметры.Вставить("ПовторноеВыполнение", Новый Структура(
+ "Способ, Длительность, МаксимальнаяДлительность, ПорогКоличестваПопыток, КодыСостояния, ОсталосьПопыток, Ключ",
+ СпособБезУвеличения(),
+ ?(Длительность < 0, 0, Длительность),
+ ?(МаксимальнаяДлительность < 0, 0, МаксимальнаяДлительность),
+ КорректныйПорогКоличестваПопыток(ПорогКоличестваПопыток),
+ МножествоКодов
+ ));
+
+ Возврат КлиентHTTPКлиентСервер;
+КонецФункции
+
+// Требование повторять попытки выполнить запрос после неуспешного результата через линейно увеличивающийся интервал времени
+// Формула: НачальнаяДлительность + КоэфициентУвеличения * НачальнаяДлительность * (НомерПопытки - 1)
+// Неуспешным считается вызов исключения и ответ с кодом состояния 5хх или каким-либо из определённых пользователем.
+// ВНИМАНИЕ! Неуспешный HTTP-запрос вызывает исключение, что отменит цепочку транзаций, в которой выполнялся запрос.
+//
+// Параметры:
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// НачальнаяДлительность - Число - длительность паузы после первой попытки в секундах
+// КоэфициентУвеличения - Число - коэффициент увеличения длительности пауз
+// ПорогКоличестваПопыток - Число - максимальное количество неуспешных попыток выполнить HTTP-запрос
+// МаксимальнаяДлительность - Число - максимальная длительность паузы между попытками в секундах (ограничение фреймворка 3600)
+// КодыСостояния - Массив - коды состояния ответа (Число), при получении которых необходимо повторять попытки
+//
+// Возвращаемое значение:
+// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
+//
+Функция ЛинейноОтложенныеВыполнения(ДополнительныеПараметры, Знач НачальнаяДлительность = 1, Знач КоэфициентУвеличения = 1, Знач ПорогКоличестваПопыток = 9, Знач МаксимальнаяДлительность = 600, Знач КодыСостояния = Неопределено) Экспорт
+ МножествоКодов = Новый Соответствие;
+ Если КодыСостояния <> Неопределено Тогда
+ Для Каждого Код Из КодыСостояния Цикл
+ МножествоКодов.Вставить(Код, Истина);
+ КонецЦикла;
+ КонецЕсли;
+
+ ДополнительныеПараметры.Вставить("ПовторноеВыполнение", Новый Структура(
+ "Способ, НачальнаяДлительность, МаксимальнаяДлительность, КоэфициентУвеличения, ПорогКоличестваПопыток, КодыСостояния, ОсталосьПопыток, Ключ",
+ СпособУвеличенияЛинейно(),
+ ?(НачальнаяДлительность < 1, 1, НачальнаяДлительность),
+ ?(МаксимальнаяДлительность < 1, 1, МаксимальнаяДлительность),
+ ?(КоэфициентУвеличения < 0, 0, КоэфициентУвеличения),
+ КорректныйПорогКоличестваПопыток(ПорогКоличестваПопыток),
+ МножествоКодов
+ ));
+
+ Возврат КлиентHTTPКлиентСервер;
+КонецФункции
+
+// Требование повторять попытки выполнить запрос после неуспешного результата через экспоненциально увеличивающийся интервал времени
+// Формула: НачальнаяДлительность * Pow(КоэфициентУвеличения, НомерПопытки - 1)
+// Неуспешным считается вызов исключения и ответ с кодом состояния 5хх или каким-либо из определённых пользователем.
+// ВНИМАНИЕ! Неуспешный HTTP-запрос вызывает исключение, что отменит цепочку транзаций, в которой выполнялся запрос.
+//
+// Параметры:
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// НачальнаяДлительность - Число - длительность паузы после первой попытки в секундах
+// КоэфициентУвеличения - Число - коэффициент экспоненциального увеличения длительности пауз
+// ПорогКоличестваПопыток - Число - максимальное количество неуспешных попыток выполнить HTTP-запрос
+// МаксимальнаяДлительность - Число - максимальная длительность паузы между попытками в секундах (ограничение фреймворка 3600)
+// КодыСостояния - Массив - коды состояния ответа (Число), при получении которых необходимо повторять попытки
+//
+// Возвращаемое значение:
+// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
+//
+Функция ЭкспоненциальноОтложенныеВыполнения(ДополнительныеПараметры, Знач НачальнаяДлительность = 1, Знач КоэфициентУвеличения = 2, Знач ПорогКоличестваПопыток = 9, Знач МаксимальнаяДлительность = 3600, Знач КодыСостояния = Неопределено) Экспорт
+ МножествоКодов = Новый Соответствие;
+ Если КодыСостояния <> Неопределено Тогда
+ Для Каждого Код Из КодыСостояния Цикл
+ МножествоКодов.Вставить(Код, Истина);
+ КонецЦикла;
+ КонецЕсли;
+
+ ДополнительныеПараметры.Вставить("ПовторноеВыполнение", Новый Структура(
+ "Способ, НачальнаяДлительность, МаксимальнаяДлительность, КоэфициентУвеличения, ПорогКоличестваПопыток, КодыСостояния, ОсталосьПопыток, Ключ",
+ СпособУвеличенияЭкспоненциально(),
+ ?(НачальнаяДлительность < 1, 1, НачальнаяДлительность),
+ ?(МаксимальнаяДлительность < 1, 1, МаксимальнаяДлительность),
+ ?(КоэфициентУвеличения < 1, 1, КоэфициентУвеличения),
+ КорректныйПорогКоличестваПопыток(ПорогКоличестваПопыток),
+ МножествоКодов
+ ));
+
+ Возврат КлиентHTTPКлиентСервер;
+КонецФункции
#КонецОбласти
// Возвращает строку параметров URL из коллекции
@@ -1157,18 +1426,38 @@
Функция ПараметрыЗапросаСтрокой(Знач Параметры) Экспорт
фРезультат = Новый Массив;
+ ПараметрыИдентификатора = Новый Массив;
+ МножествоСтрок = Новый Соответствие;
Для Каждого КЗ Из Параметры Цикл
- ИмяПараметра = ФорматированноеИмяПараметраЗапроса(КЗ.Ключ);
- Если ПустаяСтрока(ИмяПараметра) Тогда
+ Параметр = Новый Структура("Ключ, Значение", КлиентHTTPСлужебный.ФорматированноеИмяПараметраЗапроса(КЗ.Ключ), "");
+ Если ПустаяСтрока(Параметр.Ключ) Тогда
+ Продолжить;
+ КонецЕсли;
+ МножествоСтрок.Вставить(Параметр.Ключ);
+ Если КЗ.Значение.Количество() = 0 Тогда
+ ПараметрыИдентификатора.Добавить(Параметр);
Продолжить;
КонецЕсли;
Для Каждого ЗначениеПараметра Из КЗ.Значение Цикл
- ФЗП = СокрЛП(ФорматированноеЗначениеПараметраЗапроса(ЗначениеПараметра));
- фРезультат.Добавить(ИмяПараметра + ?(ФЗП = "", "", "=") + ФЗП);
+ Параметр.Значение = КлиентHTTPСлужебный.ФорматированноеЗначениеПараметраЗапроса(ЗначениеПараметра);
+ Если Параметр.Значение <> "" Тогда
+ МножествоСтрок.Вставить(Параметр.Значение);
+ КонецЕсли;
+
+ ПараметрыИдентификатора.Добавить(Параметр);
КонецЦикла;
КонецЦикла;
+ МножествоСтрок = КлиентHTTPВызовСервера.КодированныеСтрокиURLвURL(МножествоСтрок);
+
+ Для Каждого Параметр Из ПараметрыИдентификатора Цикл
+ ИмяПараметра = МножествоСтрок.Получить(Параметр.Ключ);
+ ЗначениеПараметра = МножествоСтрок.Получить(Параметр.Значение);
+
+ фРезультат.Добавить(ИмяПараметра + ?(ЗначениеПараметра = "", "", "=") + ЗначениеПараметра);
+ КонецЦикла;
+
Возврат ?(фРезультат.Количество() = 0, "", "?" + СтрСоединить(фРезультат, "&"));
КонецФункции
@@ -1197,6 +1486,48 @@
ОбъединитьПеченье(КонфигурацияПриемник.Сессия.Печенье, КонфигурацияИсточник.Сессия.Печенье, Заменять);
КонецПроцедуры
+// Возвращает значение заголовка по имени
+//
+// Параметры:
+// ИмяЗаголовка - Строка - имя заголовка
+// Заголовки - Соответствие - коллекция заголовков
+//
+// Возвращаемое значение:
+// Строка, Неопределено - значение заголовка
+//
+Функция ЗначениеЗаголовка(Знач ИмяЗаголовка, Знач Заголовки) Экспорт
+ фРезультат = Неопределено;
+ ИмяЗаголовка = НРег(ИмяЗаголовка);
+
+ Для Каждого КЗ Из Заголовки Цикл
+ Если НРег(КЗ.Ключ) = ИмяЗаголовка Тогда
+ фРезультат = КЗ.Значение;
+ Прервать;
+ КонецЕсли;
+ КонецЦикла;
+
+ Возврат фРезультат;
+КонецФункции
+
+// Возвращает значение заголовка Cookie для идентификатора ресурса
+//
+// Параметры:
+// ИдентификаторРесурса - Строка, Структура - URI сервиса либо объект идентификатора ресурса
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+//
+// Возвращаемое значение:
+// Строка, Неопределено - значение заголовка Cookie
+//
+Функция ЗначениеЗаголовкаCookieРесурса(Знач ИдентификаторРесурса, Знач ДополнительныеПараметры) Экспорт
+ Если НЕ ДополнительныеПараметры.Свойство("Сессия") Тогда
+ Возврат Неопределено;
+ КонецЕсли;
+
+ ДанныеURI = СтруктураИдентификатораРесурса(ИдентификаторРесурса);
+
+ Возврат ЗначениеЗаголовкаCookie(ДанныеURI, ДополнительныеПараметры.Сессия);
+КонецФункции
+
// Возвращает MIME-тип из заголовков
//
// Параметры:
@@ -1206,7 +1537,7 @@
// Строка, Неопределено - значение заголовка Content-Type
//
Функция ТипMIMEИзЗаголовков(Знач Заголовки) Экспорт
- ТипКонтента = ЗначениеЗаголовка("Content-Type", Заголовки);
+ ТипКонтента = ЗначениеЗаголовка(КлиентHTTPПовтИсп.ЗаголовокТипКонтента(), Заголовки);
Если ТипКонтента = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
@@ -1225,7 +1556,7 @@
// Строка, Неопределено - значение charset заголовка Content-Type
//
Функция КодировкаИзЗаголовков(Знач Заголовки) Экспорт
- ТипКонтента = ЗначениеЗаголовка("Content-Type", Заголовки);
+ ТипКонтента = ЗначениеЗаголовка(КлиентHTTPПовтИсп.ЗаголовокТипКонтента(), Заголовки);
Если ТипКонтента = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
@@ -1234,30 +1565,92 @@
Возврат ?(ПозицияКодировки = 0, Неопределено, Сред(ТипКонтента, ПозицияКодировки + 8));
КонецФункции
+
+// Возвращает результат валидации ответа сервера по указанному заголовку (Hawk аутентификация)
+//
+// Параметры:
+// Ответ - Структура - объект ответа сервера
+// ИмяЗаголовка - Строка - имя заголовка ответа сервера с данными Hawk аутентификации
+// ОписаниеОшибки - Строка - описание ошибки валидации ответа
+//
+// Возвращаемое значение:
+// Булево - результат валидации ответа
+//
+Функция ОтветСЗаголовкомHawkКорректен(Знач Ответ, Знач ИмяЗаголовка, ОписаниеОшибки) Экспорт
+ Если НЕ Ответ.КонтекстВыполнения.Свойство("АутентификацияHawk") Тогда
+ ОписаниеОшибки = "Отсутствует контекст Hawk аутентификации";
+ Возврат Ложь;
+ КонецЕсли;
+ Если Ответ.КодСостояния < 200 ИЛИ Ответ.КодСостояния > 299 Тогда
+ Возврат Истина;
+ КонецЕсли;
+ Если ТипЗнч(Ответ.Тело) <> Тип("ДвоичныеДанные") Тогда
+ ОписаниеОшибки = "Валидация доступна только для ответа с телом типа ДвоичныеДанные";
+ Возврат Ложь;
+ КонецЕсли;
+
+ ЗначениеЗаголовкаHawk = ЗначениеЗаголовка(ИмяЗаголовка, Ответ.Заголовки);
+ Если ЗначениеЗаголовкаHawk = Неопределено Тогда
+ ОписаниеОшибки = "В ответе отсутствует заголовок Hawk аутентификации";
+ Возврат Ложь;
+ КонецЕсли;
+
+ Данные = Новый Структура(
+ "Тело, ТипMIME",
+ Ответ.Тело,
+ ЗначениеЗаголовка(КлиентHTTPПовтИсп.ЗаголовокТипКонтента(), Ответ.Заголовки)
+ );
+
+ Возврат КлиентHTTPВызовСервера.ОтветСЗаголовкомHawkКорректен(
+ ЗначениеЗаголовкаHawk,
+ Ответ.КонтекстВыполнения.АутентификацияHawk,
+ ПоместитьВоВременноеХранилище(Данные, Новый УникальныйИдентификатор),
+ ОписаниеОшибки
+ );
+КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
-Функция ВыполнитьЗапросHTTP(Знач Метод, Знач Конфигурация, Знач Данные = Неопределено, Знач НомерПеренаправления = 0)
+Функция ВыполненныйЗапросHTTP(Знач Метод, Знач Конфигурация, Знач Данные = Неопределено, Знач НомерПеренаправления = 0)
+ Контекст = КонтекстВыполнения(Метод, Конфигурация, НомерПеренаправления, Данные);
+
+ ПрименитьAWS4Аутентификацию(Метод, Данные, Конфигурация);
+ ПрименитьHawkАутентификацию(Метод, Данные, Конфигурация, Контекст);
+
Соединение = НовоеHTTPСоединениеСПереиспользованием(Конфигурация);
- Запрос = Новый HTTPЗапрос(АдресРесурсаЗапроса(Конфигурация), Конфигурация.Заголовки);
+ Запрос = Новый HTTPЗапрос(Контекст.Значения.АдресРесурса, Конфигурация.Заголовки);
- Если Метод = КлиентHTTPПовтИсп.МетодPOST() ИЛИ Метод = КлиентHTTPПовтИсп.МетодPUT() ИЛИ Метод = КлиентHTTPПовтИсп.МетодDELETE() Тогда
- Если ТипЗнч(Данные) = Тип("Строка") Тогда
- Запрос.УстановитьТелоИзСтроки(Данные, КодировкаИзДопПараметров(Конфигурация.ДополнительныеПараметры));
- Иначе
- Запрос.УстановитьТелоИзДвоичныхДанных(Данные);
- КонецЕсли;
+ Если МетодПодразумеваетТелоЗапроса(Метод) Тогда
+ Запрос.УстановитьТелоИзДвоичныхДанных(Данные);
КонецЕсли;
+ Попытка
+ Ответ = Соединение.ВызватьHTTPМетод(Метод, Запрос, ИмяВыходногоФайлаИзДопПараметров(Конфигурация.ДополнительныеПараметры));
+ Исключение
+ Контекст.Вставить("ИнформацияОбОшибке", ИнформацияОбОшибке());
+ Ответ = Неопределено;
+ КонецПопытки;
+
Возврат ОбработанныйОтвет(
- Соединение.ВызватьHTTPМетод(Метод, Запрос, ИмяВыходногоФайлаИзДопПараметров(Конфигурация.ДополнительныеПараметры)),
+ Ответ,
Конфигурация,
- КонтекстВыполнения(Метод, НомерПеренаправления, Данные)
+ Контекст
);
КонецФункции
-Функция КонтекстВыполнения(Знач Метод, Знач НомерПеренаправления, Знач Данные)
- Возврат Новый ФиксированнаяСтруктура("Метод, НомерПеренаправления, Данные", Метод, НомерПеренаправления, Данные);
+Функция КонтекстВыполнения(Знач Метод, Знач Конфигурация, Знач НомерПеренаправления, Знач Данные)
+ Возврат Новый Структура(
+ "Метод, НомерПеренаправления, Данные, Значения",
+ Метод,
+ НомерПеренаправления,
+ Данные,
+ Новый Структура( // Значения
+ "Схема, Хост, АдресРесурса",
+ СхемаЗапроса(Конфигурация.ДанныеURI),
+ Конфигурация.Заголовки.Получить(КлиентHTTPПовтИсп.ЗаголовокХост()),
+ АдресРесурсаЗапроса(Конфигурация)
+ )
+ );
КонецФункции
Функция КонфигурацияЗапроса(Знач ИдентификаторРесурса, Знач ПараметрыЗапроса = Неопределено, ДополнительныеПараметры = Неопределено)
@@ -1269,10 +1662,55 @@
КонецЕсли;
ДанныеURI = СтруктураИдентификатораРесурса(ИдентификаторРесурса);
- Параметры = ОбъединениеПараметровЗапросаВСтроку(ДанныеURI.Параметры, ПараметрыЗапроса);
+ Параметры = ОбъединениеПараметровЗапроса(ДанныеURI.Параметры, ПараметрыЗапроса);
+ ПараметрыСтрокой = ПараметрыЗапросаСтрокой(Параметры);
Заголовки = ЗаголовкиЗапроса(ДанныеURI, ДополнительныеПараметры);
- Возврат Новый Структура("ДанныеURI, Параметры, Заголовки, ДополнительныеПараметры", ДанныеURI, Параметры, Заголовки, ДополнительныеПараметры);
+ СброситьСостояниеПовторногоВыполнения(ДополнительныеПараметры);
+
+ Возврат Новый Структура("ДанныеURI, Параметры, ПараметрыСтрокой, Заголовки, ДополнительныеПараметры", ДанныеURI, Параметры, ПараметрыСтрокой, Заголовки, ДополнительныеПараметры);
+КонецФункции
+
+Функция СхемаЗапроса(Знач ДанныеURI)
+ Возврат ?(ДанныеURI.ЗащищенноеСоединение, "https://", "http://");
+КонецФункции
+
+Функция МетодПодразумеваетТелоЗапроса(Знач Метод)
+ Возврат Метод = КлиентHTTPПовтИсп.МетодPOST()
+ ИЛИ Метод = КлиентHTTPПовтИсп.МетодPUT()
+ ИЛИ Метод = КлиентHTTPПовтИсп.МетодDELETE()
+ ИЛИ Метод = КлиентHTTPПовтИсп.МетодPATCH();
+КонецФункции
+
+Функция СоставляющиеАдресаРесурса(Знач АдресРесурса)
+ фРезультат = Новый Структура("Путь, Параметры, Фрагмент", "/", НовыеПараметрыЗапроса(), "");
+
+ АдресРесурса = СокрЛП(АдресРесурса);
+ Если АдресРесурса = "" ИЛИ АдресРесурса = "/" Тогда
+ Возврат фРезультат;
+ КонецЕсли;
+ Если НЕ СтрНачинаетсяС(АдресРесурса, "/") Тогда
+ АдресРесурса = "/" + АдресРесурса;
+ КонецЕсли;
+
+ ДлинаАдресаРесурса = СтрДлина(АдресРесурса);
+ ПозицияОкончанияПути = ДлинаАдресаРесурса;
+ ПозицияСимволаПараметров = СтрНайти(АдресРесурса, "?");
+ ПозицияСимволаФрагмента = СтрНайти(АдресРесурса, "#", , ?(ПозицияСимволаПараметров = 0, 1, ПозицияСимволаПараметров));
+ ПозицияОкончанияПути = ?(ПозицияСимволаПараметров = 0, ПозицияСимволаФрагмента, ПозицияСимволаПараметров);
+
+ фРезультат.Путь = Лев(
+ АдресРесурса,
+ ?(
+ ПозицияОкончанияПути = 0,
+ ДлинаАдресаРесурса,
+ ПозицияОкончанияПути - 1
+ )
+ );
+ фРезультат.Параметры = ПараметрыИдентификатора(АдресРесурса, ПозицияСимволаПараметров, ПозицияСимволаФрагмента);
+ фРезультат.Фрагмент = ?(ПозицияСимволаФрагмента = 0, "", Сред(АдресРесурса, ПозицияСимволаФрагмента + 1));
+
+ Возврат фРезультат;
КонецФункции
Функция ДлинаСхемыИдентификатораРесурса(ДанныеURI, Знач ИдентификаторРесурса)
@@ -1292,12 +1730,16 @@
Возврат фРезультат;
КонецФункции
-Процедура РазобратьОснованиеИдентификатораРесурса(ДанныеURI, Знач ИдентификаторРесурса, Знач ПозицияНачала, ПозицияОкончания)
+Процедура РазобратьОснованиеИдентификатораРесурса(ДанныеURI, Знач ИдентификаторРесурса, Знач ПозицияНачала, ПозицияПараметров, ПозицияФрагмента)
ОписаниеТипаЧисло = Новый ОписаниеТипов("Число");
ДлинаИдентификатораРесурса = СтрДлина(ИдентификаторРесурса);
ПозицияНачалаАдресаРесурса = СтрНайти(ИдентификаторРесурса, "/", , ПозицияНачала);
- ПозицияОкончания = СтрНайти(ИдентификаторРесурса, "?", , ПозицияНачала);
+ ПозицияПоиска = ?(ПозицияНачалаАдресаРесурса = 0, ПозицияНачала, ПозицияНачалаАдресаРесурса);
+ ПозицияПараметров = СтрНайти(ИдентификаторРесурса, "?", , ПозицияПоиска);
+ ПозицияПоиска = ?(ПозицияПараметров = 0, ПозицияПоиска, ПозицияПараметров);
+ ПозицияФрагмента = СтрНайти(ИдентификаторРесурса, "#", , ПозицияПоиска);
+ ПозицияОкончания = ?(ПозицияПараметров = 0, ПозицияФрагмента, ПозицияПараметров);
Обращение = Сред(
ИдентификаторРесурса,
@@ -1318,15 +1760,15 @@
Если ПозицияРазделителяАвторизации = 0 Тогда
ПозицияРазделителяАвторизации = ДлинаАвторизации + 1;
КонецЕсли;
+ ЗакодированныйПользователь = СокрЛП(Лев(Авторизация, ПозицияРазделителяАвторизации - 1));
+ ЗакодированныйПароль = Прав(Авторизация, ДлинаАвторизации - ПозицияРазделителяАвторизации);
+ МножествоСтрок = Новый Соответствие;
+ МножествоСтрок.Вставить(ЗакодированныйПользователь);
+ МножествоСтрок.Вставить(ЗакодированныйПароль);
- ЗакодированныеДанные = Новый Структура("Пользователь, Пароль");
- ЗакодированныеДанные.Пользователь = СокрЛП(Лев(Авторизация, ПозицияРазделителяАвторизации - 1));
- ЗакодированныеДанные.Пароль = Прав(Авторизация, ДлинаАвторизации - ПозицияРазделителяАвторизации);
-
- РаскодированныеДанные = КлиентHTTPВызовСервера.РаскодированныеСтроки(ЗакодированныеДанные);
-
- ДанныеURI.Пользователь = РаскодированныеДанные.Пользователь;
- ДанныеURI.Пароль = РаскодированныеДанные.Пароль;
+ МножествоСтрок = КлиентHTTPВызовСервера.РаскодированныеСтрокиURLвURL(МножествоСтрок);
+ ДанныеURI.Пользователь = МножествоСтрок.Получить(ЗакодированныйПользователь);
+ ДанныеURI.Пароль = МножествоСтрок.Получить(ЗакодированныйПароль);
КонецЕсли;
ИмяХоста = Прав(Обращение, ДлинаОбращения - ПозицияПослеАвторизации);
@@ -1347,7 +1789,7 @@
ДанныеURI.Сервер = ?(ПозицияПорта = 0, ИмяХоста, Лев(ИмяХоста, ПозицияПорта - 1));
Если ПозицияНачалаАдресаРесурса > 0 Тогда
- ДанныеURI.АдресРесурса = Сред(
+ ДанныеURI.Путь = Сред(
ИдентификаторРесурса,
ПозицияНачалаАдресаРесурса,
?(
@@ -1359,17 +1801,27 @@
КонецЕсли;
КонецПроцедуры
-Функция ПараметрыИдентификатора(Знач ИдентификаторРесурса, Знач ПозицияНачала) Экспорт
+Функция ПараметрыИдентификатора(Знач ИдентификаторРесурса, Знач ПозицияНачала, Знач ПозицияОкончания)
фРезультат = НовыеПараметрыЗапроса();
+ ДлинаИдентификатораРесурса = СтрДлина(ИдентификаторРесурса);
ПараметрыСтрока = ?(
- ПозицияНачала = 0,
+ ПозицияНачала = 0 ИЛИ ПозицияНачала = ДлинаИдентификатораРесурса,
"",
- Сред(ИдентификаторРесурса, ПозицияНачала + 1)
+ Сред(
+ ИдентификаторРесурса,
+ ПозицияНачала + 1,
+ ?(
+ ПозицияОкончания = 0,
+ ДлинаИдентификатораРесурса,
+ ПозицияОкончания - 1
+ ) - ПозицияНачала
+ )
);
- Параметры = СтрРазделить(ПараметрыСтрока, "&", Ложь);
- Для Каждого Параметр Из Параметры Цикл
+ Параметры = Новый Массив;
+ МножествоСтрок = Новый Соответствие;
+ Для Каждого Параметр Из СтрРазделить(ПараметрыСтрока, "&", Ложь) Цикл
ПозицияРазделителя = СтрНайти(Параметр, "=");
Если ПозицияРазделителя = 0 Тогда
ПозицияРазделителя = СтрДлина(Параметр) + 1;
@@ -1382,6 +1834,17 @@
ЗначениеПараметра = Сред(Параметр, ПозицияРазделителя + 1);
+ Параметры.Добавить(Новый Структура("Ключ, Значение", ИмяПараметра, ЗначениеПараметра));
+ МножествоСтрок.Вставить(ИмяПараметра);
+ МножествоСтрок.Вставить(ЗначениеПараметра);
+ КонецЦикла;
+
+ МножествоСтрок = КлиентHTTPВызовСервера.РаскодированныеСтрокиURLвURL(МножествоСтрок);
+
+ Для Каждого Параметр Из Параметры Цикл
+ ИмяПараметра = МножествоСтрок.Получить(Параметр.Ключ);
+ ЗначениеПараметра = МножествоСтрок.Получить(Параметр.Значение);
+
ДобавитьПараметр(фРезультат, ИмяПараметра, ЗначениеПараметра);
КонецЦикла;
@@ -1390,34 +1853,39 @@
Функция СтруктураИдентификатораРесурса(Знач ИдентификаторРесурса)
фРезультат = Новый Структура(
- "Сервер, АдресРесурса, Пользователь, Пароль, Порт, ЗащищенноеСоединение, Параметры",
+ "Сервер, Путь, Пользователь, Пароль, Порт, ЗащищенноеСоединение, Параметры, Фрагмент",
"", // Сервер
- "/", // АдресРесурса
+ "/", // Путь
"", // Пользователь
"", // Пароль
80, // Порт
Ложь, // ЗащищенноеСоединение
- Неопределено // Параметры
+ Неопределено, // Параметры
+ "" // Фрагмент
);
Если ТипЗнч(ИдентификаторРесурса) = Тип("Структура") Тогда
+ АдресРесурса = СоставляющиеАдресаРесурса(ИдентификаторРесурса.АдресРесурса);
фРезультат.Сервер = ИдентификаторРесурса.Сервер;
- фРезультат.АдресРесурса = ИдентификаторРесурса.АдресРесурса;
+ фРезультат.Путь = АдресРесурса.Путь;
фРезультат.Порт = ИдентификаторРесурса.Порт;
- фРезультат.Параметры = НовыеПараметрыЗапроса();
+ фРезультат.Параметры = АдресРесурса.Параметры;
фРезультат.ЗащищенноеСоединение = ИдентификаторРесурса.ЗащищенноеСоединение;
фРезультат.Пользователь = ИдентификаторРесурса.Пользователь;
фРезультат.Пароль = ИдентификаторРесурса.Пароль;
+ фРезультат.Фрагмент = АдресРесурса.Фрагмент;
Возврат фРезультат;
КонецЕсли;
ПозицияНачалаПоиска = ДлинаСхемыИдентификатораРесурса(фРезультат, ИдентификаторРесурса);
- ПозицияНачалаСтрокиПараметров = 0;
- РазобратьОснованиеИдентификатораРесурса(фРезультат, ИдентификаторРесурса, ПозицияНачалаПоиска, ПозицияНачалаСтрокиПараметров);
+ ПозицияСимволаПараметров = 0;
+ ПозицияСимволаФрагмента = 0;
+ РазобратьОснованиеИдентификатораРесурса(фРезультат, ИдентификаторРесурса, ПозицияНачалаПоиска, ПозицияСимволаПараметров, ПозицияСимволаФрагмента);
- фРезультат.Параметры = ПараметрыИдентификатора(ИдентификаторРесурса, ПозицияНачалаСтрокиПараметров);
+ фРезультат.Параметры = ПараметрыИдентификатора(ИдентификаторРесурса, ПозицияСимволаПараметров, ПозицияСимволаФрагмента);
+ фРезультат.Фрагмент = ?(ПозицияСимволаФрагмента = 0, "", Сред(ИдентификаторРесурса, ПозицияСимволаФрагмента + 1));
Возврат фРезультат;
КонецФункции
@@ -1439,14 +1907,31 @@
КонецФункции
Функция НовоеHTTPСоединение(Знач ДанныеURI, Знач ДополнительныеПараметры)
+ Перем СертификатК, СертификатыУЦ;
+
КонфигурацияСоединения = Новый Структура(
"Сервер, Порт",
ДанныеURI.Сервер,
?(ДополнительныеПараметры.Свойство("Порт"), ДополнительныеПараметры.Порт, ДанныеURI.Порт)
);
+ Если ДополнительныеПараметры.Свойство("СертификатК") Тогда
+ СертификатК = Новый СертификатКлиентаФайл(
+ ДополнительныеПараметры.СертификатК.Файл.ПолноеИмя,
+ ДополнительныеПараметры.СертификатК.Пароль
+ );
+ КонецЕсли;
+ Если ДополнительныеПараметры.Свойство("СертификатыУЦ") Тогда
+ СертификатыУЦ = Новый СертификатыУдостоверяющихЦентровФайл(
+ ДополнительныеПараметры.СертификатыУЦ.Файл.ПолноеИмя,
+ ДополнительныеПараметры.СертификатыУЦ.Пароль
+ );
+ КонецЕсли;
+
Если ДополнительныеПараметры.Свойство("ЗащищенноеСоединение") Тогда
КонфигурацияСоединения.Вставить("ЗащищенноеСоединение", ДополнительныеПараметры.ЗащищенноеСоединение);
+ ИначеЕсли СертификатК <> Неопределено Тогда
+ КонфигурацияСоединения.Вставить("ЗащищенноеСоединение", Новый ЗащищенноеСоединениеOpenSSL(СертификатК, СертификатыУЦ));
ИначеЕсли ДанныеURI.ЗащищенноеСоединение Тогда
КонфигурацияСоединения.Вставить("ЗащищенноеСоединение", Новый ЗащищенноеСоединениеOpenSSL);
КонецЕсли;
@@ -1474,18 +1959,18 @@
);
КонецФункции
-Функция ОбъединениеПараметровЗапросаВСтроку(Знач ПараметрыURI, Знач ПараметрыЗапроса)
- МножествоПараметров = Новый Соответствие;
+Функция ОбъединениеПараметровЗапроса(Знач ПараметрыURI, Знач ПараметрыЗапроса)
+ фРезультат = Новый Соответствие;
Для Каждого КЗ Из ПараметрыURI Цикл
- МножествоПараметров.Вставить(КЗ.Ключ, КЗ.Значение);
+ фРезультат.Вставить(КЗ.Ключ, КЗ.Значение);
КонецЦикла;
Для Каждого КЗ Из ПараметрыЗапроса Цикл
- МножествоПараметров.Вставить(КЗ.Ключ, КЗ.Значение);
+ фРезультат.Вставить(КЗ.Ключ, КЗ.Значение);
КонецЦикла;
- Возврат ПараметрыЗапросаСтрокой(МножествоПараметров);
+ Возврат фРезультат;
КонецФункции
Функция ЗаголовкиЗапроса(Знач ДанныеURI, ДополнительныеПараметры)
@@ -1501,6 +1986,8 @@
КонецЦикла;
КонецЕсли;
+ ДобавитьХостВЗаголовкиЗапроса(фРезультат, ДанныеURI);
+ ДобавитьАгентаПользователяВЗаголовкиЗапроса(фРезультат, ДополнительныеПараметры);
ДобавитьТипКонтентаВЗаголовкиЗапроса(фРезультат, ДополнительныеПараметры);
ДобавитьКодировкуВЗаголовкиЗапроса(фРезультат, ДополнительныеПараметры);
ДобавитьРазделительПолейФормыВЗаголовкиЗапроса(фРезультат, ДополнительныеПараметры);
@@ -1520,23 +2007,47 @@
Возврат ?(ДополнительныеПараметры.Свойство("ИмяВыходногоФайла"), ДополнительныеПараметры.ИмяВыходногоФайла, "");
КонецФункции
+Процедура ДобавитьХостВЗаголовкиЗапроса(Заголовки, Знач ДанныеURI)
+ Хост = КлиентHTTPСлужебный.НормализованныйАдресСервера(ДанныеURI.Сервер);
+
+ Заголовки.Вставить(КлиентHTTPПовтИсп.ЗаголовокХост(), ?(
+ ЗначениеЗаполнено(ДанныеURI.Порт)
+ И (ДанныеURI.ЗащищенноеСоединение И ДанныеURI.Порт <> 443
+ ИЛИ НЕ ДанныеURI.ЗащищенноеСоединение И ДанныеURI.Порт <> 80),
+ СтрШаблон("%1:%2", Хост, Формат(ДанныеURI.Порт, "ЧГ=")),
+ Хост
+ ));
+КонецПроцедуры
+
+Процедура ДобавитьАгентаПользователяВЗаголовкиЗапроса(Заголовки, Знач ДополнительныеПараметры)
+ Перем АгентПользователя;
+
+ ДополнительныеПараметры.Свойство("АгентПользователя", АгентПользователя);
+ Если ЗначениеЗаполнено(АгентПользователя) Тогда
+ Заголовки.Вставить(КлиентHTTPПовтИсп.ЗаголовокАгентПользователя(), АгентПользователя);
+ КонецЕсли;
+КонецПроцедуры
+
Процедура ДобавитьТипКонтентаВЗаголовкиЗапроса(Заголовки, Знач ДополнительныеПараметры)
Если ДополнительныеПараметры.Свойство("ТипMIME") Тогда
- Заголовки.Вставить("Content-Type", ДополнительныеПараметры.ТипMIME);
+ Заголовки.Вставить(КлиентHTTPПовтИсп.ЗаголовокТипКонтента(), ДополнительныеПараметры.ТипMIME);
КонецЕсли;
КонецПроцедуры
Процедура ДобавитьКодировкуВЗаголовкиЗапроса(Заголовки, Знач ДополнительныеПараметры)
- ТекущееЗначение = Заголовки.Получить("Content-Type");
+ ТекущееЗначение = Заголовки.Получить(КлиентHTTPПовтИсп.ЗаголовокТипКонтента());
Если ДополнительныеПараметры.Свойство("Кодировка") И ТекущееЗначение <> Неопределено Тогда
- Заголовки.Вставить("Content-Type", ТекущееЗначение + "; charset=" + КодировкаИзДопПараметров(ДополнительныеПараметры));
+ Заголовки.Вставить(
+ КлиентHTTPПовтИсп.ЗаголовокТипКонтента(),
+ ТекущееЗначение + "; charset=" + КодировкаИзДопПараметров(ДополнительныеПараметры)
+ );
КонецЕсли;
КонецПроцедуры
Процедура ДобавитьСжатиеВЗаголовкиЗапроса(Заголовки, Знач ДополнительныеПараметры)
Если ДополнительныеПараметры.Свойство("СжатиеОтвета") Тогда
- Заголовки.Вставить("Accept-Encoding", ДополнительныеПараметры.СжатиеОтвета);
+ Заголовки.Вставить(КлиентHTTPПовтИсп.ЗаголовокДопустимыеСпособыКодированияОтвета(), ДополнительныеПараметры.СжатиеОтвета);
КонецЕсли;
КонецПроцедуры
@@ -1545,11 +2056,9 @@
Возврат;
КонецЕсли;
- Если ДополнительныеПараметры.Сессия.Свойство("Печенье") Тогда
- Печенье = ПеченьеДляURI(ДанныеURI, ДополнительныеПараметры.Сессия.Печенье);
- Если ЗначениеЗаполнено(Печенье) Тогда
- Заголовки.Вставить("Cookie", СтрСоединить(Печенье, "; "));
- КонецЕсли;
+ Значение = ЗначениеЗаголовкаCookie(ДанныеURI, ДополнительныеПараметры.Сессия);
+ Если ЗначениеЗаполнено(Значение) Тогда
+ Заголовки.Вставить(КлиентHTTPПовтИсп.ЗаголовокПеченье(), Значение);
КонецЕсли;
КонецПроцедуры
@@ -1568,6 +2077,10 @@
ДополнительныеПараметры.Вставить("АвторизоватьсяDigest");
ИначеЕсли ТипАутентификации = "Bearer" Тогда
ДобавитьBearerАутентификациюВЗаголовкиЗапроса(Заголовки, ДополнительныеПараметры.Аутентификация);
+ ИначеЕсли ТипАутентификации = "AWS4" Тогда
+ ЗарегистрироватьAWS4Аутентификацию(ДополнительныеПараметры);
+ ИначеЕсли ТипАутентификации = "Hawk" Тогда
+ ЗарегистрироватьHawkАутентификацию(ДополнительныеПараметры);
Иначе
ВызватьИсключение СтрШаблон("Неизвестный тип аутентификации: %1", ТипАутентификации);
КонецЕсли;
@@ -1576,7 +2089,7 @@
Процедура ДобавитьBasicАутентификациюВЗаголовкиЗапроса(Заголовки, Знач ДанныеАутентификации)
СтрокаАутентификации = КлиентHTTPСлужебный.СтрокаBasicАвторизации(ДанныеАутентификации.Пользователь, ДанныеАутентификации.Пароль);
- Заголовки.Вставить("Authorization", "Basic " + СтрокаАутентификации);
+ Заголовки.Вставить(КлиентHTTPПовтИсп.ЗаголовокТипАутентификации(), "Basic " + СтрокаАутентификации);
КонецПроцедуры
Процедура УстановитьNTLMАутентификацию(ДополнительныеПараметры, Знач ДанныеАутентификации)
@@ -1586,23 +2099,82 @@
КонецПроцедуры
Процедура ДобавитьBearerАутентификациюВЗаголовкиЗапроса(Заголовки, Знач ДанныеАутентификации)
- Заголовки.Вставить("Authorization", "Bearer " + ДанныеАутентификации.Пользователь);
+ Заголовки.Вставить(КлиентHTTPПовтИсп.ЗаголовокТипАутентификации(), "Bearer " + ДанныеАутентификации.Токен);
+КонецПроцедуры
+
+Процедура ЗарегистрироватьAWS4Аутентификацию(ДополнительныеПараметры)
+ ДополнительныеПараметры.Вставить("АвторизоватьсяAWS4", ДополнительныеПараметры.Аутентификация);
КонецПроцедуры
+Процедура ЗарегистрироватьHawkАутентификацию(ДополнительныеПараметры)
+ ДополнительныеПараметры.Вставить("АвторизоватьсяHawk", ДополнительныеПараметры.Аутентификация);
+КонецПроцедуры
+
+Процедура ПрименитьAWS4Аутентификацию(Знач Метод, Знач Данные, Конфигурация)
+ Если НЕ Конфигурация.ДополнительныеПараметры.Свойство("АвторизоватьсяAWS4") Тогда
+ Возврат;
+ КонецЕсли;
+
+ ДанныеАдресВХ = ПоместитьВоВременноеХранилище(?(Данные = Неопределено, "", Данные), Новый УникальныйИдентификатор);
+ Для Каждого Заголовок Из КлиентHTTPВызовСервера.ЗаголовкиAWS4(Метод, Конфигурация, ДанныеАдресВХ) Цикл
+ Конфигурация.Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
+ КонецЦикла;
+КонецПроцедуры
+
+Процедура ПрименитьHawkАутентификацию(Знач Метод, Знач Данные, Конфигурация, Контекст)
+ Если НЕ Конфигурация.ДополнительныеПараметры.Свойство("АвторизоватьсяHawk") Тогда
+ Возврат;
+ КонецЕсли;
+
+ ДанныеАдресВХ = ?(
+ Данные = Неопределено,
+ Неопределено,
+ ПоместитьВоВременноеХранилище(Данные, Новый УникальныйИдентификатор)
+ );
+
+ ЗначениеЗаголовкаHawk = КлиентHTTPВызовСервера.ЗаголовокHawk(Метод, Конфигурация, ДанныеАдресВХ);
+ Конфигурация.Заголовки.Вставить(КлиентHTTPПовтИсп.ЗаголовокТипАутентификации(), ЗначениеЗаголовкаHawk);
+
+ Контекст.Значения.Вставить("АутентификацияHawk", КонтекстАутентификацииHawk(Контекст, Конфигурация));
+КонецПроцедуры
+
+Функция КонтекстАутентификацииHawk(Контекст, Конфигурация)
+ Аутентификация = Конфигурация.ДополнительныеПараметры.АвторизоватьсяHawk;
+ Возврат Новый ФиксированнаяСтруктура(
+ "Ключ, Дополнение, ИдентификаторПриложения, Делегирование, Метод, Хост, Порт, Путь, ВременнаяМетка, РазовоеСлово",
+ Аутентификация.Ключ,
+ Аутентификация.Дополнение,
+ Аутентификация.ИдентификаторПриложения,
+ Аутентификация.Делегирование,
+ Контекст.Метод,
+ Конфигурация.ДанныеURI.Сервер,
+ Конфигурация.ДанныеURI.Порт,
+ Конфигурация.ДанныеURI.Путь,
+ Аутентификация.ВременнаяМетка,
+ Аутентификация.РазовоеСлово
+ );
+КонецФункции
+
Процедура ДобавитьРазделительПолейФормыВЗаголовкиЗапроса(Заголовки, Знач ДополнительныеПараметры)
- ТекущееЗначение = Заголовки.Получить("Content-Type");
+ ТекущееЗначение = Заголовки.Получить(КлиентHTTPПовтИсп.ЗаголовокТипКонтента());
Если ДополнительныеПараметры.Свойство("Разделитель") И ТекущееЗначение <> Неопределено Тогда
- Заголовки.Вставить("Content-Type", ТекущееЗначение + "; boundary=" + ДополнительныеПараметры.Разделитель);
+ Заголовки.Вставить(
+ КлиентHTTPПовтИсп.ЗаголовокТипКонтента(),
+ ТекущееЗначение + "; boundary=" + ДополнительныеПараметры.Разделитель
+ );
КонецЕсли;
КонецПроцедуры
Процедура ДобавитьРазмерДанныхВЗаголовкиЗапроса(Заголовки, Знач ДополнительныеПараметры, Знач Данные)
Если ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда
- Заголовки.Вставить("Content-Length", XMLСтрока(Данные.Размер()));
+ Заголовки.Вставить(КлиентHTTPПовтИсп.ЗаголовокРазмерКонтента(), XMLСтрока(Данные.Размер()));
ИначеЕсли ТипЗнч(Данные) = Тип("Строка") Тогда
Кодировка = КодировкаИзДопПараметров(ДополнительныеПараметры);
- Заголовки.Вставить("Content-Length", XMLСтрока(КлиентHTTPСлужебный.РазмерТекстовыхДанных(Данные, Кодировка)));
+ Заголовки.Вставить(
+ КлиентHTTPПовтИсп.ЗаголовокРазмерКонтента(),
+ XMLСтрока(КлиентHTTPСлужебный.РазмерТекстовыхДанных(Данные, Кодировка))
+ );
Иначе
ВызватьИсключение "Неизвестный тип данных: " + ТипЗнч(Данные);
КонецЕсли;
@@ -1647,12 +2219,73 @@
ЗаписьДанныхФормы.ЗаписатьСтроку("");
КонецПроцедуры
+Функция ПеренаправлениеЗапросаHTTP(Знач АдресПеренаправления, Знач Ответ, Знач Конфигурация, Знач КонтекстВыполнения)
+ Метод = КонтекстВыполнения.Метод;
+ Данные = КонтекстВыполнения.Данные;
+ Если (
+ Ответ.КодСостояния = КлиентHTTPПовтИсп.КодСостоянияПеремещен()
+ ИЛИ Ответ.КодСостояния = КлиентHTTPПовтИсп.КодСостоянияНайден()
+ ) И Конфигурация.ДополнительныеПараметры.Сессия.Свойство("ПеренаправлениеКакGET")
+ Тогда
+ Метод = КлиентHTTPПовтИсп.МетодGET();
+ Данные = Неопределено;
+
+ Конфигурация.Заголовки.Удалить(КлиентHTTPПовтИсп.ЗаголовокРазмерКонтента());
+ Конфигурация.Заголовки.Удалить(КлиентHTTPПовтИсп.ЗаголовокТипКонтента());
+ КонецЕсли;
+
+ Конфигурация.ДанныеURI = СтруктураИдентификатораРесурса(ИдентификаторРесурсаПеренаправления(АдресПеренаправления, Конфигурация.ДанныеURI));
+ Конфигурация.Параметры = ОбъединениеПараметровЗапроса(Конфигурация.ДанныеURI.Параметры, НовыеПараметрыЗапроса());
+ Конфигурация.ПараметрыСтрокой = ПараметрыЗапросаСтрокой(Конфигурация.Параметры);
+
+ ДобавитьХостВЗаголовкиЗапроса(Конфигурация.Заголовки, Конфигурация.ДанныеURI);
+ ДобавитьДанныеСессииВЗаголовкиЗапроса(Конфигурация.Заголовки, Конфигурация.ДанныеURI, Конфигурация.ДополнительныеПараметры);
+ СброситьСостояниеПовторногоВыполнения(Конфигурация.ДополнительныеПараметры);
+ ВыполнитьПаузуПередРедиректомПриНеобходимости(Ответ);
+
+ Возврат ВыполненныйЗапросHTTP(Метод, Конфигурация, Данные, КонтекстВыполнения.НомерПеренаправления + 1);
+КонецФункции
+
+Функция ОтложеноВыполненныйЗапросHTTP(Знач Ответ, Конфигурация, Знач КонтекстВыполнения)
+ Перем ПовторноеВыполнение;
+
+ Конфигурация.ДополнительныеПараметры.Свойство("ПовторноеВыполнение", ПовторноеВыполнение);
+
+ Если Ответ = Неопределено И ПовторноеВыполнение = Неопределено Тогда
+ ВызватьИсключение ?(
+ КонтекстВыполнения.Свойство("ИнформацияОбОшибке"),
+ КраткоеПредставлениеОшибки(КонтекстВыполнения.ИнформацияОбОшибке),
+ "Превышено количетво попыток выполнения запроса"
+ );
+ КонецЕсли;
+
+ ПовторноеВыполнение.ОсталосьПопыток = ПовторноеВыполнение.ОсталосьПопыток - 1;
+ Если ПовторноеВыполнение.ОсталосьПопыток < 1 Тогда
+ ВызватьИсключение "Превышено количетво попыток выполнения запроса";
+ КонецЕсли;
+
+ ДлительностьПаузы = ДлительностьПаузыОтложеногоВыполнения(ПовторноеВыполнение, Ответ);
+ Если ДлительностьПаузы >= 1 Тогда
+ КлиентHTTPВызовСервера.ПаузаПередПовторнымВыполнением(ДлительностьПаузы, ПовторноеВыполнение.Ключ);
+ КонецЕсли;
+
+ Возврат ВыполненныйЗапросHTTP(КонтекстВыполнения.Метод, Конфигурация, КонтекстВыполнения.Данные, КонтекстВыполнения.НомерПеренаправления);
+КонецФункции
+
+Функция НовыйОбъектОбработанногоОтвета()
+ Возврат Новый Структура("КодСостояния, Заголовки, Тело, ИмяФайлаТела, КонтекстВыполнения");
+КонецФункции
+
Функция ОбработанныйОтвет(Знач Ответ, Знач Конфигурация, Знач КонтекстВыполнения)
+ Если ТребуетсяПовторноеВыполнение(Ответ, Конфигурация.ДополнительныеПараметры) Тогда
+ Возврат ОтложеноВыполненныйЗапросHTTP(Ответ, Конфигурация, КонтекстВыполнения);
+ КонецЕсли;
+
Если НЕ Конфигурация.ДополнительныеПараметры.Свойство("Сессия") Тогда
- Возврат ОбъектОбработанногоОтвета(Ответ, Конфигурация.ДополнительныеПараметры);
+ Возврат ОбъектОбработанногоОтвета(Ответ, Конфигурация.ДополнительныеПараметры, КонтекстВыполнения);
КонецЕсли;
- Печенье = ЗначениеЗаголовка("Set-Cookie", Ответ.Заголовки);
+ Печенье = ЗначениеЗаголовка(КлиентHTTPПовтИсп.ЗаголовокОтветаСПеченьем(), Ответ.Заголовки);
Если Печенье <> Неопределено Тогда
Попытка
КлиентHTTPВызовСервера.ПринятьПеченье(Конфигурация.ДополнительныеПараметры.Сессия, Печенье, Конфигурация.ДанныеURI.Сервер);
@@ -1666,56 +2299,63 @@
КонецЕсли;
Сессия = Конфигурация.ДополнительныеПараметры.Сессия;
- НовыйИдентификаторРесурса = ИдентификаторПеренаправления(Ответ.КодСостояния, Ответ.Заголовки);
- Если ЗначениеЗаполнено(НовыйИдентификаторРесурса) И КонтекстВыполнения.НомерПеренаправления <= Сессия.ПорогПеренаправлений Тогда
- Конфигурация.ДанныеURI = СтруктураИдентификатораРесурса(НовыйИдентификаторРесурса);
- Конфигурация.Параметры = ОбъединениеПараметровЗапросаВСтроку(Конфигурация.ДанныеURI.Параметры, НовыеПараметрыЗапроса());
-
- Возврат ВыполнитьЗапросHTTP(КонтекстВыполнения.Метод, Конфигурация, КонтекстВыполнения.Данные, КонтекстВыполнения.НомерПеренаправления + 1);
+ АдресПеренаправления = АдресПеренаправленияИзЗаголовков(Ответ.КодСостояния, Ответ.Заголовки);
+ Если ЗначениеЗаполнено(АдресПеренаправления) И КонтекстВыполнения.НомерПеренаправления <= Сессия.ПорогПеренаправлений Тогда
+ Возврат ПеренаправлениеЗапросаHTTP(АдресПеренаправления, Ответ, Конфигурация, КонтекстВыполнения);
КонецЕсли;
Если Ответ.КодСостояния = КлиентHTTPПовтИсп.КодСостоянияНеАвторизовано() И Конфигурация.ДополнительныеПараметры.Свойство("АвторизоватьсяDigest") Тогда
- РецептАвторизации = ЗначениеЗаголовка("WWW-Authenticate", Ответ.Заголовки);
+ РецептАвторизации = ЗначениеЗаголовка(КлиентHTTPПовтИсп.ЗаголовокОтветаМетодыАутентификации(), Ответ.Заголовки);
Если СтрНачинаетсяС(НРег(РецептАвторизации), "digest") Тогда
+ СброситьСостояниеПовторногоВыполнения(Конфигурация.ДополнительныеПараметры);
+
КонтекстВыполненияАдресВХ = ПоместитьВоВременноеХранилище(КонтекстВыполнения, Новый УникальныйИдентификатор);
Конфигурация.ДополнительныеПараметры.Удалить("АвторизоватьсяDigest");
Сессия.Вставить("ПараметрыDigest", ПараметрыDigest(РецептАвторизации));
- Конфигурация.Заголовки.Вставить("Authorization", КлиентHTTPВызовСервера.ЗаголовокDigest(Конфигурация, КонтекстВыполненияАдресВХ));
+ Конфигурация.Заголовки.Вставить(
+ КлиентHTTPПовтИсп.ЗаголовокТипАутентификации(),
+ КлиентHTTPВызовСервера.ЗаголовокDigest(Конфигурация, КонтекстВыполненияАдресВХ)
+ );
- Возврат ВыполнитьЗапросHTTP(КонтекстВыполнения.Метод, Конфигурация, КонтекстВыполнения.Данные, КонтекстВыполнения.НомерПеренаправления + 1);
+ Возврат ВыполненныйЗапросHTTP(КонтекстВыполнения.Метод, Конфигурация, КонтекстВыполнения.Данные, КонтекстВыполнения.НомерПеренаправления + 1);
КонецЕсли;
КонецЕсли;
- Возврат ОбъектОбработанногоОтвета(Ответ, Конфигурация.ДополнительныеПараметры);
+ Возврат ОбъектОбработанногоОтвета(Ответ, Конфигурация.ДополнительныеПараметры, КонтекстВыполнения);
КонецФункции
-Функция ОбъектОбработанногоОтвета(Знач Ответ, Знач ДополнительныеПараметры)
- Возврат Новый ФиксированнаяСтруктура(
- "КодСостояния, Заголовки, Тело, ИмяФайлаТела",
- Ответ.КодСостояния,
- Ответ.Заголовки,
- ТелоОтвета(Ответ, ДополнительныеПараметры),
- Ответ.ПолучитьИмяФайлаТела()
- );
+Функция ОбъектОбработанногоОтвета(Знач Ответ, Знач ДополнительныеПараметры, Знач КонтекстВыполнения)
+ фРезультат = НовыйОбъектОбработанногоОтвета();
+ фРезультат.КодСостояния = Ответ.КодСостояния;
+ фРезультат.Заголовки = Ответ.Заголовки;
+ фРезультат.Тело = ТелоОтвета(Ответ, ДополнительныеПараметры);
+ фРезультат.ИмяФайлаТела = Ответ.ПолучитьИмяФайлаТела();
+ фРезультат.КонтекстВыполнения = КонтекстВыполнения.Значения;
+
+ Возврат Новый ФиксированнаяСтруктура(фРезультат);
КонецФункции
Функция ТелоОтвета(Знач Ответ, Знач ДополнительныеПараметры)
ДанныеТелаОтвета = ?(
- ЗначениеЗаголовка("Content-Encoding", Ответ.Заголовки) = Неопределено,
+ ЗначениеЗаголовка(КлиентHTTPПовтИсп.ЗаголовокОтветаСжатиеТела(), Ответ.Заголовки) = Неопределено,
Ответ.ПолучитьТелоКакДвоичныеДанные(),
Декомпрессия(Ответ.ПолучитьТелоКакПоток())
);
- фРезультат = ДанныеТелаОтвета;
-
- Если НЕ ДополнительныеПараметры.Свойство("ПрочитатьТелоОтветаКак") Тогда
- Возврат фРезультат;
- КонецЕсли;
+ Возврат ?(
+ ДополнительныеПараметры.Свойство("ПрочитатьТелоОтветаКак"),
+ ПреобразованноеТелоОтвета(Ответ, ДанныеТелаОтвета, ДополнительныеПараметры.ПрочитатьТелоОтветаКак),
+ ДанныеТелаОтвета
+ );
+КонецФункции
+
+Функция ПреобразованноеТелоОтвета(Знач Ответ, Знач ДанныеТелаОтвета, Знач СпособЧтения) Экспорт
+ Перем фРезультат;
Кодировка = КлиентHTTPПовтИсп.КодировкаПоУмолчанию();
- ТипСодержимого = ЗначениеЗаголовка("Content-Type", Ответ.Заголовки);
+ ТипСодержимого = КлиентHTTPКлиентСервер.ЗначениеЗаголовка(КлиентHTTPПовтИсп.ЗаголовокТипКонтента(), Ответ.Заголовки);
Если ТипСодержимого <> Неопределено Тогда
ПозицияРазделителя = СтрНайти(ТипСодержимого, ";");
Если ПозицияРазделителя > 0 Тогда
@@ -1723,7 +2363,6 @@
КонецЕсли;
КонецЕсли;
- СпособЧтения = ДополнительныеПараметры.ПрочитатьТелоОтветаКак;
Если СпособЧтения.Формат = ФорматТелаОтветаТекст() Тогда
фРезультат = ПолучитьСтрокуИзДвоичныхДанных(ДанныеТелаОтвета, Кодировка);
ИначеЕсли СпособЧтения.Формат = ФорматТелаОтветаJSON() Тогда
@@ -1783,7 +2422,7 @@
Получатель = КлиентHTTPСлужебный.НормализованныйАдресСервера(ДанныеURI.Сервер);
ДатаЗапроса = КлиентHTTPВызовСервера.ТекущаяУниверсальнаяДатаНаСервере();
- ВзятьПеченье(фРезультат, Печенье, Получатель, ДатаЗапроса, ДанныеURI.АдресРесурса, ДанныеURI.ЗащищенноеСоединение);
+ ВзятьПеченье(фРезультат, Печенье, Получатель, ДатаЗапроса, ДанныеURI.Путь, ДанныеURI.ЗащищенноеСоединение);
Если фРезультат.Количество() > 0 Тогда
Возврат Новый ФиксированныйМассив(фРезультат);
КонецЕсли;
@@ -1792,7 +2431,7 @@
Пока Части.Количество() > 1 Цикл
Получатель = "." + СтрСоединить(Части, ".");
- ВзятьПеченье(фРезультат, Печенье, Получатель, ДатаЗапроса, ДанныеURI.АдресРесурса, ДанныеURI.ЗащищенноеСоединение);
+ ВзятьПеченье(фРезультат, Печенье, Получатель, ДатаЗапроса, ДанныеURI.Путь, ДанныеURI.ЗащищенноеСоединение);
Если фРезультат.Количество() > 0 Тогда
Прервать;
КонецЕсли;
@@ -1803,9 +2442,9 @@
Возврат Новый ФиксированныйМассив(фРезультат);
КонецФункции
-Процедура ВзятьПеченье(ПеченьеПолучателя, Печенье, Знач Получатель, Знач ДатаЗапроса, Знач АдресРесурса, Знач ЗащищенноеСоединение)
+Процедура ВзятьПеченье(ПеченьеПолучателя, Печенье, Знач Получатель, Знач ДатаЗапроса, Знач Путь, Знач ЗащищенноеСоединение)
ИмяСрок = КлиентHTTPПовтИсп.СвойствоПеченькаСрок();
- ИмяАдресРесурса = КлиентHTTPПовтИсп.СвойствоПеченькаАдресРесурса();
+ ИмяПуть = КлиентHTTPПовтИсп.СвойствоПеченькаАдресРесурса();
ИмяЗащищенноеСоединение = КлиентHTTPПовтИсп.СвойствоПеченькаЗащищенноеСоединение();
Печеньки = Печенье.Получить(Получатель);
@@ -1821,7 +2460,7 @@
ПеченькиНаУдаление.Добавить(КЗ.Ключ);
Продолжить;
КонецЕсли;
- Если Печенька.Свойство(ИмяАдресРесурса) И НЕ СтрНачинаетсяС(АдресРесурса, Печенька[ИмяАдресРесурса]) Тогда
+ Если Печенька.Свойство(ИмяПуть) И НЕ СтрНачинаетсяС(Путь, Печенька[ИмяПуть]) Тогда
Продолжить;
КонецЕсли;
Если Печенька.Свойство(ИмяЗащищенноеСоединение) И НЕ ЗащищенноеСоединение Тогда
@@ -1857,29 +2496,49 @@
КонецЦикла;
КонецПроцедуры
-Функция АдресРесурсаЗапроса(Знач Конфигурация)
- Возврат Конфигурация.ДанныеURI.АдресРесурса + Конфигурация.Параметры;
-КонецФункции
-
-Функция ЗначениеЗаголовка(Знач ИмяЗаголовка, Знач Заголовки)
- фРезультат = Неопределено;
- ИмяЗаголовка = НРег(ИмяЗаголовка);
+Функция ЗначениеЗаголовкаCookie(Знач ДанныеURI, Знач Сессия)
+ Если НЕ Сессия.Свойство("Печенье") Тогда
+ Возврат Неопределено;
+ КонецЕсли;
- Для Каждого КЗ Из Заголовки Цикл
- Если НРег(КЗ.Ключ) = ИмяЗаголовка Тогда
- фРезультат = КЗ.Значение;
- Прервать;
- КонецЕсли;
- КонецЦикла;
+ Печенье = ПеченьеДляURI(ДанныеURI, Сессия.Печенье);
- Возврат фРезультат;
+ Возврат ?(ЗначениеЗаполнено(Печенье), СтрСоединить(Печенье, "; "), "");
+КонецФункции
+
+Функция АдресРесурсаЗапроса(Знач Конфигурация)
+ Возврат Конфигурация.ДанныеURI.Путь +
+ Конфигурация.ПараметрыСтрокой +
+ ?(ПустаяСтрока(Конфигурация.ДанныеURI.Фрагмент), "", "#") +
+ Конфигурация.ДанныеURI.Фрагмент;
КонецФункции
-Функция ИдентификаторПеренаправления(Знач КодСостояния, Знач Заголовки)
+Функция АдресПеренаправленияИзЗаголовков(Знач КодСостояния, Знач Заголовки)
Возврат ?(
КлиентHTTPПовтИсп.КодыСостоянияПеренаправления().Получить(КодСостояния) = Неопределено,
Неопределено,
- КлиентHTTPВызовСервера.РаскодированныйИдентификаторРесурса(ЗначениеЗаголовка("Location", Заголовки))
+ КлиентHTTPВызовСервера.РаскодированныйИдентификаторРесурса(СокрЛП(ЗначениеЗаголовка(КлиентHTTPПовтИсп.ЗаголовокОтветаПеренаправление(), Заголовки)))
+ );
+КонецФункции
+
+Функция ИдентификаторРесурсаПеренаправления(Знач АдресПеренаправления, Знач ДанныеURI)
+ Если СтрНачинаетсяС(АдресПеренаправления, "https://") ИЛИ СтрНачинаетсяС(АдресПеренаправления, "http://") Тогда
+ Возврат АдресПеренаправления;
+ КонецЕсли;
+
+ СхемаИОбращение =
+ СхемаЗапроса(ДанныеURI) +
+ ДанныеURI.Сервер +
+ ?(
+ ДанныеURI.ЗащищенноеСоединение И ДанныеURI.Порт = 443 ИЛИ НЕ ДанныеURI.ЗащищенноеСоединение И ДанныеURI.Порт = 80,
+ "",
+ ":" + XMLСтрока(ДанныеURI.Порт)
+ );
+
+ Возврат СхемаИОбращение + ?(
+ СтрНачинаетсяС(АдресПеренаправления, "/"),
+ АдресПеренаправления,
+ Лев(ДанныеURI.Путь, СтрНайти(ДанныеURI.Путь, "/", НаправлениеПоиска.СКонца)) + АдресПеренаправления
);
КонецФункции
@@ -1887,6 +2546,26 @@
Возврат Новый ФиксированнаяСтруктура("Тип, Пользователь, Пароль", Тип, Пользователь, Пароль);
КонецФункции
+Функция ОбъектАутентификацииBearer(Знач Токен)
+ Возврат Новый ФиксированнаяСтруктура("Тип, Токен", "Bearer", Токен);
+КонецФункции
+
+Функция ОбъектАутентификацииAWS4(Знач КлючДоступа, Знач СекретныйКлюч, Знач Регион, Знач Сервис)
+ Возврат Новый ФиксированнаяСтруктура("Тип, КлючДоступа, СекретныйКлюч, Регион, Сервис", "AWS4", КлючДоступа, СекретныйКлюч, Регион, Сервис);
+КонецФункции
+
+Функция ОбъектАутентификацииHawk(Знач Идентификатор, Знач Ключ, Знач Дополнение, Знач ИдентификаторПриложения, Знач Делегирование)
+ Возврат Новый ФиксированнаяСтруктура(
+ "Тип, Идентификатор, Ключ, Дополнение, ИдентификаторПриложения, Делегирование",
+ "Hawk",
+ Идентификатор,
+ Ключ,
+ Дополнение,
+ ИдентификаторПриложения,
+ Делегирование
+ );
+КонецФункции
+
Функция ПараметрыDigest(Знач РецептАвторизации)
фРезультат = Новый Структура("algorithm, realm, nonce, qop, opaque");
@@ -1962,18 +2641,97 @@
Возврат фРезультат;
КонецФункции
-Функция ФорматированноеИмяПараметраЗапроса(Знач Имя)
- Возврат СтрЗаменить(ФорматированноеЗначениеПараметраЗапроса(Имя), "=", "%3D");
+Функция СпособЧтенияТелаОтвета(Знач Формат, Знач Параметры = Неопределено)
+ Возврат Новый Структура("Формат, Параметры", Формат, Параметры);
КонецФункции
-Функция ФорматированноеЗначениеПараметраЗапроса(Знач Значение)
- Возврат СтрЗаменить(СтрЗаменить(СтрЗаменить(Значение, Символы.ПС, ""), "#", "%23"), "&", "%26");
+Функция ТребуетсяПовторноеВыполнение(Знач Ответ, Знач ДополнительныеПараметры)
+ Если Ответ = Неопределено Тогда
+ Возврат Истина;
+ КонецЕсли;
+
+ Если НЕ ДополнительныеПараметры.Свойство("ПовторноеВыполнение") Тогда
+ Возврат Ложь;
+ КонецЕсли;
+
+ Возврат Ответ.КодСостояния >= КлиентHTTPПовтИсп.КодСостоянияВнутренняяОшибкаСервера()
+ ИЛИ ДополнительныеПараметры.ПовторноеВыполнение.КодыСостояния.Получить(Ответ.КодСостояния) <> Неопределено;
КонецФункции
-Функция СпособЧтенияТелаОтвета(Знач Формат, Знач Параметры = Неопределено)
- Возврат Новый Структура("Формат, Параметры", Формат, Параметры);
+Функция НовыйКлючПовторногоВыполнения()
+ Возврат "http_client_retry_" + XMLСтрока(Новый УникальныйИдентификатор);
КонецФункции
+Процедура СброситьСостояниеПовторногоВыполнения(ДополнительныеПараметры)
+ Если НЕ ДополнительныеПараметры.Свойство("ПовторноеВыполнение") Тогда
+ Возврат;
+ КонецЕсли;
+
+ ПВ = ДополнительныеПараметры.ПовторноеВыполнение;
+ ПВ.Ключ = НовыйКлючПовторногоВыполнения();
+ ПВ.ОсталосьПопыток = ПВ.ПорогКоличестваПопыток;
+КонецПроцедуры
+
+Функция ДлительностьПаузыОтложеногоВыполнения(Знач Параметры, Знач Ответ)
+ ЗаголовокПовторитьПосле = ?(
+ Ответ = Неопределено ИЛИ КлиентHTTPПовтИсп.КодыСостоянияЧтенияЗаголовкаОтложенногоВыполнения().Получить(Ответ.КодСостояния) = Неопределено,
+ Неопределено,
+ ЗначениеЗаголовка(КлиентHTTPПовтИсп.ЗаголовокОтветаПовторитьПосле(), Ответ.Заголовки)
+ );
+ Если ЗаголовокПовторитьПосле <> Неопределено Тогда
+ Возврат ДлительностьПаузыЗаголовкаОтвета(ЗаголовокПовторитьПосле);
+ КонецЕсли;
+
+ НомерПопытки = Параметры.ПорогКоличестваПопыток - Параметры.ОсталосьПопыток;
+ фРезультат = 0;
+
+ Если Параметры.Способ = СпособУвеличенияЛинейно() Тогда
+ фРезультат = Параметры.НачальнаяДлительность + Параметры.КоэфициентУвеличения * Параметры.НачальнаяДлительность * (НомерПопытки - 1);
+ ИначеЕсли Параметры.Способ = СпособБезУвеличения() Тогда
+ фРезультат = Параметры.Длительность;
+ ИначеЕсли Параметры.Способ = СпособУвеличенияЭкспоненциально() Тогда
+ фРезультат = Параметры.НачальнаяДлительность * Pow(Параметры.КоэфициентУвеличения, НомерПопытки - 1);
+ КонецЕсли;
+
+ Возврат КорректнаяДлительностьПаузы(Мин(Параметры.МаксимальнаяДлительность, фРезультат));
+КонецФункции
+
+Функция ДлительностьПаузыЗаголовкаОтвета(Знач ЗначениеЗаголовка)
+ ОписаниеТипаЧисло = Новый ОписаниеТипов("Число");
+ Ошибка = Ложь;
+ ДатаЗаголовка = КлиентHTTPСлужебный.ДатаИзHTTP(ЗначениеЗаголовка, Ошибка);
+
+ Возврат КорректнаяДлительностьПаузы(?(
+ Ошибка,
+ ОписаниеТипаЧисло.ПривестиЗначение(ДатаЗаголовка),
+ Мин(0, Макс(0, ДатаЗаголовка - КлиентHTTPВызовСервера.ТекущаяУниверсальнаяДатаНаСервере()))
+ ));
+КонецФункции
+
+Функция КорректныйПорогКоличестваПопыток(Знач ПорогКоличестваПопыток)
+ Возврат ?(ПорогКоличестваПопыток < 1, 1, Мин(99, ПорогКоличестваПопыток));
+КонецФункции
+
+Функция КорректнаяДлительностьПаузы(Знач Длительность)
+ Возврат ?(Длительность < 0, 0, Мин(КлиентHTTPПовтИсп.МаксимальноДопустимаяДлительностьПаузы(), Цел(Длительность)));
+КонецФункции
+
+Процедура ВыполнитьПаузуПередРедиректомПриНеобходимости(Знач Ответ)
+ Если Ответ.КодСостояния <> КлиентHTTPПовтИсп.КодСостоянияПеремещен() Тогда
+ Возврат;
+ КонецЕсли;
+
+ ЗаголовокПовторитьПосле = ЗначениеЗаголовка(КлиентHTTPПовтИсп.ЗаголовокОтветаПовторитьПосле(), Ответ.Заголовки);
+ Если ЗаголовокПовторитьПосле = Неопределено Тогда
+ Возврат;
+ КонецЕсли;
+
+ ДлительностьПаузы = ДлительностьПаузыЗаголовкаОтвета(ЗаголовокПовторитьПосле);
+ Если ДлительностьПаузы > 0 Тогда
+ КлиентHTTPВызовСервера.ПаузаПередПовторнымВыполнением(ДлительностьПаузы, НовыйКлючПовторногоВыполнения());
+ КонецЕсли;
+КонецПроцедуры
+
Функция ПараметрыЧтенияJSON(
Знач ПрочитатьВСоответствие = Ложь,
Знач ИменаСвойствСоЗначениямиДата = Неопределено,
@@ -2072,4 +2830,16 @@
Функция ФорматТелаОтветаXML()
Возврат "xml";
КонецФункции
+
+Функция СпособБезУвеличения()
+ Возврат "Фиксировано";
+КонецФункции
+
+Функция СпособУвеличенияЛинейно()
+ Возврат "Линейно";
+КонецФункции
+
+Функция СпособУвеличенияЭкспоненциально()
+ Возврат "Экспоненциально";
+КонецФункции
#КонецОбласти
diff --git "a/src/v1/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Ext/Module.bsl" "b/src/v1/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Ext/Module.bsl"
index d731622..0b5f959 100644
--- "a/src/v1/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Ext/Module.bsl"
+++ "b/src/v1/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Ext/Module.bsl"
@@ -96,7 +96,7 @@
308 // ПеренаправлениеНаПостояннойОснове
),
Новый ФиксированнаяСтруктура( // Клиентские
- "ПлохойЗапрос, НеАвторизовано, НеобходимаОплата, Запрещено, НеНайден, МетодНеРазрешен, НеПриемлемо, НеАвторизованоПрокси, Таймаут, Конфликт, Удалено, ТребуетсяРазмерКонтента, НевыполнимыеУсловия, ПревышенЛимитТела, ПревышенаДлинаURI, ТипМедиаНеПоддерживается, ДиапазонНеМожетБытьВыполнен, ОжиданиеНеМожетБытьВыполнено, Чайник, ТаймаутАвторизации, Мисдирект, НеобрабатываемыйЭкземпляр, Заблокировано, НевыполненнаяЗависимость, НеобходимоОбновление, НеобходимоПредусловие, СлишкомМногоЗапросов, ПоляЗаголовкаСлишкомБольшие, НедостаточноИнформации, НедоступноПоЮридическимПричинам, КлиентЗакрылСоединение",
+ "ПлохойЗапрос, НеАвторизовано, НеобходимаОплата, Запрещено, НеНайден, МетодНеРазрешен, НеПриемлемо, НеАвторизованоПрокси, Таймаут, Конфликт, Удалено, ТребуетсяРазмерКонтента, НевыполнимыеУсловия, ПревышенЛимитТела, ПревышенаДлинаURI, ТипМедиаНеПоддерживается, ДиапазонНеМожетБытьВыполнен, ОжиданиеНеМожетБытьВыполнено, Чайник, ТаймаутАвторизации, Мисдирект, НеобрабатываемыйЭкземпляр, Заблокировано, НевыполненнаяЗависимость, СлишкомРано, НеобходимоОбновление, НеобходимоПредусловие, СлишкомМногоЗапросов, ПоляЗаголовкаСлишкомБольшие, НедостаточноИнформации, НедоступноПоЮридическимПричинам, КлиентЗакрылСоединение",
400, // ПлохойЗапрос
401, // НеАвторизовано
402, // НеобходимаОплата
@@ -200,6 +200,15 @@
Возврат КлиентHTTPПовтИсп.КодыСостояния().Перенаправления.Найден;
КонецФункции
+// Возвращает код состояния HTTP-сервера 303
+//
+// Возвращаемое значение:
+// Число - код состояния
+//
+Функция КодСостоянияПросмотрДругихРесурсов() Экспорт
+ Возврат КлиентHTTPПовтИсп.КодыСостояния().Перенаправления.ПросмотрДругихРесурсов;
+КонецФункции
+
// Возвращает код состояния HTTP-сервера 307
//
// Возвращаемое значение:
@@ -209,6 +218,15 @@
Возврат КлиентHTTPПовтИсп.КодыСостояния().Перенаправления.ВременноеПеренаправление;
КонецФункции
+// Возвращает код состояния HTTP-сервера 308
+//
+// Возвращаемое значение:
+// Число - код состояния
+//
+Функция КодСостоянияПеренаправление() Экспорт
+ Возврат КлиентHTTPПовтИсп.КодыСостояния().Перенаправления.ПеренаправлениеНаПостояннойОснове;
+КонецФункции
+
// Возвращает код состояния HTTP-сервера 400
//
// Возвращаемое значение:
@@ -290,6 +308,15 @@
Возврат КлиентHTTPПовтИсп.КодыСостояния().Клиентские.Чайник;
КонецФункции
+// Возвращает код состояния HTTP-сервера 429
+//
+// Возвращаемое значение:
+// Число - код состояния
+//
+Функция КодСостоянияСлишкомМногоЗапросов() Экспорт
+ Возврат КлиентHTTPПовтИсп.КодыСостояния().Клиентские.СлишкомМногоЗапросов;
+КонецФункции
+
// Возвращает код состояния HTTP-сервера 500
//
// Возвращаемое значение:
@@ -345,9 +372,23 @@
фРезультат = Новый Соответствие;
фРезультат.Вставить(КлиентHTTPПовтИсп.КодСостоянияПеремещен(), Истина);
фРезультат.Вставить(КлиентHTTPПовтИсп.КодСостоянияНайден(), Истина);
- фРезультат.Вставить(КлиентHTTPПовтИсп.КодыСостояния().Перенаправления.ПросмотрДругихРесурсов, Истина);
+ фРезультат.Вставить(КлиентHTTPПовтИсп.КодСостоянияПросмотрДругихРесурсов(), Истина);
фРезультат.Вставить(КлиентHTTPПовтИсп.КодСостоянияВременноеПеренаправление(), Истина);
- фРезультат.Вставить(КлиентHTTPПовтИсп.КодыСостояния().Перенаправления.ПеренаправлениеНаПостояннойОснове, Истина);
+ фРезультат.Вставить(КлиентHTTPПовтИсп.КодСостоянияПеренаправление(), Истина);
+
+ Возврат Новый ФиксированноеСоответствие(фРезультат);
+КонецФункции
+
+// Возвращает множество кодов состояния HTTP-сервера, требующих чтения заголовка ответа Retry-After
+//
+// Возвращаемое значение:
+// ФиксированноеСоответствие - ключи: коды состояния
+//
+Функция КодыСостоянияЧтенияЗаголовкаОтложенногоВыполнения() Экспорт
+ фРезультат = Новый Соответствие;
+ фРезультат.Вставить(КлиентHTTPПовтИсп.КодСостоянияСервисНедоступен(), Истина);
+ фРезультат.Вставить(КлиентHTTPПовтИсп.КодСостоянияСлишкомМногоЗапросов(), Истина);
+ фРезультат.Вставить(КлиентHTTPПовтИсп.КодСостоянияПеремещен(), Истина);
Возврат Новый ФиксированноеСоответствие(фРезультат);
КонецФункции
@@ -530,6 +571,15 @@
Возврат КлиентHTTPПовтИсп.ТипыMIME().text.xml;
КонецФункции
+// Возвращает MIME-тип application/xml
+//
+// Возвращаемое значение:
+// Строка - MIME-тип
+//
+Функция ТипMIMEApplicationXML() Экспорт
+ Возврат КлиентHTTPПовтИсп.ТипыMIME().application.xml;
+КонецФункции
+
// Возвращает MIME-тип text/html
//
// Возвращаемое значение:
@@ -703,7 +753,7 @@
Возврат Новый ФиксированноеСоответствие(фРезультат);
КонецФункции
-// Возвращает кодировку по умолчанию для HTTP-клиента
+// Возвращает кодировку по умолчанию для HTTP-клиента (UTF-8)
//
// Возвращаемое значение:
// Строка - кодировка
@@ -748,6 +798,15 @@
Возврат "UTF-32";
КонецФункции
+// Возвращает кодировку ISO-8859-1
+//
+// Возвращаемое значение:
+// Строка - кодировка
+//
+Функция КодировкаISO8859() Экспорт
+ Возврат "ISO-8859-1";
+КонецФункции
+
// Возвращает кодировку CESU-8
//
// Возвращаемое значение:
@@ -793,6 +852,114 @@
Возврат "cp866";
КонецФункции
+// Возвращает имя заголовка, содержащего хост сервера
+//
+// Возвращаемое значение:
+// Строка - имя заголовка
+//
+Функция ЗаголовокХост() Экспорт
+ Возврат "Host";
+КонецФункции
+
+// Возвращает имя заголовка, содержащего характеристику пользовательского агента
+//
+// Возвращаемое значение:
+// Строка - имя заголовка
+//
+Функция ЗаголовокАгентПользователя() Экспорт
+ Возврат "User-Agent";
+КонецФункции
+
+// Возвращает имя заголовка, содержащего тип контента
+//
+// Возвращаемое значение:
+// Строка - имя заголовка
+//
+Функция ЗаголовокТипКонтента() Экспорт
+ Возврат "Content-Type";
+КонецФункции
+
+// Возвращает имя заголовка, содержащего размер контента
+//
+// Возвращаемое значение:
+// Строка - имя заголовка
+//
+Функция ЗаголовокРазмерКонтента() Экспорт
+ Возврат "Content-Length";
+КонецФункции
+
+// Возвращает имя заголовка, содержащего данные аутентификации
+//
+// Возвращаемое значение:
+// Строка - имя заголовка
+//
+Функция ЗаголовокТипАутентификации() Экспорт
+ Возврат "Authorization";
+КонецФункции
+
+// Возвращает имя заголовка, содержащего допустимые для клиента способы кодирования тела ответа (обычно, это алгоритмы сжатия)
+//
+// Возвращаемое значение:
+// Строка - имя заголовка
+//
+Функция ЗаголовокДопустимыеСпособыКодированияОтвета() Экспорт
+ Возврат "Accept-Encoding";
+КонецФункции
+
+// Возвращает имя заголовка с Cookie
+//
+// Возвращаемое значение:
+// Строка - имя заголовка
+//
+Функция ЗаголовокПеченье() Экспорт
+ Возврат "Cookie";
+КонецФункции
+
+// Возвращает имя заголовка ответа с Cookie
+//
+// Возвращаемое значение:
+// Строка - имя заголовка
+//
+Функция ЗаголовокОтветаСПеченьем() Экспорт
+ Возврат "Set-Cookie";
+КонецФункции
+
+// Возвращает имя заголовка ответа, содержащего тип сжатия содержимого тела ответа
+//
+// Возвращаемое значение:
+// Строка - имя заголовка
+//
+Функция ЗаголовокОтветаСжатиеТела() Экспорт
+ Возврат "Content-Encoding";
+КонецФункции
+
+// Возвращает имя заголовка ответа с URI перенаправления
+//
+// Возвращаемое значение:
+// Строка - имя заголовка
+//
+Функция ЗаголовокОтветаПеренаправление() Экспорт
+ Возврат "Location";
+КонецФункции
+
+// Возвращает имя заголовка ответа с доступными типами аутентификации
+//
+// Возвращаемое значение:
+// Строка - имя заголовка
+//
+Функция ЗаголовокОтветаМетодыАутентификации() Экспорт
+ Возврат "WWW-Authenticate";
+КонецФункции
+
+// Возвращает имя заголовка ответа с датой повторного выполнения или длительностью паузы до повторного выполнения
+//
+// Возвращаемое значение:
+// Строка - имя заголовка
+//
+Функция ЗаголовокОтветаПовторитьПосле() Экспорт
+ Возврат "Retry-After";
+КонецФункции
+
// Возвращает дату, называемую эпохой Unix
//
// Возвращаемое значение:
@@ -801,6 +968,112 @@
Функция ЭпохаUnix() Экспорт
Возврат Дата(1970, 1, 1);
КонецФункции
+
+// Возвращает AWS сервис S3
+//
+// Возвращаемое значение:
+// Строка - сервис
+//
+Функция СервисAWSS3() Экспорт
+ Возврат "s3";
+КонецФункции
+
+// Возвращает адресный перечень регионов AWS
+//
+// Возвращаемое значение:
+// ФиксированнаяСтруктура - ключи: константы регионов AWS
+//
+Функция РегионыAWS() Экспорт
+ фРезультат = Новый Структура;
+
+ Регионы = Новый Массив;
+ Регионы.Добавить("RU_1");
+ Регионы.Добавить("RU_MSK");
+ Регионы.Добавить("RU_CENTRAL1");
+ Регионы.Добавить("AF_SOUTH_1");
+ Регионы.Добавить("AP_EAST_1");
+ Регионы.Добавить("AP_NORTHEAST_1");
+ Регионы.Добавить("AP_NORTHEAST_2");
+ Регионы.Добавить("AP_NORTHEAST_3");
+ Регионы.Добавить("AP_SOUTH_1");
+ Регионы.Добавить("AP_SOUTH_2");
+ Регионы.Добавить("AP_SOUTHEAST_1");
+ Регионы.Добавить("AP_SOUTHEAST_2");
+ Регионы.Добавить("AP_SOUTHEAST_3");
+ Регионы.Добавить("AP_SOUTHEAST_4");
+ Регионы.Добавить("AWS_CN_GLOBAL");
+ Регионы.Добавить("AWS_GLOBAL");
+ Регионы.Добавить("AWS_ISO_B_GLOBAL");
+ Регионы.Добавить("AWS_ISO_GLOBAL");
+ Регионы.Добавить("AWS_US_GOV_GLOBAL");
+ Регионы.Добавить("CA_CENTRAL_1");
+ Регионы.Добавить("CN_NORTH_1");
+ Регионы.Добавить("CN_NORTHWEST_1");
+ Регионы.Добавить("EU_CENTRAL_1");
+ Регионы.Добавить("EU_CENTRAL_2");
+ Регионы.Добавить("EU_NORTH_1");
+ Регионы.Добавить("EU_SOUTH_1");
+ Регионы.Добавить("EU_SOUTH_2");
+ Регионы.Добавить("EU_WEST_1");
+ Регионы.Добавить("EU_WEST_2");
+ Регионы.Добавить("EU_WEST_3");
+ Регионы.Добавить("ME_CENTRAL_1");
+ Регионы.Добавить("ME_SOUTH_1");
+ Регионы.Добавить("SA_EAST_1");
+ Регионы.Добавить("US_EAST_1");
+ Регионы.Добавить("US_EAST_2");
+ Регионы.Добавить("US_GOV_EAST_1");
+ Регионы.Добавить("US_GOV_WEST_1");
+ Регионы.Добавить("US_ISO_EAST_1");
+ Регионы.Добавить("US_ISO_WEST_1");
+ Регионы.Добавить("US_ISOB_EAST_1");
+ Регионы.Добавить("US_WEST_1");
+ Регионы.Добавить("US_WEST_2");
+
+ Для Каждого Регион Из Регионы Цикл
+ фРезультат.Вставить(Регион, СтрЗаменить(НРег(Регион), "_", "-"));
+ КонецЦикла;
+
+ Возврат Новый ФиксированнаяСтруктура(фРезультат);
+КонецФункции
+
+#Область AWS_РЕГИОНЫ
+// Возвращает AWS регион по умолчанию (ru-1)
+//
+// Возвращаемое значение:
+// Строка - регион
+//
+Функция РегионAWSПоУмолчанию() Экспорт
+ Возврат КлиентHTTPПовтИсп.РегионAWSRu1();
+КонецФункции
+
+// Возвращает AWS регион ru-1
+//
+// Возвращаемое значение:
+// Строка - регион
+//
+Функция РегионAWSRu1() Экспорт
+ Возврат КлиентHTTPПовтИсп.РегионыAWS().RU_1;
+КонецФункции
+
+// Возвращает AWS регион ru-msk-1
+//
+// Возвращаемое значение:
+// Строка - регион
+//
+Функция РегионAWSRuMsk() Экспорт
+ Возврат КлиентHTTPПовтИсп.РегионыAWS().RU_MSK;
+КонецФункции
+
+// Возвращает AWS регион ru-central1
+//
+// Возвращаемое значение:
+// Строка - регион
+//
+Функция РегионAWSRuCentral1() Экспорт
+ Возврат КлиентHTTPПовтИсп.РегионыAWS().RU_CENTRAL1;
+КонецФункции
+#КонецОбласти
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
@@ -1131,7 +1404,18 @@
Возврат Новый ФиксированнаяСтруктура(фРезультат);
КонецФункции
-// Возвращает множество допустимых символов имени заголовка HTTP-запроса
+// Возвращает строку из допустимых символов имени заголовка HTTP-запроса
+//
+// Возвращаемое значение:
+// Строка - строка из допустимых символов имени заголовка
+//
+Функция ДопустимыеСимволыИмениЗаголовкаСтрокой() Экспорт
+ Буквы = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+ Возврат Буквы + НРег(Буквы) + "0123456789!#$%&'*+-.^_`|~";
+КонецФункции
+
+// (УСТАРЕЛО) Возвращает множество допустимых символов имени заголовка HTTP-запроса
//
// Возвращаемое значение:
// ФиксированноеСоответствие - служебный словарь допустимых символов имени заголовка
@@ -1139,8 +1423,7 @@
Функция ДопустимыеСимволыИмениЗаголовка() Экспорт
фРезультат = Новый Соответствие;
- Буквы = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- ДопустимыеСимволы = Буквы + НРег(Буквы) + "0123456789!#$%&'*+-.^_`|~";
+ ДопустимыеСимволы = КлиентHTTPПовтИсп.ДопустимыеСимволыИмениЗаголовкаСтрокой();
Для я = 1 По СтрДлина(ДопустимыеСимволы) Цикл
фРезультат.Вставить(Сред(ДопустимыеСимволы, я, 1), Истина);
@@ -1149,6 +1432,15 @@
Возврат Новый ФиксированноеСоответствие(фРезультат);
КонецФункции
+// Возвращает максимально допустимую для фреймворка длительность паузы в секундах
+//
+// Возвращаемое значение:
+// Число - количество секунд
+//
+Функция МаксимальноДопустимаяДлительностьПаузы() Экспорт
+ Возврат 3600;
+КонецФункции
+
// Возвращает имя события для журнала регистрации
//
// Возвращаемое значение:
diff --git "a/src/v1/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\241\320\265\321\200\320\262\320\265\321\200\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Ext/Module.bsl" "b/src/v1/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\241\320\265\321\200\320\262\320\265\321\200\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Ext/Module.bsl"
index 359f1d7..e00984c 100644
--- "a/src/v1/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\241\320\265\321\200\320\262\320\265\321\200\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Ext/Module.bsl"
+++ "b/src/v1/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\241\320\265\321\200\320\262\320\265\321\200\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Ext/Module.bsl"
@@ -2,7 +2,7 @@
// SPDX-License-Identifier: Apache-2.0+
#Область СлужебныйПрограммныйИнтерфейс
-// Возвращает словарь типов хеш-функций по наименованиям из заголовка WWW-Authenticate
+// (СЛУЖЕБНЫЙ) Возвращает словарь типов хеш-функций по наименованиям из заголовка WWW-Authenticate
//
// Возвращаемое значение:
// ФиксированноеСоответствие - словарь типов хеш-функций
diff --git "a/src/v1/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Ext/Module.bsl" "b/src/v1/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Ext/Module.bsl"
index b0c732c..20e5847 100644
--- "a/src/v1/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Ext/Module.bsl"
+++ "b/src/v1/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Ext/Module.bsl"
@@ -16,9 +16,7 @@
Возврат ПолучитьДвоичныеДанныеИзСтроки(Текст, Кодировка).Размер();
КонецФункции
-#КонецОбласти
-#Область СлужебныйПрограммныйИнтерфейс
// Возвращает строку Basic-аутентификации для пользователя и пароля
//
// Параметры:
@@ -78,6 +76,10 @@
КонецЦикла;
ЧастиДатыHTTP = СтрРазделить(ДатаHTTP, " ");
+ Если ЧастиДатыHTTP.Количество() < 7 Тогда
+ Ошибка = Истина;
+ Возврат фРезультат;
+ КонецЕсли;
Год = ОписаниеТипаЧисло.ПривестиЗначение(ЧастиДатыHTTP[3]);
Если Год < 70 Тогда
@@ -111,6 +113,7 @@
КонецФункции
// Возвращает текстовое представление даты RFC 1123
+// Date: Tue, 15-Nov-1994 08:12:31 GMT
//
// Параметры:
// Дата - Дата - конвертируемое значение
@@ -126,6 +129,23 @@
);
КонецФункции
+// Возвращает текстовое представление даты RFC 7231 (7.1.1.2)
+// Date: Tue, 15 Nov 1994 08:12:31 GMT
+//
+// Параметры:
+// Дата - Дата - конвертируемое значение
+//
+// Возвращаемое значение:
+// Строка - дата формата RFC 7231 (7.1.1.2)
+//
+Функция ДатаВHTTP7231(Знач Дата) Экспорт
+ Возврат СтрШаблон(
+ Формат(Дата, "ДФ='""%1"", дд ""%2"" гггг Ч:м:с ""GMT""'"),
+ ДеньНеделиНаАнглийском(Дата),
+ МесяцНаАнглийском(Дата)
+ );
+КонецФункции
+
// Возвращает преобразованный в ACE-последовательность IDN
//
// Параметры:
@@ -137,6 +157,86 @@
Функция НормализованныйАдресСервера(Знач АдресСервера) Экспорт
Возврат КодироватьАдресСервера(НРег(СокрЛП(АдресСервера)));
КонецФункции
+
+// Возвращает имя параметра запроса с экранированием
+//
+// Параметры:
+// Имя - Строка - имя параметра запроса
+//
+// Возвращаемое значение:
+// Строка - экранированное имя параметра запроса
+//
+Функция ФорматированноеИмяПараметраЗапроса(Знач Имя) Экспорт
+ Возврат СтрЗаменить(ФорматированноеЗначениеПараметраЗапроса(Имя), "=", "%3D");
+КонецФункции
+
+// Возвращает значение параметра запроса с экранированием
+//
+// Параметры:
+// Значение - Строка - значение параметра запроса
+//
+// Возвращаемое значение:
+// Строка - экранированное значение параметра запроса
+//
+Функция ФорматированноеЗначениеПараметраЗапроса(Знач Значение) Экспорт
+ Возврат СтрЗаменить(СтрЗаменить(СтрЗаменить(СокрЛП(Значение), Символы.ПС, ""), "#", "%23"), "&", "%26");
+КонецФункции
+
+// Создаёт файл путём конкатенации файлов сертификата и ключа формата PEM.
+// Полезно для использования объединённых сертификата и ключа в функции КлиентHTTPКлиентСервер.ИспользоватьФайлСертификатаКлиента.
+// Платформа 1С позволяет использовать только один файл. При необходимости передать ключ можно единым файлом с сертификатом,
+// объединив файл сертификата с файлом ключа этой функцией.
+//
+// Параметры:
+// ИмяФайла - Строка - полное имя создаваемого файла
+// Сертификат - Файл - файл сертификата формата PEM
+// Ключ - Файл - файл ключа сертификата формата PEM
+// ЗапретитьПерезапись - Булево - режим проаерки на существование создаваемого файла: если Истина, то вернётся ошибка в случае существования файла по указанному имени (возможен вызов исключения)
+//
+// Возвращаемое значение:
+// Обещание, Структура - объект ответа:
+// * Ошибка - Булево - признак наличия ошибки
+// * ОписаниеОшибки - Строка - описание ошибки
+//
+Функция ОбъединенныйФайлСертификатаИКлючаPEM(Знач ИмяФайла, Знач Сертификат, Знач Ключ, Знач ЗапретитьПерезапись = Ложь) Экспорт
+ фРезультат = Новый Структура("Ошибка, ОписаниеОшибки", Истина, "");
+ Сертификат = Новый Файл;
+ Если НЕ Сертификат.Существует() Тогда
+ фРезультат.ОписаниеОшибки = "не найден файл сертификата " + Сертификат.ПолноеИмя;
+ Возврат фРезультат;
+ КонецЕсли;
+ Если НЕ Ключ.Существует() Тогда
+ фРезультат.ОписаниеОшибки = "не найден файл ключа " + Ключ.ПолноеИмя;
+ Возврат фРезультат;
+ КонецЕсли;
+
+ Если ЗапретитьПерезапись Тогда
+ Ф = Новый Файл(ИмяФайла);
+ Если Ф.Существует() Тогда
+ фРезультат.ОписаниеОшибки = "файл уже существует: " + ИмяФайла;
+ Возврат фРезультат;
+ КонецЕсли;
+ Режим = РежимОткрытияФайла.СоздатьНовый;
+ Иначе
+ Режим = РежимОткрытияФайла.Создать;
+ КонецЕсли;
+
+ Поток = Новый ФайловыйПоток(ИмяФайла, Режим);
+ Если НЕ Поток.ДоступнаЗапись Тогда
+ Поток.Закрыть();
+ фРезультат.ОписаниеОшибки = "не доступна запись в файл " + ИмяФайла;
+ Возврат фРезультат;
+ КонецЕсли;
+
+ Запись = Новый ЗаписьДанных(Поток);
+ Запись.Записать(Новый ДвоичныеДанные(Сертификат.ПолноеИмя));
+ Запись.Записать(Новый ДвоичныеДанные(Ключ.ПолноеИмя));
+
+ Поток.Закрыть();
+
+ фРезультат.Ошибка = Ложь;
+ Возврат фРезультат;
+КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
diff --git a/src/v1/Configuration.xml b/src/v1/Configuration.xml
index 9a9ca3a..d7207ee 100644
--- a/src/v1/Configuration.xml
+++ b/src/v1/Configuration.xml
@@ -49,7 +49,7 @@
Russian
Брызгалин Андрей Васильевич (andrew.bryzgalin@gmail.com)
- 1.8.0
+ 1.11.0
https://github.com/SpaceHead1C/1c_http/releases
false
false
diff --git "a/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP.xml" "b/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP.xml"
index bf722a5..b28b980 100644
--- "a/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP.xml"
+++ "b/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP.xml"
@@ -33,6 +33,7 @@
+
\ No newline at end of file
diff --git "a/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\230\320\264\320\265\320\275\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\276\321\200\320\260\320\240\320\265\321\201\321\203\321\200\321\201\320\260/Ext/Form.xml" "b/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\230\320\264\320\265\320\275\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\276\321\200\320\260\320\240\320\265\321\201\321\203\321\200\321\201\320\260/Ext/Form.xml"
index 4beed88..54effc0 100644
--- "a/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\230\320\264\320\265\320\275\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\276\321\200\320\260\320\240\320\265\321\201\321\203\321\200\321\201\320\260/Ext/Form.xml"
+++ "b/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\230\320\264\320\265\320\275\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\276\321\200\320\260\320\240\320\265\321\201\321\203\321\200\321\201\320\260/Ext/Form.xml"
@@ -185,6 +185,21 @@
ПортПриИзменении
+
+ false
+ false
+ false
+ false
+
+
+
+ ru
+ /
+
+
+
+
+
АдресРесурса
@@ -195,12 +210,6 @@
Top
false
-
-
- ru
- /
-
-
@@ -310,6 +319,52 @@
+
+
+
+ ru
+ фрагмент
+
+
+ AlwaysHorizontal
+ None
+ false
+ DontUse
+
+
+
+ false
+ false
+ false
+ false
+
+
+
+ ru
+ #
+
+
+
+
+
+
+ Фрагмент
+ None
+
+
+ ru
+ Фрагмент
+
+
+ false
+
+
+
+ ФрагментПриИзменении
+
+
+
+
@@ -422,6 +477,21 @@
+
+
+
+ ru
+ Фрагмент
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
@@ -438,6 +508,7 @@
ОК
+ DontUse
diff --git "a/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\230\320\264\320\265\320\275\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\276\321\200\320\260\320\240\320\265\321\201\321\203\321\200\321\201\320\260/Ext/Form/Module.bsl" "b/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\230\320\264\320\265\320\275\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\276\321\200\320\260\320\240\320\265\321\201\321\203\321\200\321\201\320\260/Ext/Form/Module.bsl"
index 66cee05..75587f9 100644
--- "a/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\230\320\264\320\265\320\275\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\276\321\200\320\260\320\240\320\265\321\201\321\203\321\200\321\201\320\260/Ext/Form/Module.bsl"
+++ "b/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\230\320\264\320\265\320\275\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\276\321\200\320\260\320\240\320\265\321\201\321\203\321\200\321\201\320\260/Ext/Form/Module.bsl"
@@ -4,55 +4,63 @@
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ОписаниеТипаЧисло = Новый ОписаниеТипов("Число");
- ИР = Параметры.ИдентификаторРесурса;
+ ИдентификаторРесурса = Параметры.ИдентификаторРесурса;
- ЗащищенноеСоединение = СтрНачинаетсяС(ИР, "https://");
+ ЗащищенноеСоединение = СтрНачинаетсяС(ИдентификаторРесурса, "https://");
Если ЗащищенноеСоединение Тогда
Элементы.ДекорацияСхема.Заголовок = "https://";
КонецЕсли;
- ИР = СтрЗаменить(ИР, "https://", "");
- ИР = СтрЗаменить(ИР, "http://", "");
- ПозицияОкончания = СтрНайти(ИР, "?") - 1;
- Если ПозицияОкончания < 0 Тогда
- ПозицияОкончания = СтрДлина(ИР);
+ ИдентификаторРесурса = СтрЗаменить(ИдентификаторРесурса, "https://", "");
+ ИдентификаторРесурса = СтрЗаменить(ИдентификаторРесурса, "http://", "");
+ ПозицияСимволаПараметров = СтрНайти(ИдентификаторРесурса, "?");
+ ПозицияСимволаФрагмента = СтрНайти(ИдентификаторРесурса, "#", , ?(ПозицияСимволаПараметров = 0, 1, ПозицияСимволаПараметров));
+ Если ПозицияСимволаФрагмента > 0 Тогда
+ Фрагмент = Сред(ИдентификаторРесурса, ПозицияСимволаФрагмента + 1);
КонецЕсли;
+ ПозицияОкончания = ?(ПозицияСимволаПараметров = 0, ПозицияСимволаФрагмента, ПозицияСимволаПараметров) - 1;
+ Если ПозицияОкончания > 0 Тогда
+ ИдентификаторРесурса = Лев(ИдентификаторРесурса, ПозицияОкончания);
+ КонецЕсли;
+ ПозицияОкончания = СтрДлина(ИдентификаторРесурса);
- ПозицияПослеАвторизации = СтрНайти(ИР, "@");
+ ПозицияПослеАвторизации = СтрНайти(ИдентификаторРесурса, "@");
Если ПозицияПослеАвторизации > 0 И ПозицияПослеАвторизации < ПозицияОкончания Тогда
- Авторизация = Лев(ИР, ПозицияПослеАвторизации - 1);
+ Авторизация = Лев(ИдентификаторРесурса, ПозицияПослеАвторизации - 1);
ДлинаАвторизации = СтрДлина(Авторизация);
ПозицияРазделителяАвторизации = СтрНайти(Авторизация, ":");
Если ПозицияРазделителяАвторизации = 0 Тогда
ПозицияРазделителяАвторизации = ДлинаАвторизации + 1;
КонецЕсли;
- ЗакодированныеДанные = Новый Структура("Пользователь, Пароль");
- ЗакодированныеДанные.Пользователь = СокрЛП(Лев(Авторизация, ПозицияРазделителяАвторизации - 1));
- ЗакодированныеДанные.Пароль = Прав(Авторизация, ДлинаАвторизации - ПозицияРазделителяАвторизации);
- РаскодированныеДанные = КлиентHTTP.РаскодированныеСтроки(ЗакодированныеДанные);
+ ЗакодированныйПользователь = СокрЛП(Лев(Авторизация, ПозицияРазделителяАвторизации - 1));
+ ЗакодированныйПароль = Прав(Авторизация, ДлинаАвторизации - ПозицияРазделителяАвторизации);
+ МножествоСтрок = Новый Соответствие;
+ МножествоСтрок.Вставить(ЗакодированныйПользователь);
+ МножествоСтрок.Вставить(ЗакодированныйПароль);
- Пользователь = РаскодированныеДанные.Пользователь;
- Пароль = РаскодированныеДанные.Пароль;
- ИР = Сред(ИР, ПозицияПослеАвторизации + 1);
- ПозицияОкончания = СтрДлина(ИР);
+ МножествоСтрок = КлиентHTTP.РаскодированныеСтрокиURLвURL(МножествоСтрок);
+ Пользователь = МножествоСтрок.Получить(ЗакодированныйПользователь);
+ Пароль = МножествоСтрок.Получить(ЗакодированныйПароль);
+ ИдентификаторРесурса = Сред(ИдентификаторРесурса, ПозицияПослеАвторизации + 1);
+ ПозицияОкончания = СтрДлина(ИдентификаторРесурса);
КонецЕсли;
- ПозицияАдресаРесурса = СтрНайти(ИР, "/");
+ ПозицияАдресаРесурса = СтрНайти(ИдентификаторРесурса, "/");
Если ПозицияАдресаРесурса > 0 Тогда
- АдресРесурса = Сред(ИР, ПозицияАдресаРесурса, ПозицияОкончания - ПозицияАдресаРесурса + 1);
+ АдресРесурса = Сред(ИдентификаторРесурса, ПозицияАдресаРесурса + 1, ПозицияОкончания - ПозицияАдресаРесурса + 1);
ПозицияОкончания = ПозицияАдресаРесурса - 1;
КонецЕсли;
- ПозицияПорта = СтрНайти(ИР, ":", НаправлениеПоиска.СКонца, ПозицияОкончания);
+ ПозицияПорта = СтрНайти(ИдентификаторРесурса, ":", НаправлениеПоиска.СКонца, ПозицияОкончания);
Если ПозицияПорта > 0 Тогда
- Порт = ОписаниеТипаЧисло.ПривестиЗначение(Сред(ИР, ПозицияПорта + 1, ПозицияОкончания));
+ Порт = ОписаниеТипаЧисло.ПривестиЗначение(Сред(ИдентификаторРесурса, ПозицияПорта + 1, ПозицияОкончания - ПозицияПорта));
ПозицияОкончания = ПозицияПорта - 1;
Иначе
Порт = ?(ЗащищенноеСоединение, 443, 80);
КонецЕсли;
- Сервер = Лев(ИР, ПозицияОкончания);
+ Сервер = Лев(ИдентификаторРесурса, ПозицияОкончания);
КонецПроцедуры
&НаКлиенте
@@ -73,7 +81,7 @@
Возврат;
КонецЕсли;
- Закрыть(ИдентификаторРесурса());
+ Закрыть(ИдентификаторРесурса() + ?(ПустаяСтрока(Фрагмент), "", "#" + Фрагмент));
КонецПроцедуры
#КонецОбласти
@@ -121,13 +129,18 @@
Процедура ПарольПриИзменении(Элемент)
URI = ИдентификаторРесурса();
КонецПроцедуры
+
+&НаКлиенте
+Процедура ФрагментПриИзменении(Элемент)
+ URI = ИдентификаторРесурса();
+КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаКлиенте
Функция ИдентификаторРесурса()
ЧастиURL = Новый Массив;
- ЧастиURL.Добавить(Элементы.ДекорацияСхема.Заголовок);
+ ЧастиURL.Добавить(?(ЗащищенноеСоединение, "https://", "http://"));
Если НЕ ПустаяСтрока(Пользователь) Тогда
КоллекцияСтрок = Новый Структура("Пользователь, Пароль", Пользователь, Пароль);
@@ -155,6 +168,11 @@
ЧастиURL.Добавить(АдресРесурса);
+ Фрагмент = СокрЛП(Фрагмент);
+ Если НЕ ПустаяСтрока(Фрагмент) И СтрНачинаетсяС(Фрагмент, "#") Тогда
+ Фрагмент = СокрЛ(Сред(Фрагмент, 2));
+ КонецЕсли;
+
Возврат СтрСоединить(ЧастиURL);
КонецФункции
diff --git "a/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\240\320\265\320\264\320\260\320\272\321\202\320\276\321\200\320\242\320\265\320\272\321\201\321\202\320\276\320\262\320\276\320\263\320\276\320\237\320\276\320\273\321\217/Ext/Form.xml" "b/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\240\320\265\320\264\320\260\320\272\321\202\320\276\321\200\320\242\320\265\320\272\321\201\321\202\320\276\320\262\320\276\320\263\320\276\320\237\320\276\320\273\321\217/Ext/Form.xml"
index 2dee379..93b1c74 100644
--- "a/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\240\320\265\320\264\320\260\320\272\321\202\320\276\321\200\320\242\320\265\320\272\321\201\321\202\320\276\320\262\320\276\320\263\320\276\320\237\320\276\320\273\321\217/Ext/Form.xml"
+++ "b/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\240\320\265\320\264\320\260\320\272\321\202\320\276\321\200\320\242\320\265\320\272\321\201\321\202\320\276\320\262\320\276\320\263\320\276\320\237\320\276\320\273\321\217/Ext/Form.xml"
@@ -47,6 +47,9 @@
false
+
+ РедактируемыйТекстИзменениеТекстаРедактирования
+
@@ -109,5 +112,11 @@
+
+
+ v8ui:Color
+ v8:Null
+
+
\ No newline at end of file
diff --git "a/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\240\320\265\320\264\320\260\320\272\321\202\320\276\321\200\320\242\320\265\320\272\321\201\321\202\320\276\320\262\320\276\320\263\320\276\320\237\320\276\320\273\321\217/Ext/Form/Module.bsl" "b/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\240\320\265\320\264\320\260\320\272\321\202\320\276\321\200\320\242\320\265\320\272\321\201\321\202\320\276\320\262\320\276\320\263\320\276\320\237\320\276\320\273\321\217/Ext/Form/Module.bsl"
index 68f59bc..b32b1f8 100644
--- "a/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\240\320\265\320\264\320\260\320\272\321\202\320\276\321\200\320\242\320\265\320\272\321\201\321\202\320\276\320\262\320\276\320\263\320\276\320\237\320\276\320\273\321\217/Ext/Form/Module.bsl"
+++ "b/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\240\320\265\320\264\320\260\320\272\321\202\320\276\321\200\320\242\320\265\320\272\321\201\321\202\320\276\320\262\320\276\320\263\320\276\320\237\320\276\320\273\321\217/Ext/Form/Module.bsl"
@@ -9,6 +9,17 @@
КонецЕсли;
РедактируемыйТекст = Параметры.Текст;
+
+ Если Параметры.ЦветРедактируемогоТекста <> Неопределено Тогда
+ Элементы.РедактируемыйТекст.ЦветТекста = Параметры.ЦветРедактируемогоТекста;
+ КонецЕсли;
+КонецПроцедуры
+#КонецОбласти
+
+#Область ОбработчикиСобытийПоляРедактируемогоТекста
+&НаКлиенте
+Процедура РедактируемыйТекстИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)
+ Элементы.РедактируемыйТекст.ЦветТекста = Новый Цвет;
КонецПроцедуры
#КонецОбласти
diff --git "a/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml" "b/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml"
index 506ca56..bb011b3 100644
--- "a/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml"
+++ "b/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml"
@@ -477,6 +477,7 @@
true
true
true
+ AsFile
ПараметрыЗапроса
@@ -561,115 +562,162 @@
-
+
ru
- Авторизация
+ Аутентификация
ru
- Раздел авторизация
+ Раздел аутентификация
-
+
-
- ТипАвторизации
+
ru
- Тип
+ Группа тип аутентификации
- 15
- false
- false
- true
- false
- false
- false
- false
- false
- false
- false
-
-
-
- 0
-
-
-
- ru
- Без авторизации
-
-
- Без авторизации
-
-
-
-
- 0
-
-
-
- ru
- Basic
-
-
- Basic
-
-
-
-
- 0
-
-
-
- ru
- NTLM
-
-
- NTLM
-
-
-
-
- 0
-
-
-
- ru
- Digest
-
-
- Digest
-
-
-
-
- 0
-
-
-
- ru
- Bearer
-
-
- Bearer
-
-
-
-
-
-
- ТипАвторизацииПриИзменении
-
-
-
- ПользовательАвторизации
+
+
+ ru
+ Группа тип аутентификации
+
+
+ AlwaysHorizontal
+ None
+ false
+ DontUse
+
+
+
+ ТипАутентификации
+
+
+ ru
+ Тип
+
+
+ 15
+ false
+ false
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+
+ 0
+
+
+
+ ru
+ Без авторизации
+
+
+ Без авторизации
+
+
+
+
+ 0
+
+
+
+ ru
+ Basic
+
+
+ Basic
+
+
+
+
+ 0
+
+
+
+ ru
+ NTLM
+
+
+ NTLM
+
+
+
+
+ 0
+
+
+
+ ru
+ Digest
+
+
+ Digest
+
+
+
+
+ 0
+
+
+
+ ru
+ Bearer
+
+
+ Bearer
+
+
+
+
+ 0
+
+
+
+ ru
+ AWS4-HMAC-SHA256
+
+
+ AWS4-HMAC-SHA256
+
+
+
+
+ 0
+
+
+
+ ru
+ Hawk
+
+
+ Hawk
+
+
+
+
+
+
+ ТипАутентификацииПриИзменении
+
+
+
+
+
+ ПользовательАутентификации
false
@@ -679,30 +727,30 @@
false
false
-
-
+
+
-
+
false
ru
- Группа пароль авторизации
+ Группа пароль аутентификации
ru
- Группа пароль авторизации
+ Группа пароль аутентификации
AlwaysHorizontal
None
false
-
+
-
- ПарольАвторизации
+
+ ПарольАутентификации
ru
@@ -712,42 +760,42 @@
false
false
true
-
-
+
+
-
-
+
false
ru
- Группа токен авторизации
+ Группа токен аутентификации
ru
- Группа токен авторизации
+ Группа токен аутентификации
AlwaysHorizontal
None
false
-
+
-
- ТокенАвторизации
+
+ ТокенАутентификации
ru
@@ -757,21 +805,264 @@
false
false
true
-
-
+
+
+
+
+ UsualButton
+ Picture
+ Form.Command.ПоказатьТокенАутентификации
+
+ StdPicture.DataSearch
+ true
+
+
+
+
+
+
+ AWSКлючДоступа
+ false
+
+
+ ru
+ Ключ доступа
+
+
+ false
+ true
+ false
+
+
+
+
+ false
+
+
+ ru
+ Группа секретный ключ AWS
+
+
+
+
+ ru
+ Группа секретный ключ AWS
+
+
+ AlwaysHorizontal
+ None
+ false
+
+
+
+ AWSСекретныйКлюч
+
+
+ ru
+ Секретный ключ
+
+
+ false
+ true
+ false
+ true
+
+
+
+
+ UsualButton
+ Picture
+ Form.Command.ПоказатьСекретныйКлючAWS
+
+ StdPicture.DataSearch
+ true
+
+
+
+
+
+
+ AWSРегион
+ false
+
+
+ ru
+ Регион
+
+
+ false
+ true
+ false
+ true
+ false
+ true
+ false
+ false
+ false
+
+
+
+
+ AWSСервис
+ false
+
+
+ ru
+ Сервис
+
+
+ false
+ true
+ false
+
+
+ ru
+ например, s3
+
+
+
+
+
+
+ HawkИдентификатор
+ false
+
+
+ ru
+ Идентификатор
+
+
+ false
+ true
+ false
+
+
+
+
+ false
+
+
+ ru
+ Группа ключ hawk
+
+
+
+
+ ru
+ Группа ключ hawk
+
+
+ AlwaysHorizontal
+ None
+ false
+
+
+
+ HawkКлюч
+
+
+ ru
+ Ключ
+
+
+ false
+ true
+ false
+ true
+
+
+
+
+ ru
+ Секретный ключ
+
+
+
-
+
UsualButton
Picture
- Form.Command.ПоказатьТокенАвторизации
+ Form.Command.ПоказатьКлючHawk
StdPicture.DataSearch
true
-
+
+
+ HawkДополнение
+ false
+
+
+ ru
+ ext
+
+
+ false
+ true
+ false
+
+
+ ru
+ нарпимер, some-app-extra-data
+
+
+
+
+
+
+ ru
+ Специфические данные клиента
+
+
+
+
+
+ HawkИдентификаторПриложения
+ false
+
+
+ ru
+ app
+
+
+ false
+ true
+ false
+
+
+
+
+ ru
+ Идентификатор приложения
+
+
+
+
+
+ HawkДелегирование
+ false
+
+
+ ru
+ dlg
+
+
+ false
+ true
+ false
+
+
+
+
+ ru
+ Делегированный идентификатор приложения
+
+
+
+
@@ -795,6 +1086,7 @@
true
true
true
+ AsFile
ЗаголовкиЗапроса
@@ -1029,6 +1321,7 @@
false
false
true
+ AsFile
ТелоЗапросаДанныеФормы
@@ -1180,6 +1473,7 @@
false
false
true
+ AsFile
ТелоЗапросаДанныеHTMLФормы
@@ -1573,6 +1867,7 @@
true
true
true
+ AsFile
ЗаголовкиОтвета
@@ -1715,7 +2010,7 @@
ru
- HTML
+ Просмотр
HTML
@@ -1864,6 +2159,7 @@
false
false
AutoSize
+ AsFile
@@ -2053,6 +2349,7 @@
Группа контекст выполнения
+ AlwaysHorizontal
None
false
@@ -2113,8 +2410,24 @@
-
-
+
+ ОтображатьСекреты
+ Button
+ Auto
+
+
+
+
+ ru
+ Режим отображения секретов в результатах кодогенерации и экспорта в команду curl.
+
+Если опция отключена, отображение секретов регулируется индивидуально интерфейсными кнопками для каждого поля с секретом.
+
+
+
+
+
+
ru
Группа файл тела ответа
@@ -2126,6 +2439,7 @@
Группа файл тела ответа
+ AlwaysHorizontal
None
false
@@ -2149,9 +2463,13 @@
+
+ ТелоОтветаВФайлПриИзменении
+
ИмяФайлаТелаОтвета
+ false
ru
@@ -2168,7 +2486,6 @@
- ИмяФайлаТелаОтветаПриИзменении
ИмяФайлаТелаОтветаНачалоВыбора
@@ -2194,6 +2511,59 @@
+
+ АгентПользователя
+
+
+ ru
+ Пользовательское значение заголовка "User-Agent"
+
+
+ Button
+ false
+ true
+ false
+ false
+ false
+ true
+ false
+ false
+ false
+
+
+ ru
+ значение платформы по умолчанию
+
+
+
+
+
+
+ ru
+ Пользовательское значение заголовка "User-Agent"
+
+
+
+
+
+ Таймаут
+
+
+ ru
+ Таймаут соединения в секундах
+
+
+ Button
+ true
+
+
+ ru
+ ЧН=
+
+
+
+
+
@@ -2271,6 +2641,19 @@
+
+ ПеренаправлениеКакGET
+
+
+ ru
+ Принудительно переключаться на метод GET для кодов перенаправления 301 и 302
+
+
+ Button
+ Auto
+
+
+
ПоддержкаCookie
@@ -2297,172 +2680,720 @@
-
+
ru
- Прокси
+ Повторное выполнение
ru
- Группа прокси
+ Повторять попытки выполнить HTTP-запрос после неуспешного результата.
+
+Неуспешным считается вызов исключения и ответ с кодом состояния 5хх или каким-либо из определённых пользователем.
+ Button
Vertical
- NormalSeparation
-
+
-
- ИспользоватьПрокси
+
+ СпособПовторногоВыполнения
ru
- Использовать
+ Способ
ru
- Использовать прокси-сервер для выполнения запроса
+ Способ расчёта паузы перед повторным выполнением
Button
- Auto
-
-
+ true
+ false
+ false
+ false
+ false
+ false
+ true
+ false
+
+
+
+ 0
+
+
+
+ ru
+ Разово
+
+
+ Разово
+
+
+
+
+ 0
+
+
+
+ ru
+ Фиксировано
+
+
+ Фиксировано
+
+
+
+
+ 0
+
+
+
+ ru
+ Линейно
+
+
+ Линейно
+
+
+
+
+ 0
+
+
+
+ ru
+ Экспоненциально
+
+
+ Экспоненциально
+
+
+
+
+
- ИспользоватьПроксиПриИзменении
+ СпособПовторногоВыполненияПриИзменении
-
-
- НеИспользоватьПроксиДляЛокальныхАдресов
+
+
false
ru
- Кроме локальных адресов
+ Группа параметры повторного выполнения
ru
- Если опция включена, то при запросе ресурсов с локальных адресов прокси не используется
+ Группа параметры повторного выполнения
- Button
- Auto
-
-
-
-
- СерверПрокси
- false
-
-
- ru
- Сервер
-
-
- true
-
-
-
-
- ПортПрокси
- false
+ Vertical
+ None
+ false
+
+
+
+
+
+ ru
+ Группа параметры длительности паузы
+
+
+
+
+ ru
+ Группа параметры длительности паузы
+
+
+ AlwaysHorizontal
+ None
+ false
+
+
+
+ ДлительностьПаузыПовторногоВыполнения
+
+
+ ru
+ Длительность
+
+
+
+
+ ru
+ Длительность в секундах паузы после первой попытки выполнения HTTP-запроса
+
+
+ Button
+
+
+
+
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения
+
+
+ ru
+ в пределе до
+
+
+
+
+ ru
+ Максимальная длительность в секундах паузы между попытками в секундах (ограничение фреймворка 3600)
+
+
+ Button
+
+
+
+
+ КоэффициентУвеличенияПаузыПовторногоВыполнения
+
+
+ ru
+ Коэффициент
+
+
+
+
+ ru
+ Коэффициент увеличения паузы между попытками выполнить HTTP-запрос
+
+
+ Button
+
+
+
+
+ ПорогКоличестваПопытокПовторногоВыполнения
+
+
+ ru
+ Количество попыток
+
+
+
+
+ ru
+ Максимальное количество неуспешных попыток выполнить HTTP-запрос
+
+
+ Button
+ 1
+
+
+
+
+
+
+ КодыСостоянияОтветаПовторногоВыполнения
+
+
+ ru
+ Коды состояния ответа
+
+
+
+
+ ru
+ коды состояния ответа, при получении которых необходимо повторять попытки
+
+
+ Button
+ false
+ false
+ false
+ true
+ true
+ false
+ false
+ false
+ 999
+ 100
+ 599
+
+
+
+
+
+
+
+
+
+
+ ru
+ SSL сертификаты
+
+
+
+
+ ru
+ Группа сертификаты
+
+
+ Vertical
+
+
+
+ ИспользоватьСертификаты
ru
- Порт
+ Использовать
-
-
-
-
- ПользовательПрокси
- false
-
+
ru
- Пользователь
+ Использовать клиентский сертификат OpenSSL для выполнения запроса
-
- false
-
-
-
-
+
+ Button
+ Auto
+
+
+
+ ИспользоватьСертификатыПриИзменении
+
+
+
false
ru
- Группа пароль прокси
+ Группа клиентский сертификат
ru
- Группа пароль прокси
+ Группа клиентский сертификат
+ true
+ false
AlwaysHorizontal
None
false
-
+
-
- ПарольПрокси
+
+ ИмяФайлаКлиентскогоСертификата
ru
- Пароль
+ Файл клиентского сертификата
+ Button
false
- true
-
-
+ false
+ true
+ false
+ false
+ true
+ false
+ false
+ false
+ false
+ false
+
+
+
+
+ ru
+ Путь к файлу клиентского сертификата OpenSSL. Допустимо применение форматов PEM и PKCS#12.
+
+Если требуется передавать два файла - сертификат и его ключ - можно получить конкатенацию этих файлов и передать получившийся единый файл как сертификат. Воспользуйтесь кнопкой "Объединить сертификат и ключ"
+
+
+
+
+ ИмяФайлаКлиентскогоСертификатаНачалоВыбора
+
-
+
UsualButton
Picture
- Form.Command.ПоказатьПарольПрокси
+ Form.Command.ОбъединитьСертификатИКлюч
- StdPicture.DataSearch
+ StdPicture.DataCompositionNewNestedScheme
true
-
+
-
- ИспользоватьАутентификациюОСПрокси
+
false
ru
- Аутентификация ОС
+ Группа пароль клиентского сертификата
ru
- Использовать аутентификацию ОС для осуществления NTLM-аутентификации на прокси. Если опция выключена, то будет выполнена Basic-аутентификация
+ Группа пароль клиентского сертификата
- Button
- Auto
-
-
-
-
-
-
-
-
+ AlwaysHorizontal
+ None
+ false
+
+
+
+ ПарольКлиентскогоСертификата
+ false
+ false
+ true
+ false
+ true
+
+
+
+
+ UsualButton
+ Picture
+ Form.Command.ПоказатьПарольКлиентскогоСертификата
+
+ StdPicture.DataSearch
+ true
+
+
+
+
+
+
+ ИмяФайлаСертификатовУЦ
+ false
+
+
+ ru
+ Файл сертификатов УЦ
+
+
+
+
+ ru
+ Путь к файлу сертификатов удостоверяющих центров OpenSSL, загружаемые из системного хранилища сертификатов операционной системы. Допустимо применение форматов PEM и PKCS#12.
+
+
+ Button
+ false
+ false
+ true
+ false
+ false
+ true
+ false
+ false
+ false
+ false
+ false
+
+
+
+ ИмяФайлаСертификатовУЦНачалоВыбора
+
+
+
+ false
+
+
+ ru
+ Группа пароль файла сертификатов УЦ
+
+
+
+
+ ru
+ Группа пароль файла сертификатов УЦ
+
+
+ AlwaysHorizontal
+ None
+ false
+
+
+
+ ПарольФайлаСертификатовУЦ
+ false
+ false
+ true
+ false
+ true
+
+
+
+
+ UsualButton
+ Picture
+ Form.Command.ПоказатьПарольФайлаСертификатовУЦ
+
+ StdPicture.DataSearch
+ true
+
+
+
+
+
+
+
+
+
+
+ ru
+ Прокси
+
+
+
+
+ ru
+ Группа прокси
+
+
+ Vertical
+ NormalSeparation
+
+
+
+ ИспользоватьПрокси
+
+
+ ru
+ Использовать
+
+
+
+
+ ru
+ Использовать прокси-сервер для выполнения запроса
+
+
+ Button
+ Auto
+
+
+
+ ИспользоватьПроксиПриИзменении
+
+
+
+ НеИспользоватьПроксиДляЛокальныхАдресов
+ false
+
+
+ ru
+ Кроме локальных адресов
+
+
+
+
+ ru
+ Если опция включена, то при запросе ресурсов с локальных адресов прокси не используется
+
+
+ Button
+ Auto
+
+
+
+
+ false
+
+
+ ru
+ Сервер прокси
+
+
+ AlwaysHorizontal
+ None
+ false
+
+
+
+ ПротоколПрокси
+
+
+ ru
+ Сервер
+
+
+
+
+ ru
+ Протокол прокси
+
+
+ false
+ false
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+
+ 0
+
+
+
+ ru
+ https
+
+
+ https
+
+
+
+
+ 0
+
+
+
+ ru
+ http
+
+
+ http
+
+
+
+
+
+
+
+ СерверПрокси
+
+
+ ru
+ Сервер
+
+
+ None
+
+
+ ru
+ Сервер прокси
+
+
+ false
+ false
+ false
+ true
+
+
+
+
+
+
+ ПортПрокси
+ false
+
+
+ ru
+ Порт
+
+
+
+
+
+
+ ПользовательПрокси
+ false
+
+
+ ru
+ Пользователь
+
+
+ false
+
+
+
+
+ false
+
+
+ ru
+ Группа пароль прокси
+
+
+
+
+ ru
+ Группа пароль прокси
+
+
+ AlwaysHorizontal
+ None
+ false
+
+
+
+ ПарольПрокси
+
+
+ ru
+ Пароль
+
+
+ false
+ true
+
+
+
+
+ UsualButton
+ Picture
+ Form.Command.ПоказатьПарольПрокси
+
+ StdPicture.DataSearch
+ true
+
+
+
+
+
+
+ ИспользоватьАутентификациюОСПрокси
+ false
+
+
+ ru
+ Аутентификация ОС
+
+
+
+
+ ru
+ Использовать аутентификацию ОС для осуществления NTLM-аутентификации на прокси. Если опция выключена, то будет выполнена Basic-аутентификация
+
+
+ Button
+ Auto
+
+
+
+
+
+
+
+
@@ -2542,6 +3473,7 @@
false
true
true
+ AsFile
История
Add
@@ -2709,55 +3641,220 @@
- cfg:DataProcessorObject.КонсольКлиентаHTTP
+ cfg:DataProcessorObject.КонсольКлиентаHTTP
+
+ true
+
+
+
+
+ ru
+ Идентификатор ресурса
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ Параметры запроса
+
+
+
+ v8:ValueTable
+
+
+ ПараметрыЗапроса.Значение
+
+
+
+
+
+ ru
+ Имя
+
+
+
+ xs:string
+
+ 100
+ Variable
+
+
+
+
+
+
+ ru
+ Значение
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ Активно
+
+
+
+ xs:boolean
+
+
+
+
+
+
+
+ ru
+ Ответ текст
+
+
+
+ fd:FormattedDocument
+
+
+
+
+
+ ru
+ Код состояния
+
+
+
+ xs:decimal
+
+ 3
+ 0
+ Nonnegative
+
+
+
+
+
+
+ ru
+ Заголовки ответа
+
+
+
+ v8:ValueTable
+
+
+
+
+
+ ru
+ Ключ
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ Значение
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+
+
+ ru
+ Значение заголовка ответа
+
+
+
+ xs:string
+
+ 0
+ Variable
+
- true
-
+
ru
- Идентификатор ресурса
+ Схема
xs:string
- 0
+ 8
Variable
-
+
ru
- Параметры запроса
+ Заголовки запроса
v8:ValueTable
-
- ПараметрыЗапроса.Значение
-
-
+
ru
- Имя
+ Активно
+
+
+
+ xs:boolean
+
+
+
+
+
+ ru
+ Ключ
xs:string
- 100
+ 0
Variable
-
+
ru
@@ -2772,7 +3869,110 @@
-
+
+
+
+
+
+ ru
+ Тип аутентификации
+
+
+
+ xs:string
+
+ 25
+ Variable
+
+
+
+
+
+
+ ru
+ Пользователь аутентификации
+
+
+
+ xs:string
+
+ 100
+ Variable
+
+
+
+
+
+
+ ru
+ Пароль аутентификации
+
+
+
+ xs:string
+
+ 255
+ Variable
+
+
+
+
+
+
+ ru
+ Тело запроса текст
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ Тип тела запроса
+
+
+
+ xs:string
+
+ 100
+ Variable
+
+
+
+
+
+
+ ru
+ Тип тела запроса как есть
+
+
+
+ xs:string
+
+ 10
+ Variable
+
+
+
+
+
+
+ ru
+ Тело запроса данные формы
+
+
+
+ v8:ValueTable
+
+
+
ru
@@ -2783,83 +3983,187 @@
xs:boolean
+
+
+
+ ru
+ Тип
+
+
+
+ xs:string
+
+ 10
+ Variable
+
+
+
+
+
+
+ ru
+ Ключ
+
+
+
+ xs:string
+
+ 1000
+ Variable
+
+
+
+
+
+
+ ru
+ Значение
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
-
+
+
+
+ ru
+ Тело запроса файл
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ Разделитель
+
+
+
+ xs:string
+
+ 1000
+ Variable
+
+
+
+
+
+
+ ru
+ Дополнительно
+
+
+
+
+
+
+
+ ru
+ Имя файла тела
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
ru
- Ответ текст
+ Использовать сессию
- fd:FormattedDocument
+ xs:boolean
-
+
ru
- Код состояния
+ Количество
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ Порог перенаправлений
xs:decimal
- 3
+ 2
0
Nonnegative
-
+
ru
- Заголовки ответа
+ Поддержка cookie
- v8:ValueTable
+ xs:boolean
-
-
-
-
- ru
- Ключ
-
-
-
- xs:string
-
- 0
- Variable
-
-
-
-
-
-
- ru
- Значение
-
-
-
- xs:string
-
- 0
- Variable
-
-
-
-
-
+
ru
- Значение заголовка ответа
+ Поддержка сжатого ответа
+
+
+
+ xs:boolean
+
+
+
+
+
+ ru
+ Тело ответа в файл
+
+
+
+ xs:boolean
+
+
+
+
+
+ ru
+ Имя файла тела ответа
@@ -2870,26 +4174,26 @@
-
+
ru
- Схема
+ Токен аутентификации
xs:string
- 8
+ 255
Variable
-
+
ru
- Заголовки запроса
+ Тело запроса данные HTMLФормы
@@ -2917,7 +4221,7 @@
xs:string
- 0
+ 1000
Variable
@@ -2939,26 +4243,26 @@
-
+
ru
- Тип авторизации
+ Ответ картинка
xs:string
- 25
+ 0
Variable
-
+
ru
- Пользователь авторизации
+ Формат тела ответа
@@ -2969,26 +4273,95 @@
-
+
ru
- Пароль авторизации
+ Ответ HTML
xs:string
- 255
+ 0
Variable
-
+
ru
- Тело запроса текст
+ Ответ JSON
+
+
+
+ fd:FormattedDocument
+
+
+
+
+
+ ru
+ Время выполнения
+
+
+
+ xs:decimal
+
+ 15
+ 2
+ Nonnegative
+
+
+
+
+
+
+ ru
+ Размер ответа
+
+
+
+ xs:decimal
+
+ 15
+ 2
+ Nonnegative
+
+
+
+
+
+
+ ru
+ Разделы консоли
+
+
+
+ xs:string
+
+ 100
+ Variable
+
+
+
+
+
+
+ ru
+ Использовать прокси
+
+
+
+ xs:boolean
+
+
+
+
+
+ ru
+ Сервер прокси
@@ -2999,93 +4372,192 @@
-
+
ru
- Тип тела запроса
+ Порт прокси
+
+
+
+ xs:decimal
+
+ 5
+ 0
+ Nonnegative
+
+
+
+
+
+
+ ru
+ Пользователь прокси
xs:string
- 100
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ Пароль прокси
+
+
+
+ xs:string
+
+ 0
Variable
-
+
+
+
+ ru
+ Использовать аутентификацию ОСПрокси
+
+
+
+ xs:boolean
+
+
+
+
+
+ ru
+ Не использовать прокси для локальных адресов
+
+
+
+ xs:boolean
+
+
+
ru
- Тип тела запроса как есть
+ Выполнять на сервере
- xs:string
-
- 10
- Variable
-
+ xs:boolean
-
+
ru
- Тело запроса данные формы
+ История
v8:ValueTable
-
+
ru
- Активно
+ Временная метка
- xs:boolean
+ xs:decimal
+
+ 15
+ 0
+ Nonnegative
+
-
+
ru
- Тип
+ Дата
+
+
+
+ xs:dateTime
+
+ DateTime
+
+
+
+
+
+
+ ru
+ Код состояния
+
+
+
+ xs:decimal
+
+ 3
+ 0
+ Nonnegative
+
+
+
+
+
+
+ ru
+ Схема
xs:string
- 10
+ 8
Variable
-
+
ru
- Ключ
+ Протокол
xs:string
- 1000
+ 5
Variable
-
+
ru
- Значение
+ Хост
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ URN
@@ -3096,142 +4568,114 @@
+
+
+
+ ru
+ Контекст выполнения
+
+
+
+ xs:string
+
+ 10
+ Variable
+
+
+
-
+
ru
- Тело запроса файл
+ Сохранять в историю
- xs:string
-
- 0
- Variable
-
+ xs:boolean
-
+
ru
- Разделитель
+ Протокол прокси
xs:string
- 1000
+ 5
Variable
-
-
-
- ru
- Дополнительно
-
-
-
-
-
+
ru
- Имя файла тела
+ Регион AWS
xs:string
- 0
+ 100
Variable
-
-
-
- ru
- Использовать сессию
-
-
-
- xs:boolean
-
-
-
+
ru
- Количество
+ Секретный ключ AWS
xs:string
- 0
+ 1000
Variable
-
-
-
- ru
- Порог перенаправлений
-
-
-
- xs:decimal
-
- 2
- 0
- Nonnegative
-
-
-
-
-
-
- ru
- Поддержка cookie
-
-
-
- xs:boolean
-
-
-
+
ru
- Поддержка сжатого ответа
+ Сервис AWS
- xs:boolean
+ xs:string
+
+ 100
+ Variable
+
-
+
ru
- Тело ответа в файл
+ Ключ доступа AWS
- xs:boolean
+ xs:string
+
+ 1000
+ Variable
+
-
+
ru
- Имя файла тела ответа
+ Ключ Hawk
@@ -3242,80 +4686,41 @@
-
+
ru
- Токен авторизации
+ Идентификатор Hawk
xs:string
- 255
+ 0
Variable
-
+
ru
- Тело запроса данные HTMLФормы
+ Дополнительные данные Hawk
- v8:ValueTable
+ xs:string
+
+ 0
+ Variable
+
-
-
-
-
- ru
- Активно
-
-
-
- xs:boolean
-
-
-
-
-
- ru
- Ключ
-
-
-
- xs:string
-
- 1000
- Variable
-
-
-
-
-
-
- ru
- Значение
-
-
-
- xs:string
-
- 0
- Variable
-
-
-
-
-
+
ru
- Ответ картинка
+ Идентификатор приложения Hawk
@@ -3326,26 +4731,26 @@
-
+
ru
- Формат тела ответа
+ Делегирование Hawk
xs:string
- 100
+ 0
Variable
-
+
ru
- Ответ HTML
+ Агент пользователя
@@ -3356,126 +4761,140 @@
-
+
ru
- Ответ JSON
+ Перенаправление как GET
- fd:FormattedDocument
+ xs:boolean
-
+
ru
- Время выполнения
+ Таймаут
xs:decimal
- 15
- 2
+ 3
+ 0
Nonnegative
-
+
ru
- Размер ответа
+ Длительность паузы повторного выполнения
xs:decimal
- 15
- 2
+ 4
+ 0
Nonnegative
-
+
ru
- Разделы консоли
+ Коды состояния ответа повторного выполнения
- xs:string
-
- 100
- Variable
-
+ v8:ValueListType
+
+ КодыСостоянияОтветаПовторногоВыполнения.Picture
+ КодыСостоянияОтветаПовторногоВыполнения.ValueType
+
+
+ xs:decimal
+
+ 10
+ 0
+ Any
+
+
-
+
ru
- Использовать прокси
+ Коэффициент увеличения паузы повторного выполнения
- xs:boolean
+ xs:decimal
+
+ 4
+ 0
+ Nonnegative
+
-
+
ru
- Сервер прокси
+ Максимальная длительность паузы повторного выполнения
- xs:string
-
- 0
- Variable
-
+ xs:decimal
+
+ 4
+ 0
+ Nonnegative
+
-
+
ru
- Порт прокси
+ Порог количества попыток повторного выполнения
xs:decimal
- 5
+ 2
0
Nonnegative
-
+
ru
- Пользователь прокси
+ Способ повторного выполнения
xs:string
- 0
+ 100
Variable
-
+
ru
- Пароль прокси
+ Имя файла сертификатов УЦ
@@ -3486,178 +4905,68 @@
-
+
ru
- Использовать аутентификацию ОСПрокси
+ Имя файла клиентского сертификата
- xs:boolean
+ xs:string
+
+ 0
+ Variable
+
+ ShowError
-
+
ru
- Не использовать прокси для локальных адресов
+ Использовать сертификаты
xs:boolean
-
+
ru
- Выполнять на сервере
+ Пароль клиентского сертификата
- xs:boolean
+ xs:string
+
+ 0
+ Variable
+
-
+
ru
- История
+ Пароль файла сертификатов УЦ
- v8:ValueTable
+ xs:string
+
+ 0
+ Variable
+
-
-
-
-
- ru
- Временная метка
-
-
-
- xs:decimal
-
- 15
- 0
- Nonnegative
-
-
-
-
-
-
- ru
- Дата
-
-
-
- xs:dateTime
-
- DateTime
-
-
-
-
-
-
- ru
- Код состояния
-
-
-
- xs:decimal
-
- 3
- 0
- Nonnegative
-
-
-
-
-
-
- ru
- Схема
-
-
-
- xs:string
-
- 8
- Variable
-
-
-
-
-
-
- ru
- Протокол
-
-
-
- xs:string
-
- 5
- Variable
-
-
-
-
-
-
- ru
- Хост
-
-
-
- xs:string
-
- 0
- Variable
-
-
-
-
-
-
- ru
- URN
-
-
-
- xs:string
-
- 0
- Variable
-
-
-
-
-
-
- ru
- Контекст выполнения
-
-
-
- xs:string
-
- 10
- Variable
-
-
-
-
-
+
ru
- Сохранять в историю
+ Отображать секреты
@@ -3880,20 +5189,20 @@
F7
ВыполнитьЗапрос
-
+
ru
- Показать пароль авторизации
+ Показать пароль аутентификации
ru
- Показать пароль авторизации
+ Показать пароль аутентификации
- ПоказатьПарольАвторизации
+ ПоказатьПарольАутентификации
@@ -4096,20 +5405,95 @@
ПоказатьПарольПрокси
-
+
+
+
+ ru
+ Показать токен аутентификации
+
+
+
+
+ ru
+ Показать токен аутентификации
+
+
+ ПоказатьТокенАутентификации
+
+
+
+
+ ru
+ Показать секретный ключ
+
+
+
+
+ ru
+ Показать секретный ключ
+
+
+ ПоказатьСекретныйКлючAWS
+
+
+
+
+ ru
+ Показать ключ
+
+
+
+
+ ru
+ Показать ключ hawk
+
+
+ ПоказатьКлючHawk
+
+
+
+
+ ru
+ Показать пароль клиентского сертификата
+
+
+
+
+ ru
+ Показать пароль клиентского сертификата
+
+
+ ПоказатьПарольКлиентскогоСертификата
+
+
+
+
+ ru
+ Показать пароль файла сертификатов УЦ
+
+
+
+
+ ru
+ Показать пароль файла сертификатов УЦ
+
+
+ ПоказатьПарольФайлаСертификатовУЦ
+
+
ru
- Показать токен авторизации
+ Объединить сертификат и ключ
ru
- Показать токен авторизации
+ Объединить файлы сертификата и ключа в один
- ПоказатьТокенАвторизации
+ ОбъединитьСертификатИКлюч
diff --git "a/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" "b/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl"
index d26a4d3..c9a36c9 100644
--- "a/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl"
+++ "b/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl"
@@ -17,16 +17,25 @@
ИспользоватьСессию = Ложь;
ПоддержкаCookie = Ложь;
ПорогПеренаправлений = 10;
+ ПорогКоличестваПопытокПовторногоВыполнения = 9;
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения = 600;
- РазделыКонсоли = Элементы.РазделыКонсоли.СписокВыбора[0];
- Схема = Элементы.Схема.СписокВыбора[0];
- ТипАвторизации = Элементы.ТипАвторизации.СписокВыбора[0];
+ Для Каждого КЗ Из КлиентHTTPПовтИсп.РегионыAWS() Цикл
+ Элементы.РегионAWS.СписокВыбора.Добавить(КЗ.Значение);
+ КонецЦикла;
+
+ РазделыКонсоли = Элементы.РазделыКонсоли.СписокВыбора[0].Значение;
+ Схема = Элементы.Схема.СписокВыбора[0].Значение;
+ ТипАутентификации = Элементы.ТипАутентификации.СписокВыбора[0].Значение;
+ AWSРегион = Элементы.РегионAWS.СписокВыбора[0].Значение;
ТипТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора[0].Значение;
- ТипТелаЗапросаКакЕсть = Элементы.ТипТелаЗапросаКакЕсть.СписокВыбора[0];
- ФорматТелаОтвета = Элементы.ФорматТелаОтвета.СписокВыбора[0];
+ ТипТелаЗапросаКакЕсть = Элементы.ТипТелаЗапросаКакЕсть.СписокВыбора[0].Значение;
+ ФорматТелаОтвета = Элементы.ФорматТелаОтвета.СписокВыбора[0].Значение;
+ СпособПовторногоВыполнения = Элементы.СпособПовторногоВыполнения.СписокВыбора[0].Значение;
+ ПротоколПрокси = Элементы.ПротоколПрокси.СписокВыбора[0].Значение;
ИдентификаторРесурса = "https://ya.ru";
- Дополнительно = Новый Структура("Сессия, История", Новый Структура("Печенье", Новый Соответствие), Новый Соответствие);
+ Дополнительно = Новый Структура("Сессия, История", НоваяСессия(), Новый Соответствие);
КонецПроцедуры
#КонецОбласти
@@ -48,26 +57,48 @@
КонецПроцедуры
&НаКлиенте
-Процедура ТипАвторизацииПриИзменении(Элемент)
+Процедура ТипАутентификацииПриИзменении(Элемент)
+ ТипАутентификацииСписокВыбора = Элементы.ТипАутентификации.СписокВыбора;
ОтображатьПользовательПароль = (
- ТипАвторизации = Элементы.ТипАвторизации.СписокВыбора[1].Значение
- ИЛИ ТипАвторизации = Элементы.ТипАвторизации.СписокВыбора[2].Значение
- ИЛИ ТипАвторизации = Элементы.ТипАвторизации.СписокВыбора[3].Значение
+ ТипАутентификации = ТипАутентификацииСписокВыбора[1].Значение
+ ИЛИ ТипАутентификации = ТипАутентификацииСписокВыбора[2].Значение
+ ИЛИ ТипАутентификации = ТипАутентификацииСписокВыбора[3].Значение
);
- ОтображатьТокен = (ТипАвторизации = Элементы.ТипАвторизации.СписокВыбора[4].Значение);
+ ОтображатьТокен = (ТипАутентификации = ТипАутентификацииСписокВыбора[4].Значение);
+ ОтображатьAWS4 = (ТипАутентификации = ТипАутентификацииСписокВыбора[5].Значение);
+ ОтображатьHawk = (ТипАутентификации = ТипАутентификацииСписокВыбора[6].Значение);
+
+ Элементы.ПоказатьПарольАутентификации.Пометка = Истина;
+
+ ПоказатьПарольАутентификации(Неопределено);
+
+ Элементы.ПользовательАутентификации.Видимость = ОтображатьПользовательПароль;
+ Элементы.ГруппаПарольАутентификации.Видимость = ОтображатьПользовательПароль;
+
+ Элементы.ПоказатьТокенАутентификации.Пометка = Истина;
- Элементы.ПоказатьПарольАвторизации.Пометка = Истина;
+ ПоказатьТокенАутентификации(Неопределено);
- ИзменитьРежимОтображенияПароля(Элементы.ПоказатьПарольАвторизации, Элементы.ПарольАвторизации);
+ Элементы.ГруппаТокенАутентификации.Видимость = ОтображатьТокен;
- Элементы.ПользовательАвторизации.Видимость = ОтображатьПользовательПароль;
- Элементы.ГруппаПарольАвторизации.Видимость = ОтображатьПользовательПароль;
+ Элементы.ПоказатьСекретныйКлючAWS.Пометка = Истина;
- Элементы.ПоказатьТокенАвторизации.Пометка = Истина;
+ ПоказатьСекретныйКлючAWS(Неопределено);
- ИзменитьРежимОтображенияПароля(Элементы.ПоказатьТокенАвторизации, Элементы.ТокенАвторизации);
+ Элементы.КлючДоступаAWS.Видимость = ОтображатьAWS4;
+ Элементы.ГруппаСекретныйКлючAWS.Видимость = ОтображатьAWS4;
+ Элементы.РегионAWS.Видимость = ОтображатьAWS4;
+ Элементы.СервисAWS.Видимость = ОтображатьAWS4;
- Элементы.ГруппаТокенАвторизации.Видимость = ОтображатьТокен;
+ Элементы.ПоказатьКлючHawk.Пометка = Истина;
+
+ ПоказатьКлючHawk(Неопределено);
+
+ Элементы.ИдентификаторHawk.Видимость = ОтображатьHawk;
+ Элементы.ГруппаКлючHawk.Видимость = ОтображатьHawk;
+ Элементы.ДополнениеHawk.Видимость = ОтображатьHawk;
+ Элементы.ИдентификаторПриложенияHawk.Видимость = ОтображатьHawk;
+ Элементы.ДелегированиеHawk.Видимость = ОтображатьHawk;
КонецПроцедуры
&НаКлиенте
@@ -94,7 +125,7 @@
Процедура СгенерироватьКод(Элемент)
ОткрытьФорму(
"Обработка.КонсольКлиентаHTTP.Форма.РедакторТекстовогоПоля",
- Новый Структура("Текст", КодЗапросаКонсоли()),
+ ПараметрыОткрытияФормыКодогенерации(КодЗапросаКонсоли()),
ЭтотОбъект, , , , ,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца
);
@@ -124,29 +155,32 @@
Если ИспользоватьПрокси И ПустаяСтрока(СерверПрокси) Тогда
Элементы.Основная.ТекущаяСтраница = Элементы.СтраницаНастройки;
- Сообщение = Новый СообщениеПользователю;
- Сообщение.Текст = "Необходимо указать имя прокси-сервера";
- Сообщение.Поле = "СерверПрокси";
- Сообщение.Сообщить();
+ СообщитьПользователю("Необходимо указать имя прокси-сервера", "СерверПрокси");
+ Возврат;
+ КонецЕсли;
+ Если ИспользоватьСертификаты И ПустаяСтрока(ИмяФайлаКлиентскогоСертификата) Тогда
+ Элементы.Основная.ТекущаяСтраница = Элементы.СтраницаНастройки;
+ СообщитьПользователю("Укажите путь к файлу клиентского сертификата", "ИмяФайлаКлиентскогоСертификата");
+ Возврат;
+ КонецЕсли;
+ Если ТелоОтветаВФайл И ПустаяСтрока(ИмяФайлаТелаОтвета) Тогда
+ Элементы.Основная.ТекущаяСтраница = Элементы.СтраницаНастройки;
+
+ СообщитьПользователю("Укажите путь к файлу ответа", "ИмяФайлаТелаОтвета");
Возврат;
КонецЕсли;
- ПЗ = МножествоПараметровЗапроса();
- ДП = ДополнительныеПараметрыЗапроса();
-
- ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
- ОтветHTTP = ОтветВыполненногоЗапроса(ПЗ, ДП);
-
- ЗафиксироватьВремяВыполненияЗапроса(ВремяНачала);
- ОбработатьОтвет(ОтветHTTP);
+ Ответ = ?(
+ ВыполнятьНаСервере,
+ ВыполнитьЗапросНаСервере(),
+ ВыполнитьЗапросНаКлиенте()
+ );
- Если ИспользоватьСессию И ПоддержкаCookie Тогда
- КлиентHTTPКлиентСервер.СкопироватьПеченье(Дополнительно, ДП);
- КонецЕсли;
+ ОбработатьОтвет(Ответ);
Если СохранятьВИсторию Тогда
- ДобавитьВИсторию(ОтветHTTP);
+ ДобавитьВИсторию(Ответ);
КонецЕсли;
РазделыКонсоли = Элементы.РазделыКонсоли.СписокВыбора[1];
@@ -173,13 +207,23 @@
КонецПроцедуры
&НаКлиенте
-Процедура ПоказатьПарольАвторизации(Команда)
- ИзменитьРежимОтображенияПароля(Элементы.ПоказатьПарольАвторизации, Элементы.ПарольАвторизации);
+Процедура ПоказатьПарольАутентификации(Команда)
+ ИзменитьРежимОтображенияПароля(Элементы.ПоказатьПарольАутентификации, Элементы.ПарольАутентификации);
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПоказатьТокенАутентификации(Команда)
+ ИзменитьРежимОтображенияПароля(Элементы.ПоказатьТокенАутентификации, Элементы.ТокенАутентификации);
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПоказатьСекретныйКлючAWS(Команда)
+ ИзменитьРежимОтображенияПароля(Элементы.ПоказатьСекретныйКлючAWS, Элементы.СекретныйКлючAWS);
КонецПроцедуры
&НаКлиенте
-Процедура ПоказатьТокенАвторизации(Команда)
- ИзменитьРежимОтображенияПароля(Элементы.ПоказатьТокенАвторизации, Элементы.ТокенАвторизации);
+Процедура ПоказатьКлючHawk(Команда)
+ ИзменитьРежимОтображенияПароля(Элементы.ПоказатьКлючHawk, Элементы.КлючHawk);
КонецПроцедуры
&НаКлиенте
@@ -195,7 +239,7 @@
ОткрытьФорму(
"Обработка.КонсольКлиентаHTTP.Форма.РедакторТекстовогоПоля",
- Новый Структура("ЗаголовокФормы", "Команда curl"),
+ ПараметрыОткрытияФормыКомандыCurl(КомандаCurlЗапросаКонсоли()),
ЭтотОбъект, , , ,
Оповещение,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца
@@ -522,6 +566,11 @@
ИзменитьКонтекстВыполненияЗапроса();
КонецПроцедуры
+&НаКлиенте
+Процедура ТелоОтветаВФайлПриИзменении(Элемент)
+ Элементы.ИмяФайлаТелаОтвета.Доступность = ТелоОтветаВФайл;
+КонецПроцедуры
+
&НаКлиенте
Процедура ИмяФайлаТелаОтветаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
Если ВыполнятьНаСервере Тогда
@@ -534,11 +583,6 @@
ПоказатьДиалогСохраненияФайла(Оповещение, "Выбор файла для сохранения");
КонецПроцедуры
-&НаКлиенте
-Процедура ИмяФайлаТелаОтветаПриИзменении(Элемент)
- ТелоОтветаВФайл = НЕ ПустаяСтрока(ИмяФайлаТелаОтвета);
-КонецПроцедуры
-
&НаКлиенте
Процедура ИспользоватьСессиюПриИзменении(Элемент)
Элементы.ГруппаНастройкиСессии.Доступность = ИспользоватьСессию;
@@ -551,9 +595,93 @@
Элементы.ОткрытьCookies.Доступность = (ИспользоватьСессию И ПоддержкаCookie);
КонецПроцедуры
+&НаКлиенте
+Процедура СпособПовторногоВыполненияПриИзменении(Элемент)
+ СпособыПовторногоВыполнения = Элементы.СпособПовторногоВыполнения.СписокВыбора;
+
+ Элементы.ГруппаПараметрыПовторногоВыполнения.Доступность = СпособПовторногоВыполнения <> СпособыПовторногоВыполнения[0].Значение; // Разово
+ Элементы.КоэффициентУвеличенияПаузыПовторногоВыполнения.Видимость = СпособПовторногоВыполнения <> СпособыПовторногоВыполнения[1].Значение; // Фиксировано
+
+ Если СпособПовторногоВыполнения = СпособыПовторногоВыполнения[2].Значение Тогда // Линейно
+ ДлительностьПаузыПовторногоВыполнения = ?(ДлительностьПаузыПовторногоВыполнения < 1, 1, ДлительностьПаузыПовторногоВыполнения);
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения = ?(МаксимальнаяДлительностьПаузыПовторногоВыполнения < 1, 1, МаксимальнаяДлительностьПаузыПовторногоВыполнения);
+
+ Элементы.ДлительностьПаузыПовторногоВыполнения.МинимальноеЗначение = 1;
+ Элементы.МаксимальнаяДлительностьПаузыПовторногоВыполнения.МинимальноеЗначение = 1;
+ Элементы.КоэффициентУвеличенияПаузыПовторногоВыполнения.МинимальноеЗначение = 0;
+ ИначеЕсли СпособПовторногоВыполнения = СпособыПовторногоВыполнения[3].Значение Тогда // Экспоненциально
+ ДлительностьПаузыПовторногоВыполнения = ?(ДлительностьПаузыПовторногоВыполнения < 1, 1, ДлительностьПаузыПовторногоВыполнения);
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения = ?(МаксимальнаяДлительностьПаузыПовторногоВыполнения < 1, 1, МаксимальнаяДлительностьПаузыПовторногоВыполнения);
+ КоэффициентУвеличенияПаузыПовторногоВыполнения = ?(КоэффициентУвеличенияПаузыПовторногоВыполнения < 1, 1, КоэффициентУвеличенияПаузыПовторногоВыполнения);
+
+ Элементы.ДлительностьПаузыПовторногоВыполнения.МинимальноеЗначение = 1;
+ Элементы.МаксимальнаяДлительностьПаузыПовторногоВыполнения.МинимальноеЗначение = 1;
+ Элементы.КоэффициентУвеличенияПаузыПовторногоВыполнения.МинимальноеЗначение = 1;
+ Иначе
+ Элементы.ДлительностьПаузыПовторногоВыполнения.МинимальноеЗначение = 0;
+ Элементы.МаксимальнаяДлительностьПаузыПовторногоВыполнения.МинимальноеЗначение = 0;
+ Элементы.КоэффициентУвеличенияПаузыПовторногоВыполнения.МинимальноеЗначение = 0;
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ИспользоватьСертификатыПриИзменении(Элемент)
+ Элементы.ГруппаКлиентскийСертификат.Доступность = ИспользоватьСертификаты;
+ Элементы.ГруппаПарольКлиентскогоСертификата.Доступность = ИспользоватьСертификаты;
+ Элементы.ИмяФайлаСертификатовУЦ.Доступность = ИспользоватьСертификаты;
+ Элементы.ГруппаПарольФайлаСертификатовУЦ.Доступность = ИспользоватьСертификаты;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ИмяФайлаКлиентскогоСертификатаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
+ Если ВыполнятьНаСервере Тогда
+ Возврат;
+ КонецЕсли;
+
+ СтандартнаяОбработка = Ложь;
+ Оповещение = Новый ОписаниеОповещения("ВыборФайлаКлиентсткогоСертификатаЗавершение", ЭтотОбъект);
+
+ ПоказатьДиалогВыбораФайла(Оповещение, "Выбор файла сертификата", "PEM (*.crt)|*.crt|PEM (*.pem)|*.pem|PEM (*.cer)|*.cer|PKCS#12 (*.p12)|*.p12|PKCS#12 (*.pfx)|*.pfx|Все файлы|*.*");
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ОбъединитьСертификатИКлюч(Команда)
+ Оповещение = Новый ОписаниеОповещения("ОбъединениеСертификатаИКлючаЗавершение", ЭтотОбъект);
+
+ ОткрытьФорму(
+ "Обработка.КонсольКлиентаHTTP.Форма.ФормаОбъединенияСертификатаИКлюча",
+ Новый Структура("Сертификат", ИмяФайлаКлиентскогоСертификата),
+ ЭтотОбъект, , , ,
+ Оповещение,
+ РежимОткрытияОкнаФормы.БлокироватьОкноВладельца
+ );
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПоказатьПарольКлиентскогоСертификата(Команда)
+ ИзменитьРежимОтображенияПароля(Элементы.ПоказатьПарольКлиентскогоСертификата, Элементы.ПарольКлиентскогоСертификата);
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ИмяФайлаСертификатовУЦНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
+ Если ВыполнятьНаСервере Тогда
+ Возврат;
+ КонецЕсли;
+
+ СтандартнаяОбработка = Ложь;
+ Оповещение = Новый ОписаниеОповещения("ВыборФайлаСертификатовУЦЗавершение", ЭтотОбъект);
+
+ ПоказатьДиалогВыбораФайла(Оповещение, "Выбор файла сертификата", "PEM (*.crt)|*.crt|PEM (*.pem)|*.pem|PEM (*.cer)|*.cer|PKCS#12 (*.p12)|*.p12|PKCS#12 (*.pfx)|*.pfx|Все файлы|*.*");
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПоказатьПарольФайлаСертификатовУЦ(Команда)
+ ИзменитьРежимОтображенияПароля(Элементы.ПоказатьПарольФайлаСертификатовУЦ, Элементы.ПарольФайлаСертификатовУЦ);
+КонецПроцедуры
+
&НаКлиенте
Процедура ИспользоватьПроксиПриИзменении(Элемент)
- Элементы.СерверПрокси.Доступность = ИспользоватьПрокси;
+ Элементы.ГруппаСерверПрокси.Доступность = ИспользоватьПрокси;
Элементы.ПортПрокси.Доступность = ИспользоватьПрокси;
Элементы.ПользовательПрокси.Доступность = ИспользоватьПрокси;
Элементы.ГруппаПарольПрокси.Доступность = ИспользоватьПрокси;
@@ -599,68 +727,121 @@
ОбъектИстории = Дополнительно.История.Получить(Стр.ВременнаяМетка);
#Область Заполнение_конфигурации_Консоли
- ВыполнятьНаСервере = НЕ ОбъектИстории.ВыполнятьНаСервере;
- ТелоОтветаВФайл = ОбъектИстории.ТелоОтветаВФайл;
- ИмяФайлаТелаОтвета = ОбъектИстории.ИмяФайлаТелаОтвета;
- ПоддержкаСжатогоОтвета = ОбъектИстории.ПоддержкаСжатогоОтвета;
- ИспользоватьСессию = ОбъектИстории.ИспользоватьСессию;
- Дополнительно.Сессия = ОбъектИстории.Сессия;
- ПорогПеренаправлений = ОбъектИстории.ПорогПеренаправлений;
- ПоддержкаCookie = ОбъектИстории.ПоддержкаCookie;
- ИспользоватьПрокси = ОбъектИстории.ИспользоватьПрокси;
- НеИспользоватьПроксиДляЛокальныхАдресов = ОбъектИстории.НеИспользоватьПроксиДляЛокальныхАдресов;
- СерверПрокси = ОбъектИстории.СерверПрокси;
- ПортПрокси = ОбъектИстории.ПортПрокси;
- ПользовательПрокси = ОбъектИстории.ПользовательПрокси;
- ПарольПрокси = ОбъектИстории.ПарольПрокси;
- ИспользоватьАутентификациюОСПрокси = ОбъектИстории.ИспользоватьАутентификациюОСПрокси;
+ КодыСостояния = Новый Массив;
+
+ ОбъектИстории.Свойство("ВыполнятьНаСервере", ВыполнятьНаСервере);
+ ОбъектИстории.Свойство("ТелоОтветаВФайл", ТелоОтветаВФайл);
+ ОбъектИстории.Свойство("ИмяФайлаТелаОтвета", ИмяФайлаТелаОтвета);
+ ОбъектИстории.Свойство("ПоддержкаСжатогоОтвета", ПоддержкаСжатогоОтвета);
+ ОбъектИстории.Свойство("АгентПользователя", АгентПользователя);
+ ОбъектИстории.Свойство("Таймаут", Таймаут);
+ ОбъектИстории.Свойство("ИспользоватьСессию", ИспользоватьСессию);
+ ОбъектИстории.Свойство("Сессия", Дополнительно.Сессия);
+ ОбъектИстории.Свойство("ПорогПеренаправлений", ПорогПеренаправлений);
+ ОбъектИстории.Свойство("ПеренаправлениеКакGET", ПеренаправлениеКакGET);
+ ОбъектИстории.Свойство("ПоддержкаCookie", ПоддержкаCookie);
+ ОбъектИстории.Свойство("СпособПовторногоВыполнения", СпособПовторногоВыполнения);
+ ОбъектИстории.Свойство("ДлительностьПаузыПовторногоВыполнения", ДлительностьПаузыПовторногоВыполнения);
+ ОбъектИстории.Свойство("КоэффициентУвеличенияПаузыПовторногоВыполнения", КоэффициентУвеличенияПаузыПовторногоВыполнения);
+ ОбъектИстории.Свойство("ПорогКоличестваПопытокПовторногоВыполнения", ПорогКоличестваПопытокПовторногоВыполнения);
+ ОбъектИстории.Свойство("МаксимальнаяДлительностьПаузыПовторногоВыполнения", МаксимальнаяДлительностьПаузыПовторногоВыполнения);
+ ОбъектИстории.Свойство("МассивКодовСостоянияОтветаПовторногоВыполнения", КодыСостояния);
+ ОбъектИстории.Свойство("ИспользоватьСертификаты", ИспользоватьСертификаты);
+ ОбъектИстории.Свойство("ПарольКлиентскогоСертификата", ПарольКлиентскогоСертификата);
+ ОбъектИстории.Свойство("ИмяФайлаСертификатовУЦ", ИмяФайлаСертификатовУЦ);
+ ОбъектИстории.Свойство("ПарольФайлаСертификатовУЦ", ПарольФайлаСертификатовУЦ);
+ ОбъектИстории.Свойство("ИмяФайлаКлиентскогоСертификата", ИмяФайлаКлиентскогоСертификата);
+ ОбъектИстории.Свойство("ИспользоватьПрокси", ИспользоватьПрокси);
+ ОбъектИстории.Свойство("НеИспользоватьПроксиДляЛокальныхАдресов", НеИспользоватьПроксиДляЛокальныхАдресов);
+ ОбъектИстории.Свойство("ПротоколПрокси", ПротоколПрокси);
+ ОбъектИстории.Свойство("СерверПрокси", СерверПрокси);
+ ОбъектИстории.Свойство("ПортПрокси", ПортПрокси);
+ ОбъектИстории.Свойство("ПользовательПрокси", ПользовательПрокси);
+ ОбъектИстории.Свойство("ПарольПрокси", ПарольПрокси);
+ ОбъектИстории.Свойство("ИспользоватьАутентификациюОСПрокси", ИспользоватьАутентификациюОСПрокси);
+
+ ВыполнятьНаСервере = НЕ ВыполнятьНаСервере;
+
+ КодыСостоянияОтветаПовторногоВыполнения.Очистить();
+
+ Если Дополнительно.Сессия = Неопределено Тогда
+ Дополнительно.Сессия = НоваяСессия();
+ КонецЕсли;
+ Если НЕ ЗначениеЗаполнено(СпособПовторногоВыполнения) Тогда
+ СпособПовторногоВыполнения = Элементы.СпособПовторногоВыполнения.СписокВыбора[0];
+ КонецЕсли;
+ Если ЗначениеЗаполнено(КодыСостояния) Тогда
+ КодыСостоянияОтветаПовторногоВыполнения.ЗагрузитьЗначения(КодыСостояния);
+ КонецЕсли;
+ Если НЕ ЗначениеЗаполнено(ПротоколПрокси) Тогда
+ ПротоколПрокси = Элементы.ПротоколПрокси.СписокВыбора[0];
+ КонецЕсли;
ИзменитьКонтекстВыполненияЗапроса();
ИспользоватьСессиюПриИзменении(Неопределено);
+ СпособПовторногоВыполненияПриИзменении(Неопределено);
+ ИспользоватьСертификатыПриИзменении(Неопределено);
ИспользоватьПроксиПриИзменении(Неопределено);
#КонецОбласти
#Область Заполнение_запроса
- ИдентификаторРесурса = ОбъектИстории.URI;
+ ОбъектИстории.Свойство("URI", ИдентификаторРесурса);
ИдентификаторРесурсаПриИзменении(Неопределено);
- Схема = ОбъектИстории.Схема;
+ ОбъектИстории.Свойство("Схема", Схема);
ЗаголовкиЗапроса.Очистить();
- Для Каждого ЗаголовокЗапроса Из ОбъектИстории.ЗаголовкиЗапроса Цикл
+ ЗаголовкиИзИстории = Неопределено;
+ ОбъектИстории.Свойство("ЗаголовкиЗапроса", ЗаголовкиИзИстории);
+ Для Каждого ЗаголовокЗапроса Из ?(ЗаголовкиИзИстории = Неопределено, Новый Массив, ЗаголовкиИзИстории) Цикл
ЗаполнитьЗначенияСвойств(ЗаголовкиЗапроса.Добавить(), ЗаголовокЗапроса);
КонецЦикла;
- ТипАвторизации = ОбъектИстории.ТипАвторизации;
- ПользовательАвторизации = ОбъектИстории.ПользовательАвторизации;
- ПарольАвторизации = ОбъектИстории.ПарольАвторизации;
- ТокенАвторизации = ОбъектИстории.ТокенАвторизации;
-
- ТипАвторизацииПриИзменении(Неопределено);
-
- ТипТелаЗапроса = ОбъектИстории.ТипТелаЗапроса;
- ТелоЗапросаТекст = ОбъектИстории.ТелоЗапросаТекст;
- ТелоЗапросаФайл = ОбъектИстории.ТелоЗапросаФайл;
- Разделитель = ОбъектИстории.Разделитель;
+ ОбъектИстории.Свойство("ТипАутентификации", ТипАутентификации);
+ ОбъектИстории.Свойство("ПользовательАутентификации", ПользовательАутентификации);
+ ОбъектИстории.Свойство("ПарольАутентификации", ПарольАутентификации);
+ ОбъектИстории.Свойство("ТокенАутентификации", ТокенАутентификации);
+ ОбъектИстории.Свойство("AWSКлючДоступа", AWSКлючДоступа);
+ ОбъектИстории.Свойство("AWSСекретныйКлюч", AWSСекретныйКлюч);
+ ОбъектИстории.Свойство("AWSРегион", AWSРегион);
+ ОбъектИстории.Свойство("AWSСервис", AWSСервис);
+ ОбъектИстории.Свойство("HawkИдентификатор", HawkИдентификатор);
+ ОбъектИстории.Свойство("HawkКлюч", HawkКлюч);
+ ОбъектИстории.Свойство("HawkДополнение", HawkДополнение);
+ ОбъектИстории.Свойство("HawkИдентификаторПриложения", HawkИдентификаторПриложения);
+ ОбъектИстории.Свойство("HawkДелегирование", HawkДелегирование);
+
+ ТипАутентификацииПриИзменении(Неопределено);
+
+ ОбъектИстории.Свойство("ТипТелаЗапроса", ТипТелаЗапроса);
+ ОбъектИстории.Свойство("ТелоЗапросаТекст", ТелоЗапросаТекст);
+ ОбъектИстории.Свойство("ТелоЗапросаФайл", ТелоЗапросаФайл);
+ ОбъектИстории.Свойство("Разделитель", Разделитель);
ТипТелаЗапросаПриИзменении(Неопределено);
ТелоЗапросаДанныеФормы.Очистить();
- Для Каждого ЭлементФормы Из ОбъектИстории.ТелоФорма Цикл
+ ТелоФормаИзИстории = Неопределено;
+ ОбъектИстории.Свойство("ТелоФорма", ТелоФормаИзИстории);
+ Для Каждого ЭлементФормы Из ?(ТелоФормаИзИстории = Неопределено, Новый Массив, ТелоФормаИзИстории) Цикл
ЗаполнитьЗначенияСвойств(ТелоЗапросаДанныеФормы.Добавить(), ЭлементФормы);
КонецЦикла;
ТелоЗапросаДанныеHTMLФормы.Очистить();
- Для Каждого ЭлементФормы Из ОбъектИстории.ТелоHTMLФорма Цикл
+ ТелоHTMLФормаИзИстории = Неопределено;
+ ОбъектИстории.Свойство("ТелоHTMLФорма", ТелоHTMLФормаИзИстории);
+ Для Каждого ЭлементФормы Из ?(ТелоHTMLФормаИзИстории = Неопределено, Новый Массив, ТелоHTMLФормаИзИстории) Цикл
ЗаполнитьЗначенияСвойств(ТелоЗапросаДанныеHTMLФормы.Добавить(), ЭлементФормы);
КонецЦикла;
#КонецОбласти
#Область Заполнение_ответа
- ВремяВыполнения = ОбъектИстории.ВремяВыполнения;
+ ОбъектИстории.Свойство("ВремяВыполнения", ВремяВыполнения);
- ОбработатьОтвет(ОбъектИстории.Ответ);
+ Если ОбъектИстории.Свойство("Ответ") Тогда
+ ОбработатьОтвет(ОбъектИстории.Ответ);
+ КонецЕсли;
#КонецОбласти
РазделыКонсоли = Элементы.РазделыКонсоли.СписокВыбора[0].Значение;
@@ -695,18 +876,87 @@
#Область СлужебныеПроцедурыИФункции
&НаКлиенте
-Функция ОтветВыполненногоЗапроса(Знач ПараметрыЗапроса, ДополнительныеПараметры)
+Функция ВыполнитьЗапросНаКлиенте()
+ ПЗ = МножествоПараметровЗапросаНаКлиенте();
+ ДП = ДополнительныеПараметрыЗапросаНаКлиенте();
+
+ Возврат РезультатВыполненногоЗапросаНаКлиенте(ПЗ, ДП);
+КонецФункции
+
+&НаСервере
+Функция ВыполнитьЗапросНаСервере()
+ ПЗ = МножествоПараметровЗапросаНаСервере();
+ ДП = ДополнительныеПараметрыЗапросаНаСервере();
+
+ Возврат РезультатВыполненногоЗапросаНаСервере(ПЗ, ДП);
+КонецФункции
+
+&НаКлиенте
+Функция РезультатВыполненногоЗапросаНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
+ Перем фРезультат;
+
+ ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
+ Схемы = Элементы.Схема.СписокВыбора;
+ Если Схема = Схемы[0].Значение Тогда // GET
+ фРезультат = КлиентHTTPКлиентСервер.Получить(
+ ИдентификаторРесурса,
+ ПараметрыЗапроса,
+ ДополнительныеПараметры
+ );
+ ИначеЕсли Схема = Схемы[1].Значение Тогда // POST
+ фРезультат = ОтветВыполненногоЗапросаPOSTНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры);
+ ИначеЕсли Схема = Схемы[2].Значение Тогда // PUT
+ фРезультат = ОтветВыполненногоЗапросаPUTНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры);
+ ИначеЕсли Схема = Схемы[3].Значение Тогда // DELETE
+ ТипыТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора;
+ ТелоЗапроса = ?(
+ ТипТелаЗапроса = ТипыТелаЗапроса[3].Значение, // raw
+ ТелоЗапросаТекст,
+ ""
+ );
+ фРезультат = КлиентHTTPКлиентСервер.Удалить(
+ ИдентификаторРесурса,
+ ТелоЗапроса,
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
+ );
+ ИначеЕсли Схема = Схемы[4].Значение Тогда // HEAD
+ фРезультат = КлиентHTTPКлиентСервер.ПолучитьЗаголовки(
+ ИдентификаторРесурса,
+ ПараметрыЗапроса,
+ ДополнительныеПараметры
+ );
+ ИначеЕсли Схема = Схемы[5].Значение Тогда // PATCH
+ фРезультат = ОтветВыполненногоЗапросаPATCHНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры);
+ Иначе
+ ВызватьИсключение "Неизвестная схема запроса";
+ КонецЕсли;
+
+ ВремяВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах() - ВремяНачала;
+
+ Если ИспользоватьСессию И ПоддержкаCookie Тогда
+ КлиентHTTPКлиентСервер.СкопироватьПеченье(Дополнительно, ДополнительныеПараметры);
+ КонецЕсли;
+
+ Возврат фРезультат;
+КонецФункции
+
+&НаСервере
+Функция РезультатВыполненногоЗапросаНаСервере(ПараметрыЗапроса, ДополнительныеПараметры)
+ Перем фРезультат;
+
+ ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
Схемы = Элементы.Схема.СписокВыбора;
Если Схема = Схемы[0].Значение Тогда // GET
- фРезультат = ?(
- ВыполнятьНаСервере,
- ПолучитьНаСервере(ИдентификаторРесурса, ПараметрыЗапроса, ДополнительныеПараметры),
- ПолучитьНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
+ фРезультат = КлиентHTTPКлиентСервер.Получить(
+ ИдентификаторРесурса,
+ ПараметрыЗапроса,
+ ДополнительныеПараметры
);
ИначеЕсли Схема = Схемы[1].Значение Тогда // POST
- фРезультат = ОтветВыполненногоЗапросаPOST(ПараметрыЗапроса, ДополнительныеПараметры);
+ фРезультат = ОтветВыполненногоЗапросаPOSTНаСервере(ПараметрыЗапроса, ДополнительныеПараметры);
ИначеЕсли Схема = Схемы[2].Значение Тогда // PUT
- фРезультат = ОтветВыполненногоЗапросаPUT(ПараметрыЗапроса, ДополнительныеПараметры);
+ фРезультат = ОтветВыполненногоЗапросаPUTНаСервере(ПараметрыЗапроса, ДополнительныеПараметры);
ИначеЕсли Схема = Схемы[3].Значение Тогда // DELETE
ТипыТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора;
ТелоЗапроса = ?(
@@ -714,240 +964,223 @@
ТелоЗапросаТекст,
""
);
- фРезультат = ?(
- ВыполнятьНаСервере,
- УдалитьНаСервере(ИдентификаторРесурса, ТелоЗапроса, ПараметрыЗапроса, ДополнительныеПараметры),
- УдалитьНаКлиенте(ТелоЗапроса, ПараметрыЗапроса, ДополнительныеПараметры)
+ фРезультат = КлиентHTTPКлиентСервер.Удалить(
+ ИдентификаторРесурса,
+ ТелоЗапроса,
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
ИначеЕсли Схема = Схемы[4].Значение Тогда // HEAD
- фРезультат = ?(
- ВыполнятьНаСервере,
- ПолучитьЗаголовкиНаСервере(ИдентификаторРесурса, ПараметрыЗапроса, ДополнительныеПараметры),
- ПолучитьЗаголовкиНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
+ фРезультат = КлиентHTTPКлиентСервер.ПолучитьЗаголовки(
+ ИдентификаторРесурса,
+ ПараметрыЗапроса,
+ ДополнительныеПараметры
);
ИначеЕсли Схема = Схемы[5].Значение Тогда // PATCH
- фРезультат = ОтветВыполненногоЗапросаPATCH(ПараметрыЗапроса, ДополнительныеПараметры);
+ фРезультат = ОтветВыполненногоЗапросаPATCHНаСервере(ПараметрыЗапроса, ДополнительныеПараметры);
Иначе
ВызватьИсключение "Неизвестная схема запроса";
КонецЕсли;
+ ВремяВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах() - ВремяНачала;
+
+ Если ИспользоватьСессию И ПоддержкаCookie Тогда
+ КлиентHTTPКлиентСервер.СкопироватьПеченье(Дополнительно, ДополнительныеПараметры);
+ КонецЕсли;
+
Возврат фРезультат;
КонецФункции
&НаКлиенте
-Функция ОтветВыполненногоЗапросаPOST(Знач ПараметрыЗапроса, ДополнительныеПараметры)
+Функция ОтветВыполненногоЗапросаPOSTНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
ТипыТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора;
Если ТипТелаЗапроса = ТипыТелаЗапроса[0].Значение Тогда // none
- фРезультат = ?(
- ВыполнятьНаСервере,
- ОтправитьТекстНаСервере(ИдентификаторРесурса, "", ПараметрыЗапроса, ДополнительныеПараметры),
- ОтправитьТекстНаКлиенте("", ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат КлиентHTTPКлиентСервер.ОтправитьТекст(
+ ИдентификаторРесурса,
+ "",
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[1].Значение Тогда // form-data
- фРезультат = ?(
- ВыполнятьНаСервере,
- ОтправитьДанныеФормыНаСервере(ПараметрыЗапроса, ДополнительныеПараметры),
- ОтправитьДанныеФормыНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат КлиентHTTPКлиентСервер.ОтправитьДанныеФормы(
+ ИдентификаторРесурса,
+ ДанныеФормыТелаЗапросаНаКлиенте(),
+ ПараметрыОтправкиДанныхФормыНаКлиенте(ДополнительныеПараметры),
+ ПараметрыЗапроса
);
ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[2].Значение Тогда // x-www-form-urlencoded
- фРезультат = ?(
- ВыполнятьНаСервере,
- ОтправитьДанныеHTMLФормыНаСервере(ИдентификаторРесурса, ДанныеHTMLФормыТелаЗапроса(), ПараметрыЗапроса, ДополнительныеПараметры),
- ОтправитьДанныеHTMLФормыНаКлиенте(ДанныеHTMLФормыТелаЗапроса(), ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат КлиентHTTPКлиентСервер.ОтправитьДанныеHTMLФормы(
+ ИдентификаторРесурса,
+ ДанныеHTMLФормыТелаЗапросаНаКлиенте(),
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[3].Значение Тогда // raw
- фРезультат = ?(
- ВыполнятьНаСервере,
- ОтправитьТекстНаСервере(ИдентификаторРесурса, ТелоЗапросаТекст, ПараметрыЗапроса, ДополнительныеПараметры),
- ОтправитьТекстНаКлиенте(ТелоЗапросаТекст, ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат КлиентHTTPКлиентСервер.ОтправитьТекст(
+ ИдентификаторРесурса,
+ ТелоЗапросаТекст,
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[4].Значение Тогда // binary
- фРезультат = ?(
- ВыполнятьНаСервере,
- ОтправитьФайлНаСервере(ИдентификаторРесурса, ТелоЗапросаФайл, ПараметрыЗапроса, ДополнительныеПараметры),
- ОтправитьФайлНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат КлиентHTTPКлиентСервер.ОтправитьФайл(
+ ИдентификаторРесурса,
+ Новый Файл(ТелоЗапросаФайл),
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
Иначе
ВызватьИсключение СтрШаблон("Тип тела запроса %1 не поддерживается для %2", ТипТелаЗапроса, Схема);
КонецЕсли;
-
- Возврат фРезультат;
КонецФункции
-&НаКлиенте
-Функция ОтветВыполненногоЗапросаPUT(Знач ПараметрыЗапроса, ДополнительныеПараметры)
+&НаСервере
+Функция ОтветВыполненногоЗапросаPOSTНаСервере(ПараметрыЗапроса, ДополнительныеПараметры)
ТипыТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора;
Если ТипТелаЗапроса = ТипыТелаЗапроса[0].Значение Тогда // none
- фРезультат = ?(
- ВыполнятьНаСервере,
- ЗаписатьТекстНаСервере(ИдентификаторРесурса, "", ПараметрыЗапроса, ДополнительныеПараметры),
- ЗаписатьТекстНаКлиенте("", ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат КлиентHTTPКлиентСервер.ОтправитьТекст(
+ ИдентификаторРесурса,
+ "",
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
+ );
+ ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[1].Значение Тогда // form-data
+ Возврат КлиентHTTPКлиентСервер.ОтправитьДанныеФормы(
+ ИдентификаторРесурса,
+ ДанныеФормыТелаЗапросаНаСервере(),
+ ПараметрыОтправкиДанныхФормыНаСервере(ДополнительныеПараметры, Разделитель),
+ ПараметрыЗапроса
+ );
+ ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[2].Значение Тогда // x-www-form-urlencoded
+ Возврат КлиентHTTPКлиентСервер.ОтправитьДанныеHTMLФормы(
+ ИдентификаторРесурса,
+ ДанныеHTMLФормыТелаЗапросаНаСервере(),
+ ПараметрыЗапроса,
+ ДополнительныеПараметры
);
ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[3].Значение Тогда // raw
- фРезультат = ?(
- ВыполнятьНаСервере,
- ЗаписатьТекстНаСервере(ИдентификаторРесурса, ТелоЗапросаТекст, ПараметрыЗапроса, ДополнительныеПараметры),
- ЗаписатьТекстНаКлиенте(ТелоЗапросаТекст, ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат КлиентHTTPКлиентСервер.ОтправитьТекст(
+ ИдентификаторРесурса,
+ ТелоЗапросаТекст,
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[4].Значение Тогда // binary
- фРезультат = ?(
- ВыполнятьНаСервере,
- ЗаписатьФайлНаСервере(ИдентификаторРесурса, ТелоЗапросаФайл, ПараметрыЗапроса, ДополнительныеПараметры),
- ЗаписатьФайлНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат КлиентHTTPКлиентСервер.ОтправитьФайл(
+ ИдентификаторРесурса,
+ Новый Файл(ТелоЗапросаФайл),
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
Иначе
ВызватьИсключение СтрШаблон("Тип тела запроса %1 не поддерживается для %2", ТипТелаЗапроса, Схема);
КонецЕсли;
-
- Возврат фРезультат;
КонецФункции
&НаКлиенте
-Функция ОтветВыполненногоЗапросаPATCH(Знач ПараметрыЗапроса, ДополнительныеПараметры)
+Функция ОтветВыполненногоЗапросаPUTНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
ТипыТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора;
Если ТипТелаЗапроса = ТипыТелаЗапроса[0].Значение Тогда // none
- фРезультат = ?(
- ВыполнятьНаСервере,
- ИзменитьТекстНаСервере(ИдентификаторРесурса, "", ПараметрыЗапроса, ДополнительныеПараметры),
- ИзменитьТекстНаКлиенте("", ПараметрыЗапроса, ДополнительныеПараметры)
- );
+ Возврат КлиентHTTPКлиентСервер.ЗаписатьТекст(ИдентификаторРесурса, "", ДополнительныеПараметры, ПараметрыЗапроса);
ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[3].Значение Тогда // raw
- фРезультат = ?(
- ВыполнятьНаСервере,
- ИзменитьТекстНаСервере(ИдентификаторРесурса, ТелоЗапросаТекст, ПараметрыЗапроса, ДополнительныеПараметры),
- ИзменитьТекстНаКлиенте(ТелоЗапросаТекст, ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат КлиентHTTPКлиентСервер.ЗаписатьТекст(
+ ИдентификаторРесурса,
+ ТелоЗапросаТекст,
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[4].Значение Тогда // binary
- фРезультат = ?(
- ВыполнятьНаСервере,
- ИзменитьФайлНаСервере(ИдентификаторРесурса, ТелоЗапросаФайл, ПараметрыЗапроса, ДополнительныеПараметры),
- ИзменитьФайлНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат КлиентHTTPКлиентСервер.ЗаписатьФайл(
+ ИдентификаторРесурса,
+ Новый Файл(ТелоЗапросаФайл),
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
Иначе
ВызватьИсключение СтрШаблон("Тип тела запроса %1 не поддерживается для %2", ТипТелаЗапроса, Схема);
КонецЕсли;
-
- Возврат фРезультат;
-КонецФункции
-
-&НаКлиенте
-Функция ПолучитьНаКлиенте(Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.Получить(ИдентификаторРесурса, ПараметрыЗапроса, ДополнительныеПараметры);
-КонецФункции
-
-&НаСервереБезКонтекста
-Функция ПолучитьНаСервере(Знач URI, Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.Получить(URI, ПараметрыЗапроса, ДополнительныеПараметры);
-КонецФункции
-
-&НаКлиенте
-Функция ПолучитьЗаголовкиНаКлиенте(Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.ПолучитьЗаголовки(ИдентификаторРесурса, ПараметрыЗапроса, ДополнительныеПараметры);
-КонецФункции
-
-&НаСервереБезКонтекста
-Функция ПолучитьЗаголовкиНаСервере(Знач URI, Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.ПолучитьЗаголовки(URI, ПараметрыЗапроса, ДополнительныеПараметры);
-КонецФункции
-
-&НаКлиенте
-Функция ОтправитьТекстНаКлиенте(Знач Данные, Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.ОтправитьТекст(ИдентификаторРесурса, Данные, ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаСервереБезКонтекста
-Функция ОтправитьТекстНаСервере(Знач URI, Знач Данные, Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.ОтправитьТекст(URI, Данные, ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаКлиенте
-Функция ОтправитьДанныеФормыНаКлиенте(Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.ОтправитьДанныеФормы(
- ИдентификаторРесурса,
- ДанныеФормыТелаЗапроса(),
- ПараметрыОтправкиДанныхФормыНаКлиенте(ДополнительныеПараметры),
- ПараметрыЗапроса
- );
КонецФункции
&НаСервере
-Функция ОтправитьДанныеФормыНаСервере(Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.ОтправитьДанныеФормы(
- ИдентификаторРесурса,
- ДанныеФормыТелаЗапросаНаСервере(),
- ПараметрыОтправкиДанныхФормыНаСервере(ДополнительныеПараметры, Разделитель),
- ПараметрыЗапроса
- );
-КонецФункции
-
-&НаКлиенте
-Функция ОтправитьДанныеHTMLФормыНаКлиенте(Знач Данные, Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.ОтправитьДанныеHTMLФормы(ИдентификаторРесурса, Данные, ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаСервереБезКонтекста
-Функция ОтправитьДанныеHTMLФормыНаСервере(Знач URI, Знач Данные, Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.ОтправитьДанныеHTMLФормы(URI, Данные, ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаКлиенте
-Функция ОтправитьФайлНаКлиенте(Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.ОтправитьФайл(ИдентификаторРесурса, Новый Файл(ТелоЗапросаФайл), ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаСервереБезКонтекста
-Функция ОтправитьФайлНаСервере(Знач URI, Знач Данные, Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.ОтправитьФайл(URI, Новый Файл(Данные), ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаКлиенте
-Функция ЗаписатьТекстНаКлиенте(Знач Данные, Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.ЗаписатьТекст(ИдентификаторРесурса, Данные, ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаСервереБезКонтекста
-Функция ЗаписатьТекстНаСервере(Знач URI, Знач Данные, Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.ЗаписатьТекст(URI, Данные, ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаКлиенте
-Функция ЗаписатьФайлНаКлиенте(Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.ЗаписатьФайл(ИдентификаторРесурса, Новый Файл(ТелоЗапросаФайл), ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаСервереБезКонтекста
-Функция ЗаписатьФайлНаСервере(Знач URI, Знач Данные, Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.ЗаписатьФайл(URI, Новый Файл(Данные), ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаКлиенте
-Функция ИзменитьТекстНаКлиенте(Знач Данные, Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.ИзменитьТекст(ИдентификаторРесурса, Данные, ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаСервереБезКонтекста
-Функция ИзменитьТекстНаСервере(Знач URI, Знач Данные, Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.ИзменитьТекст(URI, Данные, ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаКлиенте
-Функция ИзменитьФайлНаКлиенте(Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.ИзменитьФайл(ИдентификаторРесурса, Новый Файл(ТелоЗапросаФайл), ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаСервереБезКонтекста
-Функция ИзменитьФайлНаСервере(Знач URI, Знач Данные, Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.ИзменитьФайл(URI, Новый Файл(Данные), ДополнительныеПараметры, ПараметрыЗапроса);
+Функция ОтветВыполненногоЗапросаPUTНаСервере(ПараметрыЗапроса, ДополнительныеПараметры)
+ ТипыТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора;
+ Если ТипТелаЗапроса = ТипыТелаЗапроса[0].Значение Тогда // none
+ Возврат КлиентHTTPКлиентСервер.ЗаписатьТекст(ИдентификаторРесурса, "", ДополнительныеПараметры, ПараметрыЗапроса);
+ ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[3].Значение Тогда // raw
+ Возврат КлиентHTTPКлиентСервер.ЗаписатьТекст(
+ ИдентификаторРесурса,
+ ТелоЗапросаТекст,
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
+ );
+ ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[4].Значение Тогда // binary
+ Возврат КлиентHTTPКлиентСервер.ЗаписатьФайл(
+ ИдентификаторРесурса,
+ Новый Файл(ТелоЗапросаФайл),
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
+ );
+ Иначе
+ ВызватьИсключение СтрШаблон("Тип тела запроса %1 не поддерживается для %2", ТипТелаЗапроса, Схема);
+ КонецЕсли;
КонецФункции
&НаКлиенте
-Функция УдалитьНаКлиенте(Знач ТелоЗапроса, Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.Удалить(ИдентификаторРесурса, ТелоЗапроса, ДополнительныеПараметры, ПараметрыЗапроса);
+Функция ОтветВыполненногоЗапросаPATCHНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
+ ТипыТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора;
+ Если ТипТелаЗапроса = ТипыТелаЗапроса[0].Значение Тогда // none
+ Возврат КлиентHTTPКлиентСервер.ИзменитьТекст(
+ ИдентификаторРесурса,
+ "",
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
+ );
+ ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[3].Значение Тогда // raw
+ Возврат КлиентHTTPКлиентСервер.ИзменитьТекст(
+ ИдентификаторРесурса,
+ ТелоЗапросаТекст,
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
+ );
+ ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[4].Значение Тогда // binary
+ Возврат КлиентHTTPКлиентСервер.ИзменитьФайл(
+ ИдентификаторРесурса,
+ Новый Файл(ТелоЗапросаФайл),
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
+ );
+ Иначе
+ ВызватьИсключение СтрШаблон("Тип тела запроса %1 не поддерживается для %2", ТипТелаЗапроса, Схема);
+ КонецЕсли;
КонецФункции
-&НаСервереБезКонтекста
-Функция УдалитьНаСервере(Знач URI, Знач ТелоЗапроса, Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.Удалить(URI, ТелоЗапроса, ДополнительныеПараметры, ПараметрыЗапроса);
+&НаСервере
+Функция ОтветВыполненногоЗапросаPATCHНаСервере(ПараметрыЗапроса, ДополнительныеПараметры)
+ ТипыТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора;
+ Если ТипТелаЗапроса = ТипыТелаЗапроса[0].Значение Тогда // none
+ Возврат КлиентHTTPКлиентСервер.ИзменитьТекст(
+ ИдентификаторРесурса,
+ "",
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
+ );
+ ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[3].Значение Тогда // raw
+ Возврат КлиентHTTPКлиентСервер.ИзменитьТекст(
+ ИдентификаторРесурса,
+ ТелоЗапросаТекст,
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
+ );
+ ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[4].Значение Тогда // binary
+ Возврат КлиентHTTPКлиентСервер.ИзменитьФайл(
+ ИдентификаторРесурса,
+ Новый Файл(ТелоЗапросаФайл),
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
+ );
+ Иначе
+ ВызватьИсключение СтрШаблон("Тип тела запроса %1 не поддерживается для %2", ТипТелаЗапроса, Схема);
+ КонецЕсли;
КонецФункции
&НаКлиенте
@@ -990,6 +1223,9 @@
ОтобразитьКартинкуТелаОтвета(ТипMIMEОтвета);
Элементы.ОтветHTML.Документ.Body.InnerHTML = ОтветHTML;
+
+ ФорматТелаОтветаПриИзменении(Неопределено);
+ ПроверитьОтветHawk(Ответ);
КонецПроцедуры
&НаКлиенте
@@ -1009,11 +1245,6 @@
КонецЕсли;
КонецПроцедуры
-&НаКлиенте
-Процедура ЗафиксироватьВремяВыполненияЗапроса(Знач ВремяНачала)
- ВремяВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах() - ВремяНачала;
-КонецПроцедуры
-
&НаКлиенте
Процедура ОтобразитьРазмерТелаОтвета()
ДелительГБ = 1073741824; // 2^30
@@ -1072,6 +1303,8 @@
КонецЕсли;
ОтветJSON.УстановитьФорматированнуюСтроку(Новый ФорматированнаяСтрока(Текст));
+
+ ФорматТелаОтвета = Элементы.ФорматТелаОтвета.СписокВыбора[1].Значение; // JSON
КонецПроцедуры
&НаКлиенте
@@ -1084,9 +1317,34 @@
Возврат;
КонецЕсли;
+ ФорматТелаОтвета = Элементы.ФорматТелаОтвета.СписокВыбора[3].Значение; // Картинка
+
ПопробоватьОтобразитьКартинку(Неопределено);
КонецПроцедуры
+&НаКлиенте
+Процедура ПроверитьОтветHawk(Знач Ответ)
+ Если ТипАутентификации <> Элементы.ТипАутентификации.СписокВыбора[6].Значение Тогда // Hawk
+ Возврат;
+ КонецЕсли;
+ Если Цел(Ответ.КодСостояния / 100) <> 2 Тогда // 2хх
+ Возврат;
+ КонецЕсли;
+ Если КлиентHTTPКлиентСервер.ЗначениеЗаголовка("Server-Authorization", Ответ.Заголовки) = Неопределено Тогда
+ СообщитьПользователю("В ответе отсутствует заголовок верефикации 'Server-Authorization'");
+ КонецЕсли;
+
+ ОписаниеОшибки = "";
+ Если НЕ КлиентHTTPКлиентСервер.ОтветСЗаголовкомHawkКорректен(Ответ, "Server-Authorization", ОписаниеОшибки) Тогда
+ СообщитьПользователю(ОписаниеОшибки);
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиентеНаСервереБезКонтекста
+Функция НоваяСессия()
+ Возврат Новый Структура("Печенье", Новый Соответствие);
+КонецФункции
+
&НаКлиенте
Процедура ДобавитьВИсторию(Знач Ответ)
ТекущийМомент = ТекущаяУниверсальнаяДатаВМиллисекундах();
@@ -1135,6 +1393,7 @@
ОбъектОтвета.Вставить("Тело", Ответ.Тело);
ОбъектОтвета.Вставить("Заголовки", Ответ.Заголовки);
ОбъектОтвета.Вставить("ИмяФайлаТела", Ответ.ИмяФайлаТела);
+ ОбъектОтвета.Вставить("КонтекстВыполнения", Ответ.КонтекстВыполнения);
ОбъектИстории = Новый Структура;
ОбъектИстории.Вставить("Дата", ТекущаяДата());
@@ -1145,10 +1404,19 @@
ОбъектИстории.Вставить("URN", URN);
ОбъектИстории.Вставить("ВремяВыполнения", ВремяВыполнения);
ОбъектИстории.Вставить("Ответ", ОбъектОтвета);
- ОбъектИстории.Вставить("ТипАвторизации", ТипАвторизации);
- ОбъектИстории.Вставить("ПользовательАвторизации", ПользовательАвторизации);
- ОбъектИстории.Вставить("ПарольАвторизации", ПарольАвторизации);
- ОбъектИстории.Вставить("ТокенАвторизации", ТокенАвторизации);
+ ОбъектИстории.Вставить("ТипАутентификации", ТипАутентификации);
+ ОбъектИстории.Вставить("ПользовательАутентификации", ПользовательАутентификации);
+ ОбъектИстории.Вставить("ПарольАутентификации", ПарольАутентификации);
+ ОбъектИстории.Вставить("ТокенАутентификации", ТокенАутентификации);
+ ОбъектИстории.Вставить("AWSКлючДоступа", AWSКлючДоступа);
+ ОбъектИстории.Вставить("AWSСекретныйКлюч", AWSСекретныйКлюч);
+ ОбъектИстории.Вставить("AWSРегион", AWSРегион);
+ ОбъектИстории.Вставить("AWSСервис", AWSСервис);
+ ОбъектИстории.Вставить("HawkИдентификатор", HawkИдентификатор);
+ ОбъектИстории.Вставить("HawkКлюч", HawkКлюч);
+ ОбъектИстории.Вставить("HawkДополнение", HawkДополнение);
+ ОбъектИстории.Вставить("HawkИдентификаторПриложения", HawkИдентификаторПриложения);
+ ОбъектИстории.Вставить("HawkДелегирование", HawkДелегирование);
ОбъектИстории.Вставить("ЗаголовкиЗапроса", Заголовки);
ОбъектИстории.Вставить("ТипТелаЗапроса", ТипТелаЗапроса);
ОбъектИстории.Вставить("Разделитель", Разделитель);
@@ -1160,12 +1428,27 @@
ОбъектИстории.Вставить("ТелоОтветаВФайл", ТелоОтветаВФайл);
ОбъектИстории.Вставить("ИмяФайлаТелаОтвета", ИмяФайлаТелаОтвета);
ОбъектИстории.Вставить("ПоддержкаСжатогоОтвета", ПоддержкаСжатогоОтвета);
+ ОбъектИстории.Вставить("АгентПользователя", АгентПользователя);
+ ОбъектИстории.Вставить("Таймаут", Таймаут);
ОбъектИстории.Вставить("ИспользоватьСессию", ИспользоватьСессию);
ОбъектИстории.Вставить("Сессия", Дополнительно.Сессия);
ОбъектИстории.Вставить("ПорогПеренаправлений", ПорогПеренаправлений);
+ ОбъектИстории.Вставить("ПеренаправлениеКакGET", ПеренаправлениеКакGET);
ОбъектИстории.Вставить("ПоддержкаCookie", ПоддержкаCookie);
+ ОбъектИстории.Вставить("СпособПовторногоВыполнения", СпособПовторногоВыполнения);
+ ОбъектИстории.Вставить("ДлительностьПаузыПовторногоВыполнения", ДлительностьПаузыПовторногоВыполнения);
+ ОбъектИстории.Вставить("КоэффициентУвеличенияПаузыПовторногоВыполнения", КоэффициентУвеличенияПаузыПовторногоВыполнения);
+ ОбъектИстории.Вставить("ПорогКоличестваПопытокПовторногоВыполнения", ПорогКоличестваПопытокПовторногоВыполнения);
+ ОбъектИстории.Вставить("МаксимальнаяДлительностьПаузыПовторногоВыполнения", МаксимальнаяДлительностьПаузыПовторногоВыполнения);
+ ОбъектИстории.Вставить("МассивКодовСостоянияОтветаПовторногоВыполнения", КодыСостоянияОтветаПовторногоВыполнения.ВыгрузитьЗначения());
+ ОбъектИстории.Вставить("ИспользоватьСертификаты", ИспользоватьСертификаты);
+ ОбъектИстории.Вставить("ИмяФайлаКлиентскогоСертификата", ИмяФайлаКлиентскогоСертификата);
+ ОбъектИстории.Вставить("ПарольКлиентскогоСертификата", ПарольКлиентскогоСертификата);
+ ОбъектИстории.Вставить("ИмяФайлаСертификатовУЦ", ИмяФайлаСертификатовУЦ);
+ ОбъектИстории.Вставить("ПарольФайлаСертификатовУЦ", ПарольФайлаСертификатовУЦ);
ОбъектИстории.Вставить("ИспользоватьПрокси", ИспользоватьПрокси);
ОбъектИстории.Вставить("НеИспользоватьПроксиДляЛокальныхАдресов", НеИспользоватьПроксиДляЛокальныхАдресов);
+ ОбъектИстории.Вставить("ПротоколПрокси", ПротоколПрокси);
ОбъектИстории.Вставить("СерверПрокси", СерверПрокси);
ОбъектИстории.Вставить("ПортПрокси", ПортПрокси);
ОбъектИстории.Вставить("ПользовательПрокси", ПользовательПрокси);
@@ -1195,14 +1478,24 @@
Функция ПараметрыИдентификатораСПорядком(Знач ИдентификаторРесурса, Знач ПозицияНачала)
фРезультат = Новый Структура("Параметры, Порядок", Новый Соответствие, Новый Массив);
- ПараметрыСтрока = ?(
- ПозицияНачала = 0,
- "",
- Сред(ИдентификаторРесурса, ПозицияНачала + 1)
+ Если ПозицияНачала = 0 Тогда
+ Возврат фРезультат;
+ КонецЕсли;
+
+ ПозицияОкончания = СтрНайти(ИдентификаторРесурса, "#", , ПозицияНачала);
+ ПараметрыСтрока = Сред(
+ ИдентификаторРесурса,
+ ПозицияНачала + 1,
+ ?(
+ ПозицияОкончания = 0,
+ СтрДлина(ИдентификаторРесурса),
+ ПозицияОкончания - 1
+ ) - ПозицияНачала
);
- ПараметрыИдентификатора = СтрРазделить(ПараметрыСтрока, "&", Ложь);
- Для Каждого Параметр Из ПараметрыИдентификатора Цикл
+ ПараметрыИдентификатора = Новый Массив;
+ МножествоСтрок = Новый Соответствие;
+ Для Каждого Параметр Из СтрРазделить(ПараметрыСтрока, "&", Ложь) Цикл
ПозицияРазделителя = СтрНайти(Параметр, "=");
Если ПозицияРазделителя = 0 Тогда
ПозицияРазделителя = СтрДлина(Параметр) + 1;
@@ -1215,6 +1508,16 @@
ЗначениеПараметра = Прав(Параметр, СтрДлина(Параметр) - ПозицияРазделителя);
+ ПараметрыИдентификатора.Добавить(Новый Структура("Ключ, Значение", ИмяПараметра, ЗначениеПараметра));
+ МножествоСтрок.Вставить(ИмяПараметра);
+ МножествоСтрок.Вставить(ЗначениеПараметра);
+ КонецЦикла;
+
+ МножествоСтрок = РаскодированныеСтрокиURLвURL(МножествоСтрок);
+
+ Для Каждого Параметр Из ПараметрыИдентификатора Цикл
+ ИмяПараметра = МножествоСтрок.Получить(Параметр.Ключ);
+ ЗначениеПараметра = МножествоСтрок.Получить(Параметр.Значение);
ЗначенияПараметра = фРезультат.Параметры.Получить(ИмяПараметра);
Если ЗначенияПараметра = Неопределено Тогда
ЗначенияПараметра = Новый Соответствие;
@@ -1297,12 +1600,14 @@
ВызватьИсключение "Не удалось разобрать URI";
КонецЕсли;
- ПозицияНачалаСтрокиПараметров = СтрНайти(ИдентификаторРесурса, "?", , ПозицияНачалаПоиска);
+ ПозицияСимволаПараметров = СтрНайти(ИдентификаторРесурса, "?", , ПозицияНачалаПоиска);
+ ПозицияСимволаФрагмента = СтрНайти(ИдентификаторРесурса, "#", , ?(ПозицияСимволаПараметров = 0, 1, ПозицияСимволаПараметров));
+ ПозицияОкончания = ?(ПозицияСимволаПараметров = 0, ПозицияСимволаФрагмента, ПозицияСимволаПараметров);
НовыйИдентификатор = ?(
- ПозицияНачалаСтрокиПараметров = 0,
+ ПозицияОкончания = 0,
ИдентификаторРесурса,
- Лев(ИдентификаторРесурса, ПозицияНачалаСтрокиПараметров - 1)
+ Лев(ИдентификаторРесурса, ПозицияОкончания - 1)
);
ПараметрыИдентификатора = Новый Массив;
@@ -1318,11 +1623,31 @@
ПараметрыИдентификатора.Добавить(Новый Структура("Ключ, Значение", Стр.Ключ, ЗначениеПараметра));
КонецЦикла;
- ИдентификаторРесурса = НовыйИдентификатор + КлиентHTTPКлиентСервер.ПараметрыЗапросаСтрокой(ПараметрыИдентификатора);
+ ИдентификаторРесурса = СтрШаблон(
+ "%1%2%3",
+ НовыйИдентификатор,
+ КлиентHTTPКлиентСервер.ПараметрыЗапросаСтрокой(ПараметрыИдентификатора),
+ ?(ПозицияСимволаФрагмента = 0, "", Сред(ИдентификаторРесурса, ПозицияСимволаФрагмента))
+ );
КонецПроцедуры
&НаКлиенте
-Функция МножествоПараметровЗапроса()
+Функция МножествоПараметровЗапросаНаКлиенте()
+ фРезультат = КлиентHTTPКлиентСервер.НовыеПараметрыЗапроса();
+
+ Для Каждого Стр Из ПараметрыЗапроса Цикл
+ Если НЕ Стр.Активно Тогда
+ Продолжить;
+ КонецЕсли;
+
+ КлиентHTTPКлиентСервер.ДобавитьПараметр(фРезультат, Стр.Ключ, Стр.Значение);
+ КонецЦикла;
+
+ Возврат фРезультат;
+КонецФункции
+
+&НаСервере
+Функция МножествоПараметровЗапросаНаСервере()
фРезультат = КлиентHTTPКлиентСервер.НовыеПараметрыЗапроса();
Для Каждого Стр Из ПараметрыЗапроса Цикл
@@ -1337,20 +1662,40 @@
КонецФункции
&НаКлиенте
-Функция ДополнительныеПараметрыЗапроса()
+Функция ДополнительныеПараметрыЗапросаНаКлиенте()
фРезультат = КлиентHTTPКлиентСервер.НовыеДополнительныеПараметры();
- УстановитьЗаголовкиЗапроса(фРезультат);
-
- ТипАвторизацииСписокВыбора = Элементы.ТипАвторизации.СписокВыбора;
- Если ТипАвторизации = ТипАвторизацииСписокВыбора[1].Значение Тогда // Basic
- КлиентHTTPКлиентСервер.УстановитьBasicАвторизацию(фРезультат, ПользовательАвторизации, ПарольАвторизации);
- ИначеЕсли ТипАвторизации = ТипАвторизацииСписокВыбора[2].Значение Тогда // NTLM
- КлиентHTTPКлиентСервер.УстановитьNTLMАвторизацию(фРезультат, ПользовательАвторизации, ПарольАвторизации);
- ИначеЕсли ТипАвторизации = ТипАвторизацииСписокВыбора[3].Значение Тогда // Digest
- КлиентHTTPКлиентСервер.УстановитьDigestАвторизацию(фРезультат, ПользовательАвторизации, ПарольАвторизации);
- ИначеЕсли ТипАвторизации = ТипАвторизацииСписокВыбора[4].Значение Тогда // Bearer
- КлиентHTTPКлиентСервер.УстановитьBearerАвторизацию(фРезультат, ТокенАвторизации);
+ УстановитьЗаголовкиЗапросаНаКлиенте(фРезультат);
+
+ ТипАутентификацииСписокВыбора = Элементы.ТипАутентификации.СписокВыбора;
+ Если ТипАутентификации = ТипАутентификацииСписокВыбора[1].Значение Тогда // Basic
+ КлиентHTTPКлиентСервер.УстановитьBasicАвторизацию(фРезультат, ПользовательАутентификации, ПарольАутентификации);
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[2].Значение Тогда // NTLM
+ КлиентHTTPКлиентСервер.УстановитьNTLMАвторизацию(фРезультат, ПользовательАутентификации, ПарольАутентификации);
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[3].Значение Тогда // Digest
+ КлиентHTTPКлиентСервер.УстановитьDigestАвторизацию(фРезультат, ПользовательАутентификации, ПарольАутентификации);
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[4].Значение Тогда // Bearer
+ КлиентHTTPКлиентСервер.УстановитьBearerАвторизацию(фРезультат, ТокенАутентификации);
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[5].Значение Тогда // AWS4-HMAC-SHA256
+ КлиентHTTPКлиентСервер.УстановитьAWS4Авторизацию(фРезультат, AWSКлючДоступа, AWSСекретныйКлюч, AWSРегион, AWSСервис);
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[6].Значение Тогда // Hawk
+ КлиентHTTPКлиентСервер.УстановитьHawkАвторизацию(фРезультат, HawkИдентификатор, HawkКлюч, HawkДополнение, HawkИдентификаторПриложения, HawkДелегирование);
+ КонецЕсли;
+
+ Если ИспользоватьСертификаты Тогда
+ КлиентHTTPКлиентСервер.ИспользоватьФайлСертификатаКлиента(
+ фРезультат,
+ Новый Файл(ИмяФайлаКлиентскогоСертификата),
+ ПарольКлиентскогоСертификата
+ );
+
+ Если НЕ ПустаяСтрока(ИмяФайлаСертификатовУЦ) Тогда
+ КлиентHTTPКлиентСервер.ИспользоватьФайлСертификатовУдостоверяющихЦентров(
+ фРезультат,
+ Новый Файл(ИмяФайлаСертификатовУЦ),
+ ПарольФайлаСертификатовУЦ
+ );
+ КонецЕсли;
КонецЕсли;
Если ИспользоватьПрокси Тогда
@@ -1362,38 +1707,193 @@
ПарольПрокси,
ИспользоватьАутентификациюОСПрокси,
,
- НеИспользоватьПроксиДляЛокальныхАдресов
+ НеИспользоватьПроксиДляЛокальныхАдресов,
+ ПротоколПрокси
);
КонецЕсли;
Если ИспользоватьСессию Тогда
КлиентHTTPКлиентСервер
.ИспользоватьСессию(фРезультат)
- .УстановитьПорогПеренаправлений(фРезультат, ПорогПеренаправлений);
+ .УстановитьПорогПеренаправлений(фРезультат, ПорогПеренаправлений)
+ .ПеренаправленияКакGET(фРезультат, ПеренаправлениеКакGET);
Если ПоддержкаCookie Тогда
КлиентHTTPКлиентСервер.СкопироватьПеченье(фРезультат, Дополнительно);
КонецЕсли;
КонецЕсли;
+ Если Таймаут > 0 Тогда
+ КлиентHTTPКлиентСервер.УстановитьТаймаут(фРезультат, Таймаут);
+ КонецЕсли;
+
Если ПоддержкаСжатогоОтвета Тогда
КлиентHTTPКлиентСервер.УстановитьСжатиеОтветаGZIP(фРезультат);
КонецЕсли;
+ Если НЕ ПустаяСтрока(АгентПользователя) Тогда
+ КлиентHTTPКлиентСервер.УстановитьАгентаПользователя(фРезультат, АгентПользователя);
+ КонецЕсли;
+
Если ТелоОтветаВФайл Тогда
- Если ПустаяСтрока(ИмяФайлаТелаОтвета) Тогда
- Элементы.Основная.ТекущаяСтраница = Элементы.СтраницаНастройки;
- ВызватьИсключение "Укажите путь к файлу ответа";
+ КлиентHTTPКлиентСервер.УстановитьИмяВыходногоФайла(фРезультат, ИмяФайлаТелаОтвета);
+ КонецЕсли;
+
+ СпособыПовторногоВыполнения = Элементы.СпособПовторногоВыполнения.СписокВыбора;
+ Если СпособПовторногоВыполнения = СпособыПовторногоВыполнения[1].Значение Тогда // Фиксировано
+ КлиентHTTPКлиентСервер.ФиксированоОтложенныеВыполнения(
+ фРезультат,
+ ДлительностьПаузыПовторногоВыполнения,
+ ПорогКоличестваПопытокПовторногоВыполнения,
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения,
+ КодыСостоянияОтветаПовторногоВыполнения.ВыгрузитьЗначения()
+ );
+ ИначеЕсли СпособПовторногоВыполнения = СпособыПовторногоВыполнения[2].Значение Тогда // Линейно
+ КлиентHTTPКлиентСервер.ЛинейноОтложенныеВыполнения(
+ фРезультат,
+ ДлительностьПаузыПовторногоВыполнения,
+ КоэффициентУвеличенияПаузыПовторногоВыполнения,
+ ПорогКоличестваПопытокПовторногоВыполнения,
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения,
+ КодыСостоянияОтветаПовторногоВыполнения.ВыгрузитьЗначения()
+ );
+ ИначеЕсли СпособПовторногоВыполнения = СпособыПовторногоВыполнения[3].Значение Тогда // Экспоненциально
+ КлиентHTTPКлиентСервер.ЭкспоненциальноОтложенныеВыполнения(
+ фРезультат,
+ ДлительностьПаузыПовторногоВыполнения,
+ КоэффициентУвеличенияПаузыПовторногоВыполнения,
+ ПорогКоличестваПопытокПовторногоВыполнения,
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения,
+ КодыСостоянияОтветаПовторногоВыполнения.ВыгрузитьЗначения()
+ );
+ КонецЕсли;
+
+ Возврат фРезультат;
+КонецФункции
+
+&НаСервере
+Функция ДополнительныеПараметрыЗапросаНаСервере()
+ фРезультат = КлиентHTTPКлиентСервер.НовыеДополнительныеПараметры();
+
+ УстановитьЗаголовкиЗапросаНаСервере(фРезультат);
+
+ ТипАутентификацииСписокВыбора = Элементы.ТипАутентификации.СписокВыбора;
+ Если ТипАутентификации = ТипАутентификацииСписокВыбора[1].Значение Тогда // Basic
+ КлиентHTTPКлиентСервер.УстановитьBasicАвторизацию(фРезультат, ПользовательАутентификации, ПарольАутентификации);
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[2].Значение Тогда // NTLM
+ КлиентHTTPКлиентСервер.УстановитьNTLMАвторизацию(фРезультат, ПользовательАутентификации, ПарольАутентификации);
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[3].Значение Тогда // Digest
+ КлиентHTTPКлиентСервер.УстановитьDigestАвторизацию(фРезультат, ПользовательАутентификации, ПарольАутентификации);
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[4].Значение Тогда // Bearer
+ КлиентHTTPКлиентСервер.УстановитьBearerАвторизацию(фРезультат, ТокенАутентификации);
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[5].Значение Тогда // AWS4-HMAC-SHA256
+ КлиентHTTPКлиентСервер.УстановитьAWS4Авторизацию(фРезультат, AWSКлючДоступа, AWSСекретныйКлюч, AWSРегион, AWSСервис);
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[6].Значение Тогда // Hawk
+ КлиентHTTPКлиентСервер.УстановитьHawkАвторизацию(фРезультат, HawkИдентификатор, HawkКлюч, HawkДополнение, HawkИдентификаторПриложения, HawkДелегирование);
+ КонецЕсли;
+
+ Если ИспользоватьСертификаты Тогда
+ КлиентHTTPКлиентСервер.ИспользоватьФайлСертификатаКлиента(
+ фРезультат,
+ Новый Файл(ИмяФайлаКлиентскогоСертификата),
+ ПарольКлиентскогоСертификата
+ );
+
+ Если НЕ ПустаяСтрока(ИмяФайлаСертификатовУЦ) Тогда
+ КлиентHTTPКлиентСервер.ИспользоватьФайлСертификатовУдостоверяющихЦентров(
+ фРезультат,
+ Новый Файл(ИмяФайлаСертификатовУЦ),
+ ПарольФайлаСертификатовУЦ
+ );
КонецЕсли;
+ КонецЕсли;
+
+ Если ИспользоватьПрокси Тогда
+ КлиентHTTPКлиентСервер.ИспользоватьПрокси(
+ фРезультат,
+ СерверПрокси,
+ ПортПрокси,
+ ПользовательПрокси,
+ ПарольПрокси,
+ ИспользоватьАутентификациюОСПрокси,
+ ,
+ НеИспользоватьПроксиДляЛокальныхАдресов,
+ ПротоколПрокси
+ );
+ КонецЕсли;
+
+ Если ИспользоватьСессию Тогда
+ КлиентHTTPКлиентСервер
+ .ИспользоватьСессию(фРезультат)
+ .УстановитьПорогПеренаправлений(фРезультат, ПорогПеренаправлений)
+ .ПеренаправленияКакGET(фРезультат, ПеренаправлениеКакGET);
+ Если ПоддержкаCookie Тогда
+ КлиентHTTPКлиентСервер.СкопироватьПеченье(фРезультат, Дополнительно);
+ КонецЕсли;
+ КонецЕсли;
+
+ Если Таймаут > 0 Тогда
+ КлиентHTTPКлиентСервер.УстановитьТаймаут(фРезультат, Таймаут);
+ КонецЕсли;
+
+ Если ПоддержкаСжатогоОтвета Тогда
+ КлиентHTTPКлиентСервер.УстановитьСжатиеОтветаGZIP(фРезультат);
+ КонецЕсли;
+
+ Если НЕ ПустаяСтрока(АгентПользователя) Тогда
+ КлиентHTTPКлиентСервер.УстановитьАгентаПользователя(фРезультат, АгентПользователя);
+ КонецЕсли;
+
+ Если ТелоОтветаВФайл Тогда
КлиентHTTPКлиентСервер.УстановитьИмяВыходногоФайла(фРезультат, ИмяФайлаТелаОтвета);
КонецЕсли;
+ СпособыПовторногоВыполнения = Элементы.СпособПовторногоВыполнения.СписокВыбора;
+ Если СпособПовторногоВыполнения = СпособыПовторногоВыполнения[1].Значение Тогда // Фиксировано
+ КлиентHTTPКлиентСервер.ФиксированоОтложенныеВыполнения(
+ фРезультат,
+ ДлительностьПаузыПовторногоВыполнения,
+ ПорогКоличестваПопытокПовторногоВыполнения,
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения,
+ КодыСостоянияОтветаПовторногоВыполнения.ВыгрузитьЗначения()
+ );
+ ИначеЕсли СпособПовторногоВыполнения = СпособыПовторногоВыполнения[2].Значение Тогда // Линейно
+ КлиентHTTPКлиентСервер.ЛинейноОтложенныеВыполнения(
+ фРезультат,
+ ДлительностьПаузыПовторногоВыполнения,
+ КоэффициентУвеличенияПаузыПовторногоВыполнения,
+ ПорогКоличестваПопытокПовторногоВыполнения,
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения,
+ КодыСостоянияОтветаПовторногоВыполнения.ВыгрузитьЗначения()
+ );
+ ИначеЕсли СпособПовторногоВыполнения = СпособыПовторногоВыполнения[3].Значение Тогда // Экспоненциально
+ КлиентHTTPКлиентСервер.ЭкспоненциальноОтложенныеВыполнения(
+ фРезультат,
+ ДлительностьПаузыПовторногоВыполнения,
+ КоэффициентУвеличенияПаузыПовторногоВыполнения,
+ ПорогКоличестваПопытокПовторногоВыполнения,
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения,
+ КодыСостоянияОтветаПовторногоВыполнения.ВыгрузитьЗначения()
+ );
+ КонецЕсли;
+
Возврат фРезультат;
КонецФункции
&НаКлиенте
-Процедура УстановитьЗаголовкиЗапроса(Знач ДополнительныеПараметры)
+Процедура УстановитьЗаголовкиЗапросаНаКлиенте(Знач ДополнительныеПараметры)
+ Для Каждого Стр Из ЗаголовкиЗапроса Цикл
+ Если НЕ Стр.Активно Тогда
+ Продолжить;
+ КонецЕсли;
+
+ КлиентHTTPКлиентСервер.УстановитьЗаголовок(ДополнительныеПараметры, Стр.Ключ, Стр.Значение);
+ КонецЦикла;
+КонецПроцедуры
+
+&НаСервере
+Процедура УстановитьЗаголовкиЗапросаНаСервере(Знач ДополнительныеПараметры)
Для Каждого Стр Из ЗаголовкиЗапроса Цикл
Если НЕ Стр.Активно Тогда
Продолжить;
@@ -1404,7 +1904,7 @@
КонецПроцедуры
&НаКлиенте
-Функция ДанныеФормыТелаЗапроса()
+Функция ДанныеФормыТелаЗапросаНаКлиенте()
фРезультат = КлиентHTTPКлиентСервер.НовыеПоляФормы();
ТипыДанныхФормы = Элементы.ТелоЗапросаДанныеФормы.ПодчиненныеЭлементы.ДанныеФормыТип.СписокВыбора;
@@ -1472,7 +1972,22 @@
КонецФункции
&НаКлиенте
-Функция ДанныеHTMLФормыТелаЗапроса()
+Функция ДанныеHTMLФормыТелаЗапросаНаКлиенте()
+ фРезультат = КлиентHTTPКлиентСервер.НовыеПоляФормы();
+
+ Для Каждого Стр Из ТелоЗапросаДанныеHTMLФормы Цикл
+ Если НЕ Стр.Активно Тогда
+ Продолжить;
+ КонецЕсли;
+
+ КлиентHTTPКлиентСервер.ДобавитьПолеHTMLФормы(фРезультат, Стр.Ключ, Стр.Значение);
+ КонецЦикла;
+
+ Возврат фРезультат;
+КонецФункции
+
+&НаСервере
+Функция ДанныеHTMLФормыТелаЗапросаНаСервере()
фРезультат = КлиентHTTPКлиентСервер.НовыеПоляФормы();
Для Каждого Стр Из ТелоЗапросаДанныеHTMLФормы Цикл
@@ -1542,25 +2057,22 @@
КонецПроцедуры
&НаКлиенте
-Процедура СообщитьПользователю(Знач Текст, Знач Поле)
+Процедура СообщитьПользователю(Знач Текст, Знач Поле = Неопределено)
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = Текст;
- Сообщение.Поле = Поле;
+
+ Если Поле <> Неопределено Тогда
+ Сообщение.Поле = Поле;
+ КонецЕсли;
+
Сообщение.Сообщить();
КонецПроцедуры
&НаКлиенте
Функция ИсправленноеИмяЗаголовкаЗапроса(Знач Имя)
- фРезультат = Новый Массив;
- ДопустимыеСимволы = КлиентHTTPПовтИсп.ДопустимыеСимволыИмениЗаголовка();
-
- Для я = 1 По СтрДлина(Имя) Цикл
- СимволИмениЗаголовка = Сред(Имя, я, 1);
-
- фРезультат.Добавить(?(ДопустимыеСимволы.Получить(СимволИмениЗаголовка) = Неопределено, "-", СимволИмениЗаголовка));
- КонецЦикла;
+ НедопустимыеСимволы = СтрСоединить(СтрРазделить(Имя, КлиентHTTPПовтИсп.ДопустимыеСимволыИмениЗаголовкаСтрокой(), Ложь));
- Возврат СтрСоединить(фРезультат);
+ Возврат СтрСоединить(СтрРазделить(Имя, НедопустимыеСимволы), "-"); // заменили все недопустимые символы на "-"
КонецФункции
&НаКлиенте
@@ -1578,6 +2090,16 @@
Элементы.ВремяВыполнения.Формат = СтрШаблон("ЧДЦ=%1; ЧС=%2; ЧН='0 мс'; ЧГ=; ЧФ='Ч %3'", Точность, Сдвиг, Единицы);
КонецПроцедуры
+&НаКлиенте
+Функция ОтображениеСекрета(Знач Текст, Знач ЭлементФормы, Знач СкрыватьПустуюСтроку = Истина)
+ Возврат ?(
+ НЕ СкрыватьПустуюСтроку И Текст = "",
+ "",
+ ?(НЕ ОтображатьСекреты И ЭлементФормы.РежимПароля, "***", Текст)
+ );
+КонецФункции
+
+#Область Кодогенерация
&НаКлиенте
Процедура ДобавитьВКодЗапросаИдентификаторРесурса(Построитель)
ПозицияПараметровЗапроса = СтрНайти(ИдентификаторРесурса, "?");
@@ -1592,43 +2114,98 @@
&НаКлиенте
Процедура ДобавитьВКодЗапросаИспользованиеПрокси(Построитель, ЕстьДополнительныеПараметры)
- Если ИспользоватьПрокси Тогда
- Хвост = ?(НеИспользоватьПроксиДляЛокальныхАдресов, "", ", , Ложь");
- Хвост = ?(
- ИспользоватьАутентификациюОСПрокси,
- ?(ПустаяСтрока(Хвост), "", ", "),
- ", Ложь"
- ) + Хвост;
- Хвост = ?(
- ПустаяСтрока(ПарольПрокси),
- ?(ПустаяСтрока(Хвост), "", ", "),
- ", """ + КавычкиВТексте1С(ПарольПрокси) + """"
- ) + Хвост;
- Хвост = ?(
- ПустаяСтрока(ПользовательПрокси),
- ?(ПустаяСтрока(Хвост), "", ", "),
- ", """ + КавычкиВТексте1С(ПользовательПрокси) + """"
- ) + Хвост;
-
- Построитель.Добавить(СтрШаблон(
- " .ИспользоватьПрокси(ДополнительныеПараметры, ""%1"", %2%3)",
- СерверПрокси,
- XMLСтрока(ПортПрокси),
- Хвост
- ));
-
- ЕстьДополнительныеПараметры = Истина;
+ Если НЕ ИспользоватьПрокси Тогда
+ Возврат;
КонецЕсли;
+
+ Хвост = ?(НеИспользоватьПроксиДляЛокальныхАдресов, "", ", , Ложь");
+ Хвост = ?(
+ ИспользоватьАутентификациюОСПрокси,
+ ?(ПустаяСтрока(Хвост), "", ", "),
+ ", Ложь"
+ ) + Хвост;
+ Хвост = ?(
+ ПустаяСтрока(ПарольПрокси),
+ ?(ПустаяСтрока(Хвост), "", ", "),
+ ", """ + КавычкиВТексте1С(ОтображениеСекрета(ПарольПрокси, Элементы.ПарольПрокси)) + """"
+ ) + Хвост;
+ Хвост = ?(
+ ПустаяСтрока(ПользовательПрокси),
+ ?(ПустаяСтрока(Хвост), "", ", "),
+ ", """ + КавычкиВТексте1С(ПользовательПрокси) + """"
+ ) + Хвост;
+
+ Построитель.Добавить(СтрШаблон(
+ " .ИспользоватьПрокси(ДополнительныеПараметры, ""%1"", %2%3)",
+ СерверПрокси,
+ XMLСтрока(ПортПрокси),
+ Хвост
+ ));
+
+ ЕстьДополнительныеПараметры = Истина;
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьВКодЗапросаИспользованиеСессии(Построитель, ЕстьДополнительныеПараметры)
- Если ИспользоватьСессию Тогда
- Построитель.Добавить(" .ИспользоватьСессию(ДополнительныеПараметры)");
- Построитель.Добавить(СтрШаблон(" .УстановитьПорогПеренаправлений(ДополнительныеПараметры, %1)", XMLСтрока(ПорогПеренаправлений)));
+ Если НЕ ИспользоватьСессию Тогда
+ Возврат;
+ КонецЕсли;
+
+ Построитель.Добавить(" .ИспользоватьСессию(ДополнительныеПараметры)");
+ Построитель.Добавить(СтрШаблон(" .УстановитьПорогПеренаправлений(ДополнительныеПараметры, %1)", ПорогПеренаправлений));
+
+ ЕстьДополнительныеПараметры = Истина;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ДобавитьВКодЗапросаПовторноеВыполнение(Построитель, КодыСостояния, ЕстьДополнительныеПараметры)
+ СпособыПовторногоВыполнения = Элементы.СпособПовторногоВыполнения.СписокВыбора;
+ Если СпособПовторногоВыполнения = СпособыПовторногоВыполнения[0].Значение Тогда // Разово
+ Возврат;
+ КонецЕсли;
+
+ КодыСостояния = КодыСостоянияОтветаПовторногоВыполнения.ВыгрузитьЗначения();
+
+ ЧастиСтроки = Новый Массив;
+ ОкончанияСтроки = Новый Массив;
+ Если СпособПовторногоВыполнения = СпособыПовторногоВыполнения[1].Значение Тогда // Фиксировано
+ ЧастиСтроки.Добавить(" .ФиксированоОтложенныеВыполнения(ДополнительныеПараметры");
- ЕстьДополнительныеПараметры = Истина;
+ ОкончанияСтроки.Добавить(?(ДлительностьПаузыПовторногоВыполнения = 1, "", XMLСтрока(ДлительностьПаузыПовторногоВыполнения)));
+ ОкончанияСтроки.Добавить(?(ПорогКоличестваПопытокПовторногоВыполнения = 9, "", XMLСтрока(ПорогКоличестваПопытокПовторногоВыполнения)));
+ ОкончанияСтроки.Добавить(?(МаксимальнаяДлительностьПаузыПовторногоВыполнения = 600, "", XMLСтрока(МаксимальнаяДлительностьПаузыПовторногоВыполнения)));
+ ОкончанияСтроки.Добавить(?(КодыСостояния.Количество() = 0, "", "КодыСостоянияПовторногоВыполнения"));
+ ИначеЕсли СпособПовторногоВыполнения = СпособыПовторногоВыполнения[2].Значение Тогда // Линейно
+ ЧастиСтроки.Добавить(" .ЛинейноОтложенныеВыполнения(ДополнительныеПараметры");
+
+ ОкончанияСтроки.Добавить(?(ДлительностьПаузыПовторногоВыполнения = 1, "", XMLСтрока(ДлительностьПаузыПовторногоВыполнения)));
+ ОкончанияСтроки.Добавить(?(КоэффициентУвеличенияПаузыПовторногоВыполнения = 1, "", XMLСтрока(КоэффициентУвеличенияПаузыПовторногоВыполнения)));
+ ОкончанияСтроки.Добавить(?(ПорогКоличестваПопытокПовторногоВыполнения = 9, "", XMLСтрока(ПорогКоличестваПопытокПовторногоВыполнения)));
+ ОкончанияСтроки.Добавить(?(МаксимальнаяДлительностьПаузыПовторногоВыполнения = 600, "", XMLСтрока(МаксимальнаяДлительностьПаузыПовторногоВыполнения)));
+ ОкончанияСтроки.Добавить(?(КодыСостояния.Количество() = 0, "", "КодыСостоянияПовторногоВыполнения"));
+ ИначеЕсли СпособПовторногоВыполнения = СпособыПовторногоВыполнения[3].Значение Тогда // Экспоненциально
+ ЧастиСтроки.Добавить(" .ЭкспоненциальноОтложенныеВыполнения(ДополнительныеПараметры");
+
+ ОкончанияСтроки.Добавить(?(ДлительностьПаузыПовторногоВыполнения = 1, "", XMLСтрока(ДлительностьПаузыПовторногоВыполнения)));
+ ОкончанияСтроки.Добавить(?(КоэффициентУвеличенияПаузыПовторногоВыполнения = 2, "", XMLСтрока(КоэффициентУвеличенияПаузыПовторногоВыполнения)));
+ ОкончанияСтроки.Добавить(?(ПорогКоличестваПопытокПовторногоВыполнения = 9, "", XMLСтрока(ПорогКоличестваПопытокПовторногоВыполнения)));
+ ОкончанияСтроки.Добавить(?(МаксимальнаяДлительностьПаузыПовторногоВыполнения = 3600, "", XMLСтрока(МаксимальнаяДлительностьПаузыПовторногоВыполнения)));
+ ОкончанияСтроки.Добавить(?(КодыСостояния.Количество() = 0, "", "КодыСостоянияПовторногоВыполнения"));
КонецЕсли;
+
+ ВсегоЧастейОкончания = ОкончанияСтроки.Количество();
+ Для _ = 1 По ВсегоЧастейОкончания Цикл
+ Если ОкончанияСтроки[ОкончанияСтроки.ВГраница()] <> "" Тогда
+ Прервать;
+ КонецЕсли;
+
+ ОкончанияСтроки.Удалить(ОкончанияСтроки.ВГраница());
+ КонецЦикла;
+
+ ЧастиСтроки.Добавить(СтрСоединить(ОкончанияСтроки, ", "));
+ Построитель.Добавить(СтрСоединить(ЧастиСтроки, ", ") + ")");
+
+ ЕстьДополнительныеПараметры = Истина;
КонецПроцедуры
&НаКлиенте
@@ -1640,8 +2217,8 @@
Построитель.Добавить(СтрШаблон(
" .ДобавитьПараметр(ПараметрыЗапроса, ""%1"", ""%2"")",
- СтрЗаменить(Стр.Ключ, """", """"""),
- СтрЗаменить(Стр.Значение, """", """""")
+ КавычкиВТексте1С(Стр.Ключ),
+ КавычкиВТексте1С(Стр.Значение)
));
ЕстьПараметрыЗапроса = Истина;
@@ -1650,74 +2227,193 @@
&НаКлиенте
Процедура ДобавитьВКодЗапросаЗаголовки(Построитель, ЕстьДополнительныеПараметры)
+ КлючАгент = НРег(КлиентHTTPПовтИсп.ЗаголовокАгентПользователя());
+ ЗначениеАгент = АгентПользователя;
+
Для Каждого Стр Из ЗаголовкиЗапроса Цикл
Если НЕ Стр.Активно Тогда
Продолжить;
КонецЕсли;
- Построитель.Добавить(СтрШаблон(" .УстановитьЗаголовок(ДополнительныеПараметры, ""%1"", ""%2"")", Стр.Ключ, СтрЗаменить(Стр.Значение, """", """""")));
+ Если НРег(Стр.Ключ) = КлючАгент Тогда
+ ЗначениеАгент = Стр.Значение;
+ Иначе
+ Построитель.Добавить(СтрШаблон(" .УстановитьЗаголовок(ДополнительныеПараметры, ""%1"", ""%2"")", Стр.Ключ, КавычкиВТексте1С(Стр.Значение)));
+ КонецЕсли;
ЕстьДополнительныеПараметры = Истина;
КонецЦикла;
+
+ Если НЕ ПустаяСтрока(ЗначениеАгент) Тогда
+ Построитель.Добавить(СтрШаблон(" .УстановитьАгентаПользователя(ДополнительныеПараметры, ""%1"")", ЗначениеАгент));
+
+ ЕстьДополнительныеПараметры = Истина;
+ КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьВКодЗапросаСжатиеОтвета(Построитель, ЕстьДополнительныеПараметры)
- Если ПоддержкаСжатогоОтвета Тогда
- Построитель.Добавить(" .УстановитьСжатиеОтветаGZIP(ДополнительныеПараметры)");
-
- ЕстьДополнительныеПараметры = Истина;
+ Если НЕ ПоддержкаСжатогоОтвета Тогда
+ Возврат;
+ КонецЕсли;
+
+ Построитель.Добавить(" .УстановитьСжатиеОтветаGZIP(ДополнительныеПараметры)");
+
+ ЕстьДополнительныеПараметры = Истина;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ДобавитьВКодЗапросаТаймаут(Построитель, ЕстьДополнительныеПараметры)
+ Если Таймаут = 0 Тогда
+ Возврат;
+ КонецЕсли;
+
+ Построитель.Добавить(СтрШаблон(" .УстановитьТаймаут(ДополнительныеПараметры, %1)", XMLСтрока(Таймаут)));
+
+ ЕстьДополнительныеПараметры = Истина;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ДобавитьВКодЗапросаСертификаты(Построитель, ЕстьФайлКлиентскогоСертификата, ЕстьФайлСертификатовУЦ, ЕстьДополнительныеПараметры)
+ Если НЕ ИспользоватьСертификаты ИЛИ ПустаяСтрока(ИмяФайлаКлиентскогоСертификата) Тогда
+ Возврат;
+ КонецЕсли;
+
+ ЕстьДополнительныеПараметры = Истина;
+ ЕстьФайлКлиентскогоСертификата = Истина;
+
+ ЧастиСтроки = Новый Массив;
+ ЧастиСтроки.Добавить(
+ " .ИспользоватьФайлСертификатаКлиента(ДополнительныеПараметры, ФайлКлиентскогоСертификата"
+ );
+
+ Если ПарольКлиентскогоСертификата <> "" Тогда
+ ЧастиСтроки.Добавить(СтрШаблон(
+ """%1""",
+ КавычкиВТексте1С(ОтображениеСекрета(ПарольКлиентскогоСертификата, Элементы.ПарольКлиентскогоСертификата))
+ ));
+ КонецЕсли;
+ Построитель.Добавить(СтрСоединить(ЧастиСтроки, ", ") + ")");
+
+ Если ПустаяСтрока(ИмяФайлаСертификатовУЦ) Тогда
+ Возврат;
КонецЕсли;
+
+ ЕстьФайлСертификатовУЦ = Истина;
+
+ ЧастиСтроки = Новый Массив;
+ ЧастиСтроки.Добавить(
+ " .ИспользоватьФайлСертификатовУдостоверяющихЦентров(ДополнительныеПараметры, ФайлСертификатовУЦ"
+ );
+
+ Если ПарольФайлаСертификатовУЦ <> "" Тогда
+ ЧастиСтроки.Добавить(СтрШаблон(
+ """%1""",
+ КавычкиВТексте1С(ОтображениеСекрета(ПарольФайлаСертификатовУЦ, Элементы.ПарольФайлаСертификатовУЦ))
+ ));
+ КонецЕсли;
+ Построитель.Добавить(СтрСоединить(ЧастиСтроки, ", ") + ")");
КонецПроцедуры
&НаКлиенте
-Процедура ДобавитьВКодЗапросаАвторизацию(Построитель, ЕстьДополнительныеПараметры)
- ТипАвторизацииСписокВыбора = Элементы.ТипАвторизации.СписокВыбора;
- Если ТипАвторизации = ТипАвторизацииСписокВыбора[1].Значение Тогда // Basic
+Процедура ДобавитьВКодЗапросаАутентификацию(Построитель, ЕстьДополнительныеПараметры)
+ ТипАутентификацииСписокВыбора = Элементы.ТипАутентификации.СписокВыбора;
+ Если ТипАутентификации = ТипАутентификацииСписокВыбора[1].Значение Тогда // Basic
Построитель.Добавить(СтрШаблон(
" .УстановитьBasicАвторизацию(ДополнительныеПараметры, ""%1"", ""%2"")",
- ПользовательАвторизации,
- ПарольАвторизации
+ ПользовательАутентификации,
+ КавычкиВТексте1С(ОтображениеСекрета(ПарольАутентификации, Элементы.ПарольАутентификации))
));
ЕстьДополнительныеПараметры = Истина;
- ИначеЕсли ТипАвторизации = ТипАвторизацииСписокВыбора[2].Значение Тогда // NTLM
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[2].Значение Тогда // NTLM
Построитель.Добавить(СтрШаблон(
" .УстановитьNTLMАвторизацию(ДополнительныеПараметры, ""%1"", ""%2"")",
- ПользовательАвторизации,
- ПарольАвторизации
+ ПользовательАутентификации,
+ КавычкиВТексте1С(ОтображениеСекрета(ПарольАутентификации, Элементы.ПарольАутентификации))
));
ЕстьДополнительныеПараметры = Истина;
- ИначеЕсли ТипАвторизации = ТипАвторизацииСписокВыбора[3].Значение Тогда // Digest
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[3].Значение Тогда // Digest
Построитель.Добавить(СтрШаблон(
" .УстановитьDigestАвторизацию(ДополнительныеПараметры, ""%1"", ""%2"")",
- ПользовательАвторизации,
- ПарольАвторизации
+ ПользовательАутентификации,
+ КавычкиВТексте1С(ОтображениеСекрета(ПарольАутентификации, Элементы.ПарольАутентификации))
));
ЕстьДополнительныеПараметры = Истина;
- ИначеЕсли ТипАвторизации = ТипАвторизацииСписокВыбора[4].Значение Тогда // Bearer
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[4].Значение Тогда // Bearer
Построитель.Добавить(СтрШаблон(
" .УстановитьBearerАвторизацию(ДополнительныеПараметры, ""%1"")",
- ТокенАвторизации
+ ОтображениеСекрета(ТокенАутентификации, Элементы.ТокенАутентификации)
));
+ ЕстьДополнительныеПараметры = Истина;
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[5].Значение Тогда // AWS4-HMAC-SHA256
+ ЧастиСтроки = Новый Массив;
+ ЧастиСтроки.Добавить(СтрШаблон(
+ " .УстановитьAWS4Авторизацию(ДополнительныеПараметры, ""%1"", ""%2""",
+ AWSКлючДоступа,
+ КавычкиВТексте1С(ОтображениеСекрета(AWSСекретныйКлюч, Элементы.СекретныйКлючAWS))
+ ));
+ Если НЕ ПустаяСтрока(AWSРегион) Тогда
+ ЧастиСтроки.Добавить(СтрШаблон(", ""%1""", AWSРегион));
+ КонецЕсли;
+ Если НЕ ПустаяСтрока(AWSСервис) Тогда
+ ЧастиСтроки.Добавить(?(
+ ПустаяСтрока(AWSРегион),
+ СтрШаблон(", , ""%1""", AWSСервис),
+ СтрШаблон(", ""%1""", AWSСервис)
+ ));
+ КонецЕсли;
+ ЧастиСтроки.Добавить(")");
+
+ Построитель.Добавить(СтрСоединить(ЧастиСтроки, ""));
+
+ ЕстьДополнительныеПараметры = Истина;
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[6].Значение Тогда // Hawk
+ ЧастиСтроки = Новый Массив;
+ ЧастиСтроки.Добавить(СтрШаблон(
+ " .УстановитьHawkАвторизацию(ДополнительныеПараметры, ""%1"", ""%2""",
+ HawkИдентификатор,
+ КавычкиВТексте1С(ОтображениеСекрета(HawkКлюч, Элементы.КлючHawk))
+ ));
+
+ ОкончанияСтроки = Новый Массив;
+ ОкончанияСтроки.Добавить(СокрЛП(HawkДополнение));
+ ОкончанияСтроки.Добавить(СокрЛП(HawkИдентификаторПриложения));
+ ОкончанияСтроки.Добавить(СокрЛП(HawkДелегирование));
+ Для я = 0 По 2 Цикл
+ Если ОкончанияСтроки[ОкончанияСтроки.ВГраница()] <> "" Тогда
+ Прервать;
+ КонецЕсли;
+
+ ОкончанияСтроки.Удалить(ОкончанияСтроки.ВГраница());
+ КонецЦикла;
+
+ Для Каждого Окончание Из ОкончанияСтроки Цикл
+ ЧастиСтроки.Добавить(?(Окончание = "", "", СтрШаблон("""%1""", СокрЛП(Окончание))));
+ КонецЦикла;
+
+ Построитель.Добавить(СтрСоединить(ЧастиСтроки, ", ") + ")");
+
ЕстьДополнительныеПараметры = Истина;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьВКодЗапросаФайлТелаОтвета(Построитель, ЕстьДополнительныеПараметры, ТребуетсяИмяФайлаТелаОтвета)
- Если ТелоОтветаВФайл Тогда
- ЕстьДополнительныеПараметры = Истина;
- ТребуетсяИмяФайлаТелаОтвета = ПустаяСтрока(ИмяФайлаТелаОтвета);
-
- Построитель.Добавить(СтрШаблон(
- " .УстановитьИмяВыходногоФайла(ДополнительныеПараметры, %1)",
- ?(ТребуетсяИмяФайлаТелаОтвета, "ИмяФайлаТелаОтвета", СтрШаблон("""%1""", ИмяФайлаТелаОтвета))
- ));
+ Если НЕ ТелоОтветаВФайл Тогда
+ Возврат;
КонецЕсли;
+
+ ЕстьДополнительныеПараметры = Истина;
+ ТребуетсяИмяФайлаТелаОтвета = ПустаяСтрока(ИмяФайлаТелаОтвета);
+
+ Построитель.Добавить(СтрШаблон(
+ " .УстановитьИмяВыходногоФайла(ДополнительныеПараметры, %1)",
+ ?(ТребуетсяИмяФайлаТелаОтвета, "ИмяФайлаТелаОтвета", СтрШаблон("""%1""", ИмяФайлаТелаОтвета))
+ ));
КонецПроцедуры
&НаКлиенте
@@ -2009,159 +2705,624 @@
КонецПроцедуры
&НаКлиенте
-Процедура ДобавитьВКодЗапросаМетодDelete(Построитель, ЕстьТекстТелаЗапроса, Знач ЕстьПараметрыЗапроса, Знач ЕстьДополнительныеПараметры)
- ТипТелаЗапросаСписокВыбора = Элементы.ТипТелаЗапроса.СписокВыбора;
- Если ТипТелаЗапроса = ТипТелаЗапросаСписокВыбора[3].Значение Тогда // raw
- ДобавитьВКодЗапросаМетодDeleteТекст(Построитель, ЕстьТекстТелаЗапроса, ЕстьПараметрыЗапроса, ЕстьДополнительныеПараметры);
- Иначе
- ДобавитьВКодЗапросаМетодDeleteБезТела(Построитель, ЕстьПараметрыЗапроса, ЕстьДополнительныеПараметры);
+Процедура ДобавитьВКодЗапросаМетодDelete(Построитель, ЕстьТекстТелаЗапроса, Знач ЕстьПараметрыЗапроса, Знач ЕстьДополнительныеПараметры)
+ ТипТелаЗапросаСписокВыбора = Элементы.ТипТелаЗапроса.СписокВыбора;
+ Если ТипТелаЗапроса = ТипТелаЗапросаСписокВыбора[3].Значение Тогда // raw
+ ДобавитьВКодЗапросаМетодDeleteТекст(Построитель, ЕстьТекстТелаЗапроса, ЕстьПараметрыЗапроса, ЕстьДополнительныеПараметры);
+ Иначе
+ ДобавитьВКодЗапросаМетодDeleteБезТела(Построитель, ЕстьПараметрыЗапроса, ЕстьДополнительныеПараметры);
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ДобавитьВКодЗапросаМетодHead(Построитель, Знач ЕстьПараметрыЗапроса, Знач ЕстьДополнительныеПараметры)
+ Построитель.Добавить(СтрШаблон(
+ " .ПолучитьЗаголовки(ИдентификаторРесурса%1%2%3);",
+ ?(ЕстьПараметрыЗапроса ИЛИ ЕстьДополнительныеПараметры, ", ", ""),
+ ?(ЕстьПараметрыЗапроса, "ПараметрыЗапроса", ""),
+ ?(ЕстьДополнительныеПараметры, ", ДополнительныеПараметры", "")
+ ));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ДобавитьВКодЗапросаМетод(Построитель, ЕстьТекстТелаЗапроса, ЕстьПоляФормы, ТекстПолейФормы, ФайлыПолейФормы, Знач ЕстьПараметрыЗапроса, ЕстьДополнительныеПараметры)
+ Если Схема = Элементы.Схема.СписокВыбора[0].Значение Тогда // GET
+ ДобавитьВКодЗапросаМетодGet(Построитель, ЕстьПараметрыЗапроса, ЕстьДополнительныеПараметры);
+ ИначеЕсли Схема = Элементы.Схема.СписокВыбора[1].Значение Тогда // POST
+ ДобавитьВКодЗапросаМетодPost(Построитель, ЕстьТекстТелаЗапроса, ЕстьПоляФормы, ТекстПолейФормы, ФайлыПолейФормы, ЕстьПараметрыЗапроса, ЕстьДополнительныеПараметры);
+ ИначеЕсли Схема = Элементы.Схема.СписокВыбора[2].Значение Тогда // PUT
+ ДобавитьВКодЗапросаМетодPut(Построитель, ЕстьТекстТелаЗапроса, ФайлыПолейФормы, ЕстьПараметрыЗапроса, ЕстьДополнительныеПараметры);
+ ИначеЕсли Схема = Элементы.Схема.СписокВыбора[3].Значение Тогда // DELETE
+ ДобавитьВКодЗапросаМетодDelete(Построитель, ЕстьТекстТелаЗапроса, ЕстьПараметрыЗапроса, ЕстьДополнительныеПараметры);
+ ИначеЕсли Схема = Элементы.Схема.СписокВыбора[4].Значение Тогда // HEAD
+ ДобавитьВКодЗапросаМетодHead(Построитель, ЕстьПараметрыЗапроса, ЕстьДополнительныеПараметры);
+ ИначеЕсли Схема = Элементы.Схема.СписокВыбора[5].Значение Тогда // PATCH
+ ДобавитьВКодЗапросаМетодPatch(Построитель, ЕстьТекстТелаЗапроса, ФайлыПолейФормы, ЕстьПараметрыЗапроса, ЕстьДополнительныеПараметры);
+ Иначе
+ ВызватьИсключение СтрШаблон("Схема запроса %1 не поддерживается", Схема);
+ КонецЕсли;
+
+ ПредыдущаяЧасть = Построитель[Построитель.ВГраница() - 1];
+ Если НЕ СтрНачинаетсяС(ПредыдущаяЧасть, " .") Тогда
+ Построитель[Построитель.ВГраница() - 1] = ПредыдущаяЧасть + СокрЛП(Построитель[Построитель.ВГраница()]);
+ Построитель.Удалить(Построитель.ВГраница());
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ДобавитьВКодЗапросаИнициализациюПолейФормы(Построитель, ТекстПолейФормы, ФайлыПолейФормы)
+ Смещение = 0;
+ Для Каждого ФайлПоляФормы Из ФайлыПолейФормы Цикл
+ Построитель.Вставить(
+ 1 + Смещение,
+ СтрШаблон("%1 = Новый Файл(""%2"");", ФайлПоляФормы.ИмяПеременной, ФайлПоляФормы.Путь)
+ );
+
+ Смещение = Смещение + 1;
+ КонецЦикла;
+ Если Смещение > 0 Тогда
+ Построитель.Вставить(1 + Смещение, "");
+ КонецЕсли;
+
+ Смещение = 0;
+ Для Каждого ТекстПоляФормы Из ТекстПолейФормы Цикл
+ Построитель.Вставить(
+ 1 + Смещение,
+ ИнициализацияТекстовойПеременной(ТекстПоляФормы.ИмяПеременной, ТекстПоляФормы.ЗначениеПеременной)
+ );
+
+ Смещение = Смещение + 1;
+ КонецЦикла;
+ Если Смещение > 0 Тогда
+ Построитель.Вставить(1 + Смещение, "");
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ДобавитьВКодЗапросаИнициализациюПовторногоВыполнения(Построитель, Знач КодыСостояния)
+ Если КодыСостояния.Количество() = 0 Тогда
+ Возврат;
+ КонецЕсли;
+
+ КонстантыКодовСостояния = Новый Соответствие;
+ КонстантыКодовСостояния.Вставить(200, "КлиентHTTPПовтИсп.КодСостоянияУспешно()");
+ КонстантыКодовСостояния.Вставить(201, "КлиентHTTPПовтИсп.КодСостоянияСоздано()");
+ КонстантыКодовСостояния.Вставить(204, "КлиентHTTPПовтИсп.КодСостоянияУспешноБезСодержимого()");
+ КонстантыКодовСостояния.Вставить(301, "КлиентHTTPПовтИсп.КодСостоянияПеремещен()");
+ КонстантыКодовСостояния.Вставить(302, "КлиентHTTPПовтИсп.КодСостоянияНайден()");
+ КонстантыКодовСостояния.Вставить(303, "КлиентHTTPПовтИсп.КодСостоянияПросмотрДругихРесурсов()");
+ КонстантыКодовСостояния.Вставить(307, "КлиентHTTPПовтИсп.КодСостоянияВременноеПеренаправление()");
+ КонстантыКодовСостояния.Вставить(308, "КлиентHTTPПовтИсп.КодСостоянияПеренаправление()");
+ КонстантыКодовСостояния.Вставить(400, "КлиентHTTPПовтИсп.КодСостоянияПлохойЗапрос()");
+ КонстантыКодовСостояния.Вставить(401, "КлиентHTTPПовтИсп.КодСостоянияНеАвторизовано()");
+ КонстантыКодовСостояния.Вставить(403, "КлиентHTTPПовтИсп.КодСостоянияЗапрещено()");
+ КонстантыКодовСостояния.Вставить(404, "КлиентHTTPПовтИсп.КодСостоянияНеНайден()");
+ КонстантыКодовСостояния.Вставить(405, "КлиентHTTPПовтИсп.КодСостоянияМетодНеРазрешен()");
+ КонстантыКодовСостояния.Вставить(408, "КлиентHTTPПовтИсп.КодСостоянияТаймаутНаКлиенте()");
+ КонстантыКодовСостояния.Вставить(410, "КлиентHTTPПовтИсп.КодСостоянияУдалено()");
+ КонстантыКодовСостояния.Вставить(413, "КлиентHTTPПовтИсп.КодСостоянияПревышенЛимитТела()");
+ КонстантыКодовСостояния.Вставить(418, "КлиентHTTPПовтИсп.КодСостоянияЧайник()");
+ КонстантыКодовСостояния.Вставить(429, "КлиентHTTPПовтИсп.КодСостоянияСлишкомМногоЗапросов()");
+ КонстантыКодовСостояния.Вставить(500, "КлиентHTTPПовтИсп.КодСостоянияВнутренняяОшибкаСервера()");
+ КонстантыКодовСостояния.Вставить(501, "КлиентHTTPПовтИсп.КодСостоянияНеВыполнено()");
+ КонстантыКодовСостояния.Вставить(502, "КлиентHTTPПовтИсп.КодСостоянияПлохойШлюз()");
+ КонстантыКодовСостояния.Вставить(503, "КлиентHTTPПовтИсп.КодСостоянияСервисНедоступен()");
+ КонстантыКодовСостояния.Вставить(504, "КлиентHTTPПовтИсп.КодСостоянияТаймаутНаСервере()");
+
+ ЧастиСтроки = Новый Массив;
+ ЧастиСтроки.Добавить("КодыСостоянияПовторногоВыполнения = Новый Массив;");
+
+ Для Каждого Код Из КодыСостояния Цикл
+ Константа = КонстантыКодовСостояния.Получить(Код);
+ ЧастиСтроки.Добавить(СтрШаблон("КодыСостоянияПовторногоВыполнения.Добавить(%1);", ?(Константа = Неопределено, XMLСтрока(Код), Константа)));
+ КонецЦикла;
+
+ Построитель.Вставить(1, "");
+ Построитель.Вставить(1, СтрСоединить(ЧастиСтроки, Символы.ПС));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ДобавитьВКодЗапросаИнициализациюКонфигурации(Построитель, Знач ЕстьПараметрыЗапроса, Знач ЕстьДополнительныеПараметры, Знач ТребуетсяИмяФайлаТелаОтвета, Знач ЕстьТекстТелаЗапроса, Знач ЕстьПоляФормы, Знач ЕстьФайлКлиентскогоСертификата, Знач ЕстьФайлСертификатовУЦ)
+ Если ЕстьФайлСертификатовУЦ Тогда
+ Построитель.Вставить(1, СтрШаблон("ФайлСертификатовУЦ = Новый Файл(""%1"");", ИмяФайлаСертификатовУЦ));
+ КонецЕсли;
+
+ Если ЕстьФайлКлиентскогоСертификата Тогда
+ Построитель.Вставить(1, СтрШаблон("ФайлКлиентскогоСертификата = Новый Файл(""%1"");", ИмяФайлаКлиентскогоСертификата));
+ КонецЕсли;
+
+ Если ЕстьПоляФормы Тогда
+ Построитель.Вставить(1, "ПоляФормы = КлиентHTTPКлиентСервер.НовыеПоляФормы();");
+ КонецЕсли;
+
+ Если ЕстьТекстТелаЗапроса Тогда
+ Построитель.Вставить(1, ИнициализацияТекстовойПеременной("ТелоЗапросаТекст", ТелоЗапросаТекст));
+ КонецЕсли;
+
+ Если ЕстьДополнительныеПараметры Тогда
+ Построитель.Вставить(1, "ДополнительныеПараметры = КлиентHTTPКлиентСервер.НовыеДополнительныеПараметры();");
+ КонецЕсли;
+
+ Если ЕстьПараметрыЗапроса Тогда
+ Построитель.Вставить(1, "ПараметрыЗапроса = КлиентHTTPКлиентСервер.НовыеПараметрыЗапроса();");
+ КонецЕсли;
+
+ Если ТребуетсяИмяФайлаТелаОтвета Тогда
+ Построитель.Вставить(1, "ИмяФайлаТелаОтвета = ПолучитьИмяВременногоФайла(""dat"");");
+ КонецЕсли;
+
+ Построитель.Вставить(
+ 1 + ТребуетсяИмяФайлаТелаОтвета + ЕстьПараметрыЗапроса + ЕстьДополнительныеПараметры + ЕстьПоляФормы + ЕстьТекстТелаЗапроса + ЕстьФайлКлиентскогоСертификата + ЕстьФайлСертификатовУЦ,
+ ""
+ );
+КонецПроцедуры
+
+&НаКлиенте
+Функция КодЗапросаКонсоли()
+ ЧастиКода = Новый Массив;
+ ЧастиСтрокиКода = Новый Массив;
+
+ ЕстьФайлКлиентскогоСертификата = Ложь;
+ ЕстьФайлСертификатовУЦ = Ложь;
+ ЕстьДополнительныеПараметры = Ложь;
+ ЕстьПараметрыЗапроса = Ложь;
+ ЕстьПоляФормы = Ложь;
+ ЕстьТекстТелаЗапроса = Ложь;
+ ТребуетсяИмяФайлаТелаОтвета = Ложь;
+ ТекстПолейФормы = Новый Массив;
+ ФайлыПолейФормы = Новый Массив;
+ КодыСостоянияПовторногоВыполнения = Новый Массив;
+
+ ДобавитьВКодЗапросаИдентификаторРесурса(ЧастиКода);
+
+ // Начало текучего интерфейса
+ ЧастиКода.Добавить("Ответ = КлиентHTTPКлиентСервер");
+
+ ДобавитьВКодЗапросаТаймаут(ЧастиКода, ЕстьДополнительныеПараметры);
+ ДобавитьВКодЗапросаИспользованиеПрокси(ЧастиКода, ЕстьДополнительныеПараметры);
+ ДобавитьВКодЗапросаИспользованиеСессии(ЧастиКода, ЕстьДополнительныеПараметры);
+ ДобавитьВКодЗапросаПовторноеВыполнение(ЧастиКода, КодыСостоянияПовторногоВыполнения, ЕстьДополнительныеПараметры);
+ ДобавитьВКодЗапросаПараметры(ЧастиКода, ЕстьПараметрыЗапроса);
+ ДобавитьВКодЗапросаЗаголовки(ЧастиКода, ЕстьДополнительныеПараметры);
+ ДобавитьВКодЗапросаСжатиеОтвета(ЧастиКода, ЕстьДополнительныеПараметры);
+ ДобавитьВКодЗапросаСертификаты(ЧастиКода, ЕстьФайлКлиентскогоСертификата, ЕстьФайлСертификатовУЦ, ЕстьДополнительныеПараметры);
+ ДобавитьВКодЗапросаАутентификацию(ЧастиКода, ЕстьДополнительныеПараметры);
+ ДобавитьВКодЗапросаФайлТелаОтвета(ЧастиКода, ЕстьДополнительныеПараметры, ТребуетсяИмяФайлаТелаОтвета);
+ ДобавитьВКодЗапросаМетод(ЧастиКода, ЕстьТекстТелаЗапроса, ЕстьПоляФормы, ТекстПолейФормы, ФайлыПолейФормы, ЕстьПараметрыЗапроса, ЕстьДополнительныеПараметры);
+ ДобавитьВКодЗапросаИнициализациюПолейФормы(ЧастиКода, ТекстПолейФормы, ФайлыПолейФормы);
+ ДобавитьВКодЗапросаИнициализациюПовторногоВыполнения(ЧастиКода, КодыСостоянияПовторногоВыполнения);
+ ДобавитьВКодЗапросаИнициализациюКонфигурации(ЧастиКода, ЕстьПараметрыЗапроса, ЕстьДополнительныеПараметры, ТребуетсяИмяФайлаТелаОтвета, ЕстьТекстТелаЗапроса, ЕстьПоляФормы, ЕстьФайлКлиентскогоСертификата, ЕстьФайлСертификатовУЦ);
+
+ Возврат СтрСоединить(ЧастиКода, Символы.ПС);
+КонецФункции
+
+&НаКлиенте
+Функция ИнициализацияТекстовойПеременной(Знач ИмяПеременной, Знач ЗначениеПеременной)
+ Возврат СтрШаблон(
+ "%1 = %2""%3"";",
+ ИмяПеременной,
+ ?(
+ СтрНайти(ЗначениеПеременной, Символы.ПС) > 0,
+ "
+ | ",
+ ""
+ ),
+ СтрЗаменить(КавычкиВТексте1С(ЗначениеПеременной), Символы.ПС, Символы.ПС + " |")
+ );
+КонецФункции
+
+&НаКлиенте
+Функция КавычкиВТексте1С(Знач Текст)
+ Возврат СтрЗаменить(Текст, """", """""");
+КонецФункции
+#КонецОбласти
+
+#Область ГенерацияКомандыCurl
+&НаКлиенте
+Функция ЭкранированиеАпострофаUnix(Знач Текст)
+ Возврат СтрЗаменить(Текст, "'", "'\''")
+КонецФункции
+
+&НаКлиенте
+Функция ЭкранированиеСимволовЗначенияПоляФормы(Знач Текст, Знач ЭкранироватьОбратныйСлеш)
+ Возврат СтрЗаменить(
+ ЭкранированиеАпострофаUnix(
+ ?(
+ ЭкранироватьОбратныйСлеш,
+ СтрЗаменить(Текст, "\", "\\"),
+ Текст
+ )
+ ), """", "\"""
+ );
+КонецФункции
+
+&НаКлиенте
+Процедура ЗаполнитьПовторноеВыполнениеCurlКоманды(ЧастиКоманды)
+ Способы = Элементы.СпособПовторногоВыполнения.СписокВыбора;
+ Если СпособПовторногоВыполнения <> Способы[1].Значение И СпособПовторногоВыполнения <> Способы[3].Значение Тогда // не Фиксировано и не Экспоненциально
+ Возврат;
+ КонецЕсли;
+
+ ЧастиКоманды.Добавить("--retry");
+ ЧастиКоманды.Добавить(XMLСтрока(ПорогКоличестваПопытокПовторногоВыполнения));
+
+ Если СпособПовторногоВыполнения = Способы[1].Значение Тогда // Фиксировано
+ ЧастиКоманды.Добавить("--retry-delay");
+ ЧастиКоманды.Добавить(XMLСтрока(ДлительностьПаузыПовторногоВыполнения));
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьКлиентскийСертификатCurlКоманды(ЧастиКоманды)
+ Если НЕ ИспользоватьСертификаты ИЛИ ПустаяСтрока(ИмяФайлаКлиентскогоСертификата) Тогда
+ Возврат;
+ КонецЕсли;
+
+ Если НЕ ПустаяСтрока(ИмяФайлаСертификатовУЦ) Тогда
+ ЧастиКоманды.Добавить("--cacert");
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", ЭкранированиеАпострофаUnix(СокрЛП(ИмяФайлаСертификатовУЦ))));
+ КонецЕсли;
+
+ ФайлКС = Новый Файл(ИмяФайлаКлиентскогоСертификата);
+ РасширениеКС = НРег(ФайлКС.Расширение);
+ Если РасширениеКС = ".p12" ИЛИ РасширениеКС = ".pfx" Тогда
+ ЧастиКоманды.Добавить("--cert-type P12");
+ КонецЕсли;
+
+ ЧастиСертификата = Новый Массив;
+
+ ЧастиКоманды.Добавить("--cert");
+ ЧастиСертификата.Добавить(СокрЛП(ИмяФайлаКлиентскогоСертификата));
+
+ Пароль = ОтображениеСекрета(ПарольКлиентскогоСертификата, Элементы.ПарольКлиентскогоСертификата, Ложь);
+ Если Пароль <> "" Тогда
+ ЧастиСертификата.Добавить(Пароль);
+ КонецЕсли;
+
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", ЭкранированиеАпострофаUnix(СтрСоединить(ЧастиСертификата, ":"))));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьПользователяИПарольCurlКоманды(ЧастиКоманды)
+ Если НЕ ЗначениеЗаполнено(ПользовательАутентификации) Тогда
+ Возврат;
+ КонецЕсли;
+
+ ЧастиАутентификации = Новый Массив;
+
+ ЧастиКоманды.Добавить("-u");
+ ЧастиАутентификации.Добавить(ПользовательАутентификации);
+ ЧастиАутентификации.Добавить(ОтображениеСекрета(ПарольАутентификации, Элементы.ПарольАутентификации));
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", ЭкранированиеАпострофаUnix(СтрСоединить(ЧастиАутентификации, ":"))));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьAWS4CurlКоманды(ЧастиКоманды)
+ ЧастиАутентификации = Новый Массив;
+
+ ЧастиКоманды.Добавить("-u");
+ ЧастиАутентификации.Добавить(AWSКлючДоступа);
+ ЧастиАутентификации.Добавить(ОтображениеСекрета(AWSСекретныйКлюч, Элементы.СекретныйКлючAWS));
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", ЭкранированиеАпострофаUnix(СтрСоединить(ЧастиАутентификации, ":"))));
+
+ ЧастиКоманды.Добавить("--aws-sigv4");
+ ЧастиАутентификации.Очистить();
+ ЧастиАутентификации.Добавить("aws:amz");
+ Если НЕ ПустаяСтрока(AWSРегион) Тогда
+ ЧастиАутентификации.Добавить(AWSРегион);
+ Если НЕ ПустаяСтрока(AWSСервис) Тогда
+ ЧастиАутентификации.Добавить(AWSСервис);
+ КонецЕсли;
+ КонецЕсли;
+
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", ЭкранированиеАпострофаUnix(СтрСоединить(ЧастиАутентификации, ":"))));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьАутентификациюCurlКоманды(ЧастиКоманды)
+ Если ТипАутентификации = Элементы.ТипАутентификации.СписокВыбора[0].Значение Тогда
+ ИначеЕсли ТипАутентификации = Элементы.ТипАутентификации.СписокВыбора[1].Значение Тогда // Basic
+ ЗаполнитьПользователяИПарольCurlКоманды(ЧастиКоманды);
+ ЧастиКоманды.Добавить("--basic");
+ ИначеЕсли ТипАутентификации = Элементы.ТипАутентификации.СписокВыбора[2].Значение Тогда // NTLM
+ ЗаполнитьПользователяИПарольCurlКоманды(ЧастиКоманды);
+ ЧастиКоманды.Добавить("--ntlm");
+ ИначеЕсли ТипАутентификации = Элементы.ТипАутентификации.СписокВыбора[3].Значение Тогда // Digest
+ ЗаполнитьПользователяИПарольCurlКоманды(ЧастиКоманды);
+ ЧастиКоманды.Добавить("--digest");
+ ИначеЕсли ТипАутентификации = Элементы.ТипАутентификации.СписокВыбора[4].Значение Тогда // Bearer
+ ЧастиКоманды.Добавить("--oauth2-bearer");
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", ЭкранированиеАпострофаUnix(ОтображениеСекрета(ТокенАутентификации, Элементы.ТокенАутентификации))));
+ ИначеЕсли ТипАутентификации = Элементы.ТипАутентификации.СписокВыбора[5].Значение Тогда // AWS4-HMAC-SHA256
+ ЗаполнитьAWS4CurlКоманды(ЧастиКоманды);
+ Иначе
+ СообщитьПользователю(СтрШаблон("Для типа аутентификации %1 нет отображения в команде curl", ТипАутентификации));
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьПолеФормыCurlКоманды(ЧастиКоманды, Знач Поле)
+ ТипMIME = "";
+ ИмяФайла = "";
+ ЭкранироватьОбратныйСлеш = Истина;
+ ТипыДанныхФормыФайл = Элементы.ТелоЗапросаДанныеФормы.ПодчиненныеЭлементы.ДанныеФормыТип.СписокВыбора[1].Значение;
+
+ ЧастиПоляФормы = Новый Массив;
+ ЧастиПоляФормы.Добавить(ЭкранированиеАпострофаUnix(Поле.Ключ));
+ ЧастиПоляФормы.Добавить("=");
+ Если Поле.Тип = ТипыДанныхФормыФайл Тогда
+ ЧастиПоляФормы.Добавить("@");
+
+ ФайлПоля = Новый Файл(Поле.Значение);
+ ИмяФайла = ФайлПоля.Имя;
+ ТипMIME = КлиентHTTPСлужебный.ТипMIMEРасширенияФайла(ФайлПоля.Расширение);
+ ЭкранироватьОбратныйСлеш = ?(ВыполнятьНаСервере, РазделительПутиСервера(), ПолучитьРазделительПутиКлиента()) <> "\";
+ КонецЕсли;
+
+ ЧастиПоляФормы.Добавить("""");
+ ЧастиПоляФормы.Добавить(ЭкранированиеСимволовЗначенияПоляФормы(Поле.Значение, ЭкранироватьОбратныйСлеш));
+
+ Если НЕ ПустаяСтрока(ИмяФайла) Тогда
+ ЧастиПоляФормы.Добавить(";filename=");
+ ЧастиПоляФормы.Добавить(ИмяФайла);
+ КонецЕсли;
+ Если НЕ ПустаяСтрока(ТипMIME) Тогда
+ ЧастиПоляФормы.Добавить(";type=");
+ ЧастиПоляФормы.Добавить(ТипMIME);
+ КонецЕсли;
+
+ ЧастиПоляФормы.Добавить("""");
+
+ ЧастиКоманды.Добавить("-F");
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", СтрСоединить(ЧастиПоляФормы, "")));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьДанныеФормыCurlКоманды(ЧастиКоманды, ОтобразитьPOST)
+ Если ТелоЗапросаДанныеФормы.Количество() = 0 Тогда
+ ОтобразитьPOST = Истина;
+ Возврат;
+ КонецЕсли;
+
+ Для Каждого Стр Из ТелоЗапросаДанныеФормы Цикл
+ ЗаполнитьПолеФормыCurlКоманды(ЧастиКоманды, Стр);
+ КонецЦикла;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьДанныеHTMLФормыCurlКоманды(ЧастиКоманды, ОтобразитьPOST)
+ Если ТелоЗапросаДанныеHTMLФормы.Количество() = 0 Тогда
+ ОтобразитьPOST = Истина;
+ Возврат;
+ КонецЕсли;
+
+ ПоляФормы = Новый Массив;
+ Для Каждого Стр Из ТелоЗапросаДанныеHTMLФормы Цикл
+ ЧастиКоманды.Добавить("--data-urlencode");
+ ЧастиКоманды.Добавить(СтрШаблон("'%1=%2'", КодированныйТекстВURL(Стр.Ключ), ЭкранированиеАпострофаUnix(Стр.Значение)));
+ КонецЦикла;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьТекстовыеДанныеCurlКоманды(ЧастиКоманды, ОтобразитьPOST)
+ Если ПустаяСтрока(ТелоЗапросаТекст) Тогда
+ ОтобразитьPOST = Истина;
+ Возврат;
КонецЕсли;
+
+ ЧастиКоманды.Добавить("--data-raw");
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", ЭкранированиеАпострофаUnix(ТелоЗапросаТекст)));
КонецПроцедуры
&НаКлиенте
-Процедура ДобавитьВКодЗапросаМетодHead(Построитель, Знач ЕстьПараметрыЗапроса, Знач ЕстьДополнительныеПараметры)
- Построитель.Добавить(СтрШаблон(
- " .ПолучитьЗаголовки(ИдентификаторРесурса%1%2%3);",
- ?(ЕстьПараметрыЗапроса ИЛИ ЕстьДополнительныеПараметры, ", ", ""),
- ?(ЕстьПараметрыЗапроса, "ПараметрыЗапроса", ""),
- ?(ЕстьДополнительныеПараметры, ", ДополнительныеПараметры", "")
- ));
+Процедура ЗаполнитьДанныеФайлаCurlКоманды(ЧастиКоманды, ОтобразитьPOST, ПредопределенныеЗаголовки)
+ Если ПустаяСтрока(ТелоЗапросаФайл) Тогда
+ ОтобразитьPOST = Истина;
+ Возврат;
+ КонецЕсли;
+
+ ЧастиКоманды.Добавить("--data-binary");
+ ЧастиКоманды.Добавить(СтрШаблон("@""%1""", ЭкранированиеАпострофаUnix(ТелоЗапросаФайл)));
+
+ ФайлТела = Новый Файл(ТелоЗапросаФайл);
+ ТипMIME = КлиентHTTPСлужебный.ТипMIMEРасширенияФайла(ФайлТела.Расширение);
+
+ ПредопределенныеЗаголовки.Добавить(Новый Структура("Ключ, Значение", "Content-Type", ТипMIME));
КонецПроцедуры
&НаКлиенте
-Процедура ДобавитьВКодЗапросаМетод(Построитель, ЕстьТекстТелаЗапроса, ЕстьПоляФормы, ТекстПолейФормы, ФайлыПолейФормы, Знач ЕстьПараметрыЗапроса, ЕстьДополнительныеПараметры)
- Если Схема = Элементы.Схема.СписокВыбора[0].Значение Тогда // GET
- ДобавитьВКодЗапросаМетодGet(Построитель, ЕстьПараметрыЗапроса, ЕстьДополнительныеПараметры);
- ИначеЕсли Схема = Элементы.Схема.СписокВыбора[1].Значение Тогда // POST
- ДобавитьВКодЗапросаМетодPost(Построитель, ЕстьТекстТелаЗапроса, ЕстьПоляФормы, ТекстПолейФормы, ФайлыПолейФормы, ЕстьПараметрыЗапроса, ЕстьДополнительныеПараметры);
- ИначеЕсли Схема = Элементы.Схема.СписокВыбора[2].Значение Тогда // PUT
- ДобавитьВКодЗапросаМетодPut(Построитель, ЕстьТекстТелаЗапроса, ФайлыПолейФормы, ЕстьПараметрыЗапроса, ЕстьДополнительныеПараметры);
- ИначеЕсли Схема = Элементы.Схема.СписокВыбора[3].Значение Тогда // DELETE
- ДобавитьВКодЗапросаМетодDelete(Построитель, ЕстьТекстТелаЗапроса, ЕстьПараметрыЗапроса, ЕстьДополнительныеПараметры);
- ИначеЕсли Схема = Элементы.Схема.СписокВыбора[4].Значение Тогда // HEAD
- ДобавитьВКодЗапросаМетодHead(Построитель, ЕстьПараметрыЗапроса, ЕстьДополнительныеПараметры);
- ИначеЕсли Схема = Элементы.Схема.СписокВыбора[5].Значение Тогда // PATCH
- ДобавитьВКодЗапросаМетодPatch(Построитель, ЕстьТекстТелаЗапроса, ФайлыПолейФормы, ЕстьПараметрыЗапроса, ЕстьДополнительныеПараметры);
+Процедура ЗаполнитьТелоЗапросаCurlКоманды(ЧастиКоманды, ОтобразитьPOST, ПредопределенныеЗаголовки)
+ Если ТипТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора[1].Значение Тогда // multipart/form-data
+ ЗаполнитьДанныеФормыCurlКоманды(ЧастиКоманды, ОтобразитьPOST);
+ ИначеЕсли ТипТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора[2].Значение Тогда // application/x-www-form-urlencoded
+ ЗаполнитьДанныеHTMLФормыCurlКоманды(ЧастиКоманды, ОтобразитьPOST);
+ ИначеЕсли ТипТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора[3].Значение Тогда // Текст
+ ЗаполнитьТекстовыеДанныеCurlКоманды(ЧастиКоманды, ОтобразитьPOST);
+ ИначеЕсли ТипТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора[4].Значение Тогда // Файл
+ ЗаполнитьДанныеФайлаCurlКоманды(ЧастиКоманды, ОтобразитьPOST, ПредопределенныеЗаголовки);
Иначе
- ВызватьИсключение СтрШаблон("Схема запроса %1 не поддерживается", Схема);
- КонецЕсли;
-
- ПредыдущаяЧасть = Построитель[Построитель.ВГраница() - 1];
- Если НЕ СтрНачинаетсяС(ПредыдущаяЧасть, " .") Тогда
- Построитель[Построитель.ВГраница() - 1] = ПредыдущаяЧасть + СокрЛП(Построитель[Построитель.ВГраница()]);
- Построитель.Удалить(Построитель.ВГраница());
+ ОтобразитьPOST = Истина;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
-Процедура ДобавитьВКодЗапросаИнициализациюПолейФормы(Построитель, ТекстПолейФормы, ФайлыПолейФормы)
- Смещение = 0;
- Для Каждого ФайлПоляФормы Из ФайлыПолейФормы Цикл
- Построитель.Вставить(
- 1 + Смещение,
- СтрШаблон("%1 = Новый Файл(""%2"");", ФайлПоляФормы.ИмяПеременной, ФайлПоляФормы.Путь)
- );
-
- Смещение = Смещение + 1;
- КонецЦикла;
- Если Смещение > 0 Тогда
- Построитель.Вставить(1 + Смещение, "");
+Процедура ЗаполнитьФайлОтветаCurlКоманды(ЧастиКоманды)
+ Если НЕ (ТелоОтветаВФайл И ЗначениеЗаполнено(ИмяФайлаТелаОтвета)) Тогда
+ Возврат;
КонецЕсли;
- Смещение = 0;
- Для Каждого ТекстПоляФормы Из ТекстПолейФормы Цикл
- Построитель.Вставить(
- 1 + Смещение,
- ИнициализацияТекстовойПеременной(ТекстПоляФормы.ИмяПеременной, ТекстПоляФормы.ЗначениеПеременной)
- );
-
- Смещение = Смещение + 1;
- КонецЦикла;
- Если Смещение > 0 Тогда
- Построитель.Вставить(1 + Смещение, "");
- КонецЕсли;
+ ЧастиКоманды.Добавить("-o");
+ ЧастиКоманды.Добавить(СтрШаблон("""%1""", ИмяФайлаТелаОтвета));
КонецПроцедуры
&НаКлиенте
-Процедура ДобавитьВКодЗапросаИнициализациюКонфигурации(Построитель, Знач ЕстьПараметрыЗапроса, Знач ЕстьДополнительныеПараметры, Знач ТребуетсяИмяФайлаТелаОтвета, Знач ЕстьТекстТелаЗапроса, Знач ЕстьПоляФормы)
- Если ЕстьПоляФормы Тогда
- Построитель.Вставить(1, "ПоляФормы = КлиентHTTPКлиентСервер.НовыеПоляФормы();");
+Процедура ЗаполнитьТаймаутCurlКоманды(ЧастиКоманды)
+ Если Таймаут = 0 Тогда
+ Возврат;
КонецЕсли;
- Если ЕстьТекстТелаЗапроса Тогда
- Построитель.Вставить(1, ИнициализацияТекстовойПеременной("ТелоЗапросаТекст", ТелоЗапросаТекст));
+ ЧастиКоманды.Добавить("--connect-timeout");
+ ЧастиКоманды.Добавить(XMLСтрока(Таймаут));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьПроксиCurlКоманды(ЧастиКоманды)
+ Если НЕ (ИспользоватьПрокси И ЗначениеЗаполнено(СерверПрокси)) Тогда
+ Возврат;
КонецЕсли;
- Если ЕстьДополнительныеПараметры Тогда
- Построитель.Вставить(1, "ДополнительныеПараметры = КлиентHTTPКлиентСервер.НовыеДополнительныеПараметры();");
- КонецЕсли;
+ ЧастиПрокси = Новый Массив;
- Если ЕстьПараметрыЗапроса Тогда
- Построитель.Вставить(1, "ПараметрыЗапроса = КлиентHTTPКлиентСервер.НовыеПараметрыЗапроса();");
+ Если ЗначениеЗаполнено(ПользовательПрокси) Тогда
+ ЧастиПрокси.Добавить(ПользовательПрокси);
+ ЧастиПрокси.Добавить(ОтображениеСекрета(ПарольПрокси, Элементы.ПарольПрокси));
+
+ ЧастиКоманды.Добавить(?(ИспользоватьАутентификациюОСПрокси, "--proxy-ntlm", "--proxy-basic"));
+ ЧастиКоманды.Добавить("--proxy-user");
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", СтрЗаменить(СтрСоединить(ЧастиПрокси, ":"), "'", "'\''")));
КонецЕсли;
- Если ТребуетсяИмяФайлаТелаОтвета Тогда
- Построитель.Вставить(1, "ИмяФайлаТелаОтвета = ПолучитьИмяВременногоФайла(""dat"");");
+ ЧастиПрокси.Очистить();
+ ЧастиПрокси.Добавить(ПротоколПрокси);
+ ЧастиПрокси.Добавить("://");
+ ЧастиПрокси.Добавить(СерверПрокси);
+
+ Если ЗначениеЗаполнено(ПортПрокси) Тогда
+ ЧастиПрокси.Добавить(":");
+ ЧастиПрокси.Добавить(ПортПрокси);
КонецЕсли;
- Построитель.Вставить(
- 1 + ТребуетсяИмяФайлаТелаОтвета + ЕстьПараметрыЗапроса + ЕстьДополнительныеПараметры + ЕстьПоляФормы + ЕстьТекстТелаЗапроса,
- ""
- );
+ ЧастиКоманды.Добавить("-x");
+ ЧастиКоманды.Добавить(СтрСоединить(ЧастиПрокси, ""));
КонецПроцедуры
&НаКлиенте
-Функция КодЗапросаКонсоли()
- ЧастиКода = Новый Массив;
- ЧастиСтрокиКода = Новый Массив;
-
- ЕстьДополнительныеПараметры = Ложь;
- ЕстьПараметрыЗапроса = Ложь;
- ЕстьПоляФормы = Ложь;
- ЕстьТекстТелаЗапроса = Ложь;
- ТребуетсяИмяФайлаТелаОтвета = Ложь;
- ТекстПолейФормы = Новый Массив;
- ФайлыПолейФормы = Новый Массив;
+Процедура ЗаполнитьСессиюCurlКоманды(ЧастиКоманды, ЧастиСложнойОпции)
+ Если НЕ ИспользоватьСессию Тогда
+ Возврат;
+ КонецЕсли;
- ДобавитьВКодЗапросаИдентификаторРесурса(ЧастиКода);
+ Если ЗначениеЗаполнено(ПорогПеренаправлений) Тогда
+ ЧастиКоманды.Добавить("--max-redirs");
+ ЧастиКоманды.Добавить(ПорогПеренаправлений);
+ КонецЕсли;
- // Начало текучего интерфейса
- ЧастиКода.Добавить("Ответ = КлиентHTTPКлиентСервер");
+ ЧастиСложнойОпции.Добавить("L");
- ДобавитьВКодЗапросаИспользованиеПрокси(ЧастиКода, ЕстьДополнительныеПараметры);
- ДобавитьВКодЗапросаИспользованиеСессии(ЧастиКода, ЕстьДополнительныеПараметры);
- ДобавитьВКодЗапросаПараметры(ЧастиКода, ЕстьПараметрыЗапроса);
- ДобавитьВКодЗапросаЗаголовки(ЧастиКода, ЕстьДополнительныеПараметры);
- ДобавитьВКодЗапросаСжатиеОтвета(ЧастиКода, ЕстьДополнительныеПараметры);
- ДобавитьВКодЗапросаАвторизацию(ЧастиКода, ЕстьДополнительныеПараметры);
- ДобавитьВКодЗапросаФайлТелаОтвета(ЧастиКода, ЕстьДополнительныеПараметры, ТребуетсяИмяФайлаТелаОтвета);
- ДобавитьВКодЗапросаМетод(ЧастиКода, ЕстьТекстТелаЗапроса, ЕстьПоляФормы, ТекстПолейФормы, ФайлыПолейФормы, ЕстьПараметрыЗапроса, ЕстьДополнительныеПараметры);
- ДобавитьВКодЗапросаИнициализациюПолейФормы(ЧастиКода, ТекстПолейФормы, ФайлыПолейФормы);
- ДобавитьВКодЗапросаИнициализациюКонфигурации(ЧастиКода, ЕстьПараметрыЗапроса, ЕстьДополнительныеПараметры, ТребуетсяИмяФайлаТелаОтвета, ЕстьТекстТелаЗапроса, ЕстьПоляФормы);
+ Если ПоддержкаCookie Тогда
+ ЗначениеCookie = КлиентHTTPКлиентСервер.ЗначениеЗаголовкаCookieРесурса(ИдентификаторРесурса, Дополнительно);
+ Если ЗначениеЗаполнено(ЗначениеCookie) Тогда
+ ЧастиКоманды.Добавить("-b");
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", ЭкранированиеАпострофаUnix(ЗначениеCookie)));
+ КонецЕсли;
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьСжатиеCurlКоманды(ЧастиКоманды)
+ Если ПоддержкаСжатогоОтвета Тогда
+ ЧастиКоманды.Добавить("--compressed");
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьЗаголовкиCurlКоманды(ЧастиКоманды, Знач ПредопределенныеЗаголовки)
+ Для Каждого Стр Из ПредопределенныеЗаголовки Цикл
+ ЧастиКоманды.Добавить("-H");
+ ЧастиКоманды.Добавить(
+ СтрШаблон("'%1: %2'", ЭкранированиеАпострофаUnix(Стр.Ключ), ЭкранированиеАпострофаUnix(Стр.Значение))
+ );
+ КонецЦикла;
- Возврат СтрСоединить(ЧастиКода, Символы.ПС);
-КонецФункции
+ Для Каждого Стр Из ЗаголовкиЗапроса Цикл
+ Если НЕ Стр.Активно Тогда
+ Продолжить;
+ КонецЕсли;
+
+ ЧастиКоманды.Добавить("-H");
+ ЧастиКоманды.Добавить(
+ СтрШаблон("'%1: %2'", ЭкранированиеАпострофаUnix(Стр.Ключ), ЭкранированиеАпострофаUnix(Стр.Значение))
+ );
+ КонецЦикла;
+КонецПроцедуры
&НаКлиенте
-Функция ИнициализацияТекстовойПеременной(Знач ИмяПеременной, Знач ЗначениеПеременной)
- Возврат СтрШаблон(
- "%1 = %2""%3"";",
- ИмяПеременной,
- ?(
- СтрНайти(ЗначениеПеременной, Символы.ПС) > 0,
- "
- | ",
- ""
- ),
- СтрЗаменить(КавычкиВТексте1С(ЗначениеПеременной), Символы.ПС, Символы.ПС + " |")
- );
-КонецФункции
+Процедура ЗаполнитьСхемуЗапросаCurlКоманды(ЧастиКоманды, ЧастиСложнойОпции, Знач ОтобразитьPOST)
+ СхемаСписокВыбора = Элементы.Схема.СписокВыбора;
+ Если Схема = СхемаСписокВыбора[0].Значение И НЕ ОтобразитьPOST Тогда // GET
+ ЧастиКоманды.Добавить(СтрШаблон("-X %1", Схема));
+ ИначеЕсли Схема = СхемаСписокВыбора[1].Значение И ОтобразитьPOST Тогда // POST
+ ЧастиКоманды.Добавить(СтрШаблон("-X %1", Схема));
+ ИначеЕсли Схема = СхемаСписокВыбора[4].Значение Тогда // HEAD
+ ЧастиСложнойОпции.Добавить("I");
+ ИначеЕсли Схема = СхемаСписокВыбора[2].Значение // PUT
+ ИЛИ Схема = СхемаСписокВыбора[3].Значение // DELETE
+ ИЛИ Схема = СхемаСписокВыбора[5].Значение // PATCH
+ Тогда
+ ЧастиКоманды.Добавить(СтрШаблон("-X %1", Схема));
+ КонецЕсли;
+КонецПроцедуры
&НаКлиенте
-Функция КавычкиВТексте1С(Знач Текст)
- Возврат СтрЗаменить(Текст, """", """""");
+Процедура ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, Знач РазделКоманды)
+ Для Каждого Часть Из РазделКоманды Цикл
+ ЧастиКоманды.Добавить(Часть);
+ КонецЦикла;
+КонецПроцедуры
+
+&НаКлиенте
+Функция КомандаCurlЗапросаКонсоли()
+ ЧастиСложнойОпции = Новый Массив;
+ ПредопределенныеЗаголовки = Новый Массив;
+ ОтобразитьPOST = Ложь;
+
+ РазделыКоманды = Новый Структура(
+ "ПовторноеВыполнение, Аутентификация, КлиентскийСертификат, Тело, Таймаут, СохранениеОтветаВФайл, Прокси, Сессия, Сжатие, Заголовки, Схема"
+ );
+ Для Каждого КЗ Из РазделыКоманды Цикл
+ РазделыКоманды[КЗ.Ключ] = Новый Массив;
+ КонецЦикла;
+
+ ЗаполнитьПовторноеВыполнениеCurlКоманды(РазделыКоманды.ПовторноеВыполнение);
+ ЗаполнитьАутентификациюCurlКоманды(РазделыКоманды.Аутентификация);
+ ЗаполнитьКлиентскийСертификатCurlКоманды(РазделыКоманды.КлиентскийСертификат);
+ ЗаполнитьТелоЗапросаCurlКоманды(РазделыКоманды.Тело, ОтобразитьPOST, ПредопределенныеЗаголовки);
+ ЗаполнитьФайлОтветаCurlКоманды(РазделыКоманды.СохранениеОтветаВФайл);
+ ЗаполнитьТаймаутCurlКоманды(РазделыКоманды.Таймаут);
+ ЗаполнитьПроксиCurlКоманды(РазделыКоманды.Прокси);
+ ЗаполнитьСессиюCurlКоманды(РазделыКоманды.Сессия, ЧастиСложнойОпции);
+ ЗаполнитьСжатиеCurlКоманды(РазделыКоманды.Сжатие);
+ ЗаполнитьЗаголовкиCurlКоманды(РазделыКоманды.Заголовки, ПредопределенныеЗаголовки);
+ ЗаполнитьСхемуЗапросаCurlКоманды(РазделыКоманды.Схема, ЧастиСложнойОпции, ОтобразитьPOST);
+
+ ЧастиКоманды = Новый Массив;
+ ЧастиКоманды.Добавить("curl");
+
+ Если ЧастиСложнойОпции.Количество() > 0 Тогда
+ ЧастиСложнойОпции.Вставить(0, "-");
+ ЧастиКоманды.Добавить(СтрСоединить(ЧастиСложнойОпции, ""));
+ КонецЕсли;
+
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Схема);
+
+ ЧастиКоманды.Добавить(КодированныйURIВURL(ИдентификаторРесурса));
+
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Аутентификация);
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.КлиентскийСертификат);
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Заголовки);
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Тело);
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Прокси);
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Таймаут);
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.СохранениеОтветаВФайл);
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Сжатие);
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Сессия);
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.ПовторноеВыполнение);
+
+ Возврат СтрСоединить(ЧастиКоманды, " ");
КонецФункции
+#КонецОбласти
+#Область ИмпортPostman
&НаКлиенте
Процедура ПрочитатьФайлИмпорта(Знач ИмяФайлаИмпорта, Отказ, ОписаниеОшибки)
ФайлИмпорта = Новый Файл(ИмяФайлаИмпорта);
@@ -2294,48 +3455,60 @@
&НаКлиенте
Функция ИдентификаторРесурсаИмпортаPostman(Знач Запрос, Знач ЗначенияШаблонов)
- ИдентификаторРесурсаИмпорт = ЗначениеПеременнойИмпортаPostman(Запрос["url"]["raw"], ЗначенияШаблонов);
+ ИдентификаторРесурсаИмпорт = ?(
+ Запрос["url"] = Неопределено,
+ "",
+ ЗначениеПеременнойИмпортаPostman(Запрос["url"]["raw"], ЗначенияШаблонов)
+ );
Возврат ?(ПустаяСтрока(ИдентификаторРесурсаИмпорт), "http://", ИдентификаторРесурсаИмпорт);
КонецФункции
&НаКлиенте
-Функция АвторизацияИмпортаPostman(Знач Запрос, Знач ЗначенияШаблонов)
- Перем НайденныйТипАвторизации;
+Функция АутентификацияИмпортаPostman(Знач Запрос, Знач ЗначенияШаблонов)
+ Перем НайденныйТипАутентификации;
- фРезультат = Новый Структура("Тип, Пользователь, Пароль, Токен", Элементы.ТипАвторизации.СписокВыбора[0], "", "", "");
+ ТипАутентификацииСписокВыбора = Элементы.ТипАутентификации.СписокВыбора;
+
+ фРезультат = Новый Структура(
+ "Тип, Пользователь, Пароль, Токен, РегионAWS, СервисAWS, ДополнениеHawk, ИдентификаторПриложенияHawk, ДелегированиеHawk",
+ ТипАутентификацииСписокВыбора[0], "", "", "", "", "", "", "", ""
+ );
- ОбъектАвторизации = Запрос["auth"];
- Если ОбъектАвторизации = Неопределено Тогда
+ ОбъектАутентификации = Запрос["auth"];
+ Если ОбъектАутентификации = Неопределено Тогда
Возврат фРезультат;
КонецЕсли;
- ТипАвторизацииИмпорт = ВРег(ОбъектАвторизации["type"]);
- Для Каждого ЭлементТиповАвторизации Из Элементы.ТипАвторизации.СписокВыбора Цикл
- Если ВРег(ЭлементТиповАвторизации.Значение) = ТипАвторизацииИмпорт Тогда
- НайденныйТипАвторизации = ЭлементТиповАвторизации;
+ ТипАутентификацииИмпорт = ВРег(ОбъектАутентификации["type"]);
+ Для Каждого ЭлементТиповАутентификации Из ТипАутентификацииСписокВыбора Цикл
+ Если ВРег(ЭлементТиповАутентификации.Значение) = ТипАутентификацииИмпорт Тогда
+ НайденныйТипАутентификации = ЭлементТиповАутентификации;
Прервать;
КонецЕсли;
КонецЦикла;
+ Если НайденныйТипАутентификации = Неопределено И ТипАутентификацииИмпорт = "AWSV4" Тогда
+ НайденныйТипАутентификации = ТипАутентификацииСписокВыбора[5]; // AWS4-HMAC-SHA256
+ КонецЕсли;
- Если НайденныйТипАвторизации = Неопределено Тогда
+ Если НайденныйТипАутентификации = Неопределено Тогда
Возврат фРезультат;
КонецЕсли;
- фРезультат.Тип = НайденныйТипАвторизации;
+ фРезультат.Тип = НайденныйТипАутентификации;
- Имена = СтрРазделить("Пароль,Пользователь,Токен", ",");
- ИменаИмпорт = СтрРазделить("password,username,token", ",");
- ПараметрыАвторизации = Новый Соответствие;
+ Имена = СтрРазделить("Пароль,Пользователь,Токен,Пользователь,Пароль,РегионAWS,СервисAWS,Пользователь,Пароль,ДополнениеHawk,ИдентификаторПриложенияHawk,ДелегированиеHawk", ",");
+ ИменаИмпорт = СтрРазделить("password,username,token,accesskey,secretkey,region,service,authid,authkey,extradata,app,delegation", ",");
+ ПараметрыАутентификации = Новый Соответствие;
Для я = 0 По Имена.ВГраница() Цикл
- ПараметрыАвторизации.Вставить(ИменаИмпорт[я], Имена[я]);
+ ПараметрыАутентификации.Вставить(ИменаИмпорт[я], Имена[я]);
КонецЦикла;
- ПараметрыАвторизацииИмпорт = ОбъектАвторизации[ОбъектАвторизации["type"]];
- Для Каждого ПараметрАвторизацииИмпорт Из ПараметрыАвторизацииИмпорт Цикл
- ИмяПараметраАвторизации = ПараметрыАвторизации.Получить(НРег(ПараметрАвторизацииИмпорт["key"]));
- Если ИмяПараметраАвторизации <> Неопределено Тогда
- фРезультат[ИмяПараметраАвторизации] = ЗначениеПеременнойИмпортаPostman(ПараметрАвторизацииИмпорт["value"], ЗначенияШаблонов);
+ ПараметрыАутентификацииИмпорт = ОбъектАутентификации[ОбъектАутентификации["type"]];
+ Для Каждого ПараметрАутентификацииИмпорт Из ПараметрыАутентификацииИмпорт Цикл
+ ИмяПараметраАутентификации = ПараметрыАутентификации.Получить(НРег(ПараметрАутентификацииИмпорт["key"]));
+ Если ИмяПараметраАутентификации <> Неопределено Тогда
+ фРезультат[ИмяПараметраАутентификации] = ЗначениеПеременнойИмпортаPostman(ПараметрАутентификацииИмпорт["value"], ЗначенияШаблонов);
КонецЕсли;
КонецЦикла;
@@ -2349,7 +3522,7 @@
Для Каждого ЭлементЗаголовок Из Запрос["header"] Цикл
фРезультат.Добавить(Новый Структура(
"Активно, Ключ, Значение",
- Истина,
+ ЭлементЗаголовок["disabled"] <> Истина,
ЗначениеПеременнойИмпортаPostman(ЭлементЗаголовок["key"], ЗначенияШаблонов),
ЗначениеПеременнойИмпортаPostman(ЭлементЗаголовок["value"], ЗначенияШаблонов)
));
@@ -2433,17 +3606,35 @@
Возврат;
КонецЕсли;
- АвторизацияИмпорт = АвторизацияИмпортаPostman(Запрос, ЗначенияШаблонов);
+ АутентификацияИмпорт = АутентификацияИмпортаPostman(Запрос, ЗначенияШаблонов);
ТелоЗапросаИмпорт = ТелоЗапросаИмпортаPostman(Запрос, ЗначенияШаблонов);
Схема = СхемаИмпорт;
ИдентификаторРесурса = ИдентификаторРесурсаИмпортаPostman(Запрос, ЗначенияШаблонов);
- ТипАвторизации = АвторизацияИмпорт.Тип;
- Если ТипАвторизации <> Элементы.ТипАвторизации.СписокВыбора[0] Тогда
- ПользовательАвторизации = АвторизацияИмпорт.Пользователь;
- ПарольАвторизации = АвторизацияИмпорт.Пароль;
- ТокенАвторизации = АвторизацияИмпорт.Токен;
+ ТипАутентификации = АутентификацияИмпорт.Тип.Значение;
+ Если ТипАутентификации <> Элементы.ТипАутентификации.СписокВыбора[0].Значение Тогда
+ СписокТиповАутентификации = Элементы.ТипАутентификации.СписокВыбора;
+ Если ТипАутентификации = СписокТиповАутентификации[1].Значение // Basic
+ ИЛИ ТипАутентификации = СписокТиповАутентификации[2].Значение // NTLM
+ ИЛИ ТипАутентификации = СписокТиповАутентификации[3].Значение // Digest
+ Тогда
+ ПользовательАутентификации = АутентификацияИмпорт.Пользователь;
+ ПарольАутентификации = АутентификацияИмпорт.Пароль;
+ ИначеЕсли ТипАутентификации = СписокТиповАутентификации[4].Значение Тогда // Bearer
+ ТокенАутентификации = АутентификацияИмпорт.Токен;
+ ИначеЕсли ТипАутентификации = СписокТиповАутентификации[5].Значение Тогда // AWS4-HMAC-SHA256
+ AWSКлючДоступа = АутентификацияИмпорт.Пользователь;
+ AWSСекретныйКлюч = АутентификацияИмпорт.Пароль;
+ AWSРегион = АутентификацияИмпорт.РегионAWS;
+ AWSСервис = АутентификацияИмпорт.СервисAWS;
+ ИначеЕсли ТипАутентификации = СписокТиповАутентификации[6].Значение Тогда // Hawk
+ HawkИдентификатор = АутентификацияИмпорт.Пользователь;
+ HawkКлюч = АутентификацияИмпорт.Пароль;
+ HawkДополнение = АутентификацияИмпорт.ДополнениеHawk;
+ HawkИдентификаторПриложения = АутентификацияИмпорт.ИдентификаторПриложенияHawk;
+ HawkДелегирование = АутентификацияИмпорт.ДелегированиеHawk;
+ КонецЕсли;
КонецЕсли;
ЗаголовкиЗапроса.Очистить();
@@ -2469,7 +3660,7 @@
КонецЕсли;
ИдентификаторРесурсаПриИзменении(Неопределено);
- ТипАвторизацииПриИзменении(Неопределено);
+ ТипАутентификацииПриИзменении(Неопределено);
ТипТелаЗапросаПриИзменении(Неопределено);
РазделыКонсоли = Элементы.РазделыКонсоли.СписокВыбора[0];
@@ -2499,7 +3690,9 @@
Возврат фРезультат;
КонецФункции
+#КонецОбласти
+#Область ИмпортКомандыCurl
&НаКлиенте
Функция ОпцииКомандыCurl()
фРезультат = Новый Соответствие;
@@ -2531,6 +3724,9 @@
фРезультат.Вставить("--ntlm", Ложь);
фРезультат.Вставить("--ntlm-wb", Ложь);
фРезультат.Вставить("--oauth2-bearer", Истина);
+ фРезультат.Вставить("--aws-sigv4", Истина);
+ фРезультат.Вставить("--retry", Истина);
+ фРезультат.Вставить("--retry-delay", Истина);
фРезультат.Вставить("--compressed", Ложь);
фРезультат.Вставить("--compressed-ssh", Ложь);
фРезультат.Вставить("--tr-encoding", Ложь);
@@ -2546,6 +3742,11 @@
фРезультат.Вставить("-x", Истина);
фРезультат.Вставить("--proxy", Истина);
фРезультат.Вставить("--proxy-basic", Ложь);
+ фРезультат.Вставить("--connect-timeout", Истина);
+ фРезультат.Вставить("-E", Истина);
+ фРезультат.Вставить("--cert", Истина);
+ фРезультат.Вставить("--cert-type", Истина);
+ фРезультат.Вставить("--cacert", Истина);
Возврат фРезультат;
КонецФункции
@@ -2568,12 +3769,7 @@
Текст = Лев(Текст, СтрДлина(Текст) - 1);
КонецЕсли;
- Возврат Текст;
-КонецФункции
-
-&НаСервереБезКонтекста
-Функция КодированныйТекстВURL(Знач Текст)
- Возврат КодироватьСтроку(Текст, СпособКодированияСтроки.КодировкаURL);
+ Возврат СтрЗаменить(Текст, СтрШаблон("%1\%1%1", ОткрывающийСимвол), ОткрывающийСимвол);
КонецФункции
&НаКлиенте
@@ -2650,9 +3846,9 @@
Возврат;
КонецЕсли;
- ЧастиКоманды.ИдентификаторРесурса = ТекстБезКавычек(СтрСоединить(ЧастиТокена), ОткрывающийСимвол);
+ ЧастиКоманды.ИдентификаторРесурса = ТекстБезКавычек(СокрЛ(СтрСоединить(ЧастиТокена)), ОткрывающийСимвол);
Иначе
- Опция.Значение = ТекстБезКавычек(СтрСоединить(ЧастиТокена), ОткрывающийСимвол);
+ Опция.Значение = ТекстБезКавычек(СокрЛ(СтрСоединить(ЧастиТокена)), ОткрывающийСимвол);
ЧастиКоманды.Опции.Добавить(Опция);
Опция = Неопределено;
КонецЕсли;
@@ -2706,14 +3902,17 @@
&НаКлиенте
Функция НовыйОбъектДанныхCurl()
Возврат Новый Структура(
- "Схема, ТолькоЗаголовки, Заголовки, ПоляФормы, ПоляHTMLФормы, ПоляКакПараметры, Авторизация, ИспользоватьРедиректы, КоличествоРедиректов, ПоддержкаСжатогоОтвета, ИмяФайлаТелаОтвета, НормализоватьИдентификаторРесурса, Прокси, BasicАвторизацияПрокси",
+ "Схема, ТолькоЗаголовки, Заголовки, ПоляФормы, ПоляHTMLФормы, ПоляКакПараметры, ПовторноеВыполнение, КлиентскийСертификат, Аутентификация, Таймаут, ИспользоватьРедиректы, КоличествоРедиректов, ПоддержкаСжатогоОтвета, ИмяФайлаТелаОтвета, НормализоватьИдентификаторРесурса, Прокси, BasicАутентификацияПрокси",
Неопределено,
Ложь,
Новый Массив,
Новый Массив,
Новый Массив,
Ложь,
- Новый Структура("Тип, Пользователь, Пароль, Токен", Элементы.ТипАвторизации.СписокВыбора[0], "", "", ""),
+ Новый Структура("Применить, Способ, НачальнаяДлительность, КоэфициентУвеличения, ПорогКоличестваПопыток, МаксимальнаяДлительность", Ложь, Элементы.СпособПовторногоВыполнения.СписокВыбора[0], -1, -1, -1, -1),
+ Новый Структура("Сертификат, Пароль, Тип, СертификатыУЦ", "", "", "", ""),
+ Новый Структура("Тип, Пользователь, Пароль, Токен, РегионAWS, СервисAWS", Элементы.ТипАутентификации.СписокВыбора[0], "", "", "", "", ""),
+ 0,
Ложь,
Неопределено,
Ложь,
@@ -2906,19 +4105,71 @@
КонецПроцедуры
&НаКлиенте
-Процедура ОбработатьДанныеАвторизацииCurl(ДанныеИмпорта, Знач Опция)
+Процедура ОбработатьДанныеАутентификацииCurl(ДанныеИмпорта, Знач Опция)
ЗначениеОпции = Опция.Значение;
Если НЕ ЗначениеЗаполнено(ЗначениеОпции) Тогда
Возврат;
КонецЕсли;
- ЧастиПоля = СтрРазделить(ЗначениеОпции, ":");
- Пользователь = ЧастиПоля[0];
+ ЧастиЗначения = СтрРазделить(ЗначениеОпции, ":");
+ Пользователь = ЧастиЗначения[0];
- ЧастиПоля.Удалить(0);
+ ЧастиЗначения.Удалить(0);
+
+ ДанныеИмпорта.Аутентификация.Пользователь = Пользователь;
+ ДанныеИмпорта.Аутентификация.Пароль = СтрСоединить(ЧастиЗначения, ":");
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ОбработатьДанныеАутентификацииAWSCurl(ДанныеИмпорта, Знач Опция)
+ ЗначениеОпции = Опция.Значение;
+ Если НЕ ЗначениеЗаполнено(ЗначениеОпции) Тогда
+ Возврат;
+ КонецЕсли;
+
+ ЧастиЗначения = СтрРазделить(ЗначениеОпции, ":");
+ Если ЧастиЗначения.Количество() < 2 ИЛИ ЧастиЗначения[0] <> "aws" ИЛИ ЧастиЗначения[1] <> "amz" Тогда
+ Возврат;
+ КонецЕсли;
+
+ ДанныеИмпорта.Аутентификация.Тип = Элементы.ТипАутентификации.СписокВыбора[5];
+
+ Если ЧастиЗначения.Количество() > 2 Тогда
+ ДанныеИмпорта.Аутентификация.РегионAWS = ЧастиЗначения[2];
+ КонецЕсли;
+ Если ЧастиЗначения.Количество() > 3 Тогда
+ ДанныеИмпорта.Аутентификация.СервисAWS = ЧастиЗначения[3];
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ОбработатьПовторноеВыполнениеCurl(ДанныеИмпорта, Знач Опция)
+ ОписаниеТипаЧисло = Новый ОписаниеТипов("Число");
+ ПорогКоличестваПопыток = ОписаниеТипаЧисло.ПривестиЗначение(Опция.Значение);
- ДанныеИмпорта.Авторизация.Пользователь = Пользователь;
- ДанныеИмпорта.Авторизация.Пароль = СтрСоединить(ЧастиПоля, ":");
+ ПВ = ДанныеИмпорта.ПовторноеВыполнение;
+ ПВ.ПорогКоличестваПопыток = ПорогКоличестваПопыток;
+ ПВ.Применить = ПорогКоличестваПопыток > 0;
+
+ Если ПВ.Способ <> Элементы.СпособПовторногоВыполнения.СписокВыбора[0] Тогда // Разово
+ Возврат;
+ КонецЕсли;
+
+ ПВ.Способ = Элементы.СпособПовторногоВыполнения.СписокВыбора[3]; // Экспоненциально
+ ПВ.НачальнаяДлительность = 1;
+ ПВ.КоэфициентУвеличения = 2;
+ ПВ.МаксимальнаяДлительность = Мин(КлиентHTTPПовтИсп.МаксимальноДопустимаяДлительностьПаузы(), Pow(2, ПорогКоличестваПопыток));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ОбработатьЗадержкуПовторногоВыполненияCurl(ДанныеИмпорта, Знач Опция)
+ ОписаниеТипаЧисло = Новый ОписаниеТипов("Число");
+ НачальнаяДлительность = ОписаниеТипаЧисло.ПривестиЗначение(Опция.Значение);
+
+ ПВ = ДанныеИмпорта.ПовторноеВыполнение;
+ ПВ.Способ = Элементы.СпособПовторногоВыполнения.СписокВыбора[1]; // Фиксировано
+ ПВ.НачальнаяДлительность = НачальнаяДлительность;
+ ПВ.МаксимальнаяДлительность = Макс(600, НачальнаяДлительность);
КонецПроцедуры
&НаКлиенте
@@ -2944,15 +4195,18 @@
ПозицияРазделителя = ПозицияОкончанияАутентификации;
КонецЕсли;
- ЗакодированныеДанные = Новый Структура("Пользователь, Пароль");
- ЗакодированныеДанные.Пользователь = СокрЛП(Лев(ЗначениеОпции, ПозицияРазделителя - 1));
- ЗакодированныеДанные.Пароль = Прав(
+ ЗакодированныйПользователь = СокрЛП(Лев(ЗначениеОпции, ПозицияРазделителя - 1));
+ ЗакодированныйПароль = Прав(
Лев(ЗначениеОпции, ПозицияОкончанияАутентификации - 1),
ПозицияОкончанияАутентификации - ПозицияРазделителя - 1
);
- РаскодированныеДанные = РаскодированныеСтроки(ЗакодированныеДанные);
- Прокси.Пользователь = РаскодированныеДанные.Пользователь;
- Прокси.Пароль = РаскодированныеДанные.Пароль;
+ МножествоСтрок = Новый Соответствие;
+ МножествоСтрок.Вставить(ЗакодированныйПользователь);
+ МножествоСтрок.Вставить(ЗакодированныйПароль);
+
+ МножествоСтрок = РаскодированныеСтрокиURLвURL(МножествоСтрок);
+ Прокси.Пользователь = МножествоСтрок.Получить(ЗакодированныйПользователь);
+ Прокси.Пароль = МножествоСтрок.Получить(ЗакодированныйПароль);
КонецЕсли;
ПозицияОкончанияАутентификации = ПозицияОкончанияАутентификации + 1;
@@ -2976,6 +4230,22 @@
КонецЕсли;
КонецПроцедуры
+&НаКлиенте
+Процедура ОбработатьКлиентскийСертификат(ДанныеИмпорта, Знач Опция)
+ ЗначениеОпции = Опция.Значение;
+ Если НЕ ЗначениеЗаполнено(ЗначениеОпции) Тогда
+ Возврат;
+ КонецЕсли;
+
+ ЧастиЗначения = СтрРазделить(ЗначениеОпции, ":");
+ Сертификат = ЧастиЗначения[0];
+
+ ЧастиЗначения.Удалить(0);
+
+ ДанныеИмпорта.КлиентскийСертификат.Сертификат = Сертификат;
+ ДанныеИмпорта.КлиентскийСертификат.Пароль = СтрСоединить(ЧастиЗначения, ":");
+КонецПроцедуры
+
&НаКлиенте
Процедура ОбработатьОпциюCurl(ДанныеИмпорта, Знач ИдентификаторРесурсаИмпорт, Знач Опция, Отказ, ОписаниеОшибки)
ИмяОпции = Опция.Имя;
@@ -2996,20 +4266,29 @@
ИначеЕсли ИмяОпции = "-H" ИЛИ ИмяОпции = "--header" Тогда
ОбработатьЗаголовокCurl(ДанныеИмпорта, Опция);
ИначеЕсли ИмяОпции = "-u" ИЛИ ИмяОпции = "--user" Тогда
- ОбработатьДанныеАвторизацииCurl(ДанныеИмпорта, Опция);
+ ОбработатьДанныеАутентификацииCurl(ДанныеИмпорта, Опция);
ИначеЕсли ИмяОпции = "--basic" Тогда
- ДанныеИмпорта.Авторизация.Тип = Элементы.ТипАвторизации.СписокВыбора[1];
+ ДанныеИмпорта.Аутентификация.Тип = Элементы.ТипАутентификации.СписокВыбора[1];
ИначеЕсли ИмяОпции = "--digest" Тогда
- ДанныеИмпорта.Авторизация.Тип = Элементы.ТипАвторизации.СписокВыбора[3];
+ ДанныеИмпорта.Аутентификация.Тип = Элементы.ТипАутентификации.СписокВыбора[3];
ИначеЕсли ИмяОпции = "--ntlm" ИЛИ ИмяОпции = "--ntlm-wb" Тогда
- ДанныеИмпорта.Авторизация.Тип = Элементы.ТипАвторизации.СписокВыбора[2];
+ ДанныеИмпорта.Аутентификация.Тип = Элементы.ТипАутентификации.СписокВыбора[2];
ИначеЕсли ИмяОпции = "--oauth2-bearer" Тогда
- ДанныеИмпорта.Авторизация.Тип = Элементы.ТипАвторизации.СписокВыбора[4];
- ДанныеИмпорта.Авторизация.Токен = Опция.Значение;
+ ДанныеИмпорта.Аутентификация.Тип = Элементы.ТипАутентификации.СписокВыбора[4];
+ ДанныеИмпорта.Аутентификация.Токен = Опция.Значение;
+ ИначеЕсли ИмяОпции = "--aws-sigv4" Тогда
+ ОбработатьДанныеАутентификацииAWSCurl(ДанныеИмпорта, Опция);
+ ИначеЕсли ИмяОпции = "--retry" Тогда
+ ОбработатьПовторноеВыполнениеCurl(ДанныеИмпорта, Опция);
+ ИначеЕсли ИмяОпции = "--retry-delay" Тогда
+ ОбработатьЗадержкуПовторногоВыполненияCurl(ДанныеИмпорта, Опция);
ИначеЕсли ИмяОпции = "-L" ИЛИ ИмяОпции = "--location" ИЛИ ИмяОпции = "--location-trusted" Тогда
ДанныеИмпорта.ИспользоватьРедиректы = Истина;
ИначеЕсли ИмяОпции = "--max-redirs" Тогда
ДанныеИмпорта.КоличествоРедиректов = Опция.Значение;
+ ИначеЕсли ИмяОпции = "--connect-timeout" Тогда
+ ОписаниеТипаЧисло = Новый ОписаниеТипов("Число");
+ ДанныеИмпорта.Таймаут = ОписаниеТипаЧисло.ПривестиЗначение(Опция.Значение);
ИначеЕсли ИмяОпции = "--compressed" ИЛИ ИмяОпции = "--compressed-ssh" ИЛИ ИмяОпции = "--tr-encoding" Тогда
ДанныеИмпорта.ПоддержкаСжатогоОтвета = Истина;
ИначеЕсли ИмяОпции = "-o" ИЛИ ИмяОпции = "--output" Тогда
@@ -3024,7 +4303,13 @@
ИначеЕсли ИмяОпции = "-x" ИЛИ ИмяОпции = "--proxy" Тогда
ОбработатьДанныеПрокси(ДанныеИмпорта, Опция, Отказ, ОписаниеОшибки);
ИначеЕсли ИмяОпции = "--proxy-basic" Тогда
- ДанныеИмпорта.BasicАвторизацияПрокси = Истина;
+ ДанныеИмпорта.BasicАутентификацияПрокси = Истина;
+ ИначеЕсли ИмяОпции = "-E" ИЛИ ИмяОпции = "--cert" Тогда
+ ОбработатьКлиентскийСертификат(ДанныеИмпорта, Опция);
+ ИначеЕсли ИмяОпции = "--cert-type" Тогда
+ ДанныеИмпорта.КлиентскийСертификат.Тип = Опция.Значение;
+ ИначеЕсли ИмяОпции = "--cacert" Тогда
+ ДанныеИмпорта.КлиентскийСертификат.СертификатыУЦ = Опция.Значение;
ИначеЕсли ИмяОпции = "-:" ИЛИ ИмяОпции = "--next" Тогда
Отказ = Истина;
ОписаниеОшибки = "команда с множественными запросами не допускается";
@@ -3181,17 +4466,62 @@
КонецЕсли;
Если ДанныеИмпорта.Схема = Неопределено Тогда
- ДанныеИмпорта.Схема = Элементы.Схема.СписокВыбора[0].Значение; // GET
+ ДанныеИмпорта.Схема = Элементы.Схема.СписокВыбора[0]; // GET
КонецЕсли;
ИдентификаторРесурса = ЧастиКоманды.ИдентификаторРесурса;
Схема = ДанныеИмпорта.Схема;
- ТипАвторизации = ДанныеИмпорта.Авторизация.Тип;
- Если ТипАвторизации <> Элементы.ТипАвторизации.СписокВыбора[0].Значение Тогда
- ПользовательАвторизации = ДанныеИмпорта.Авторизация.Пользователь;
- ПарольАвторизации = ДанныеИмпорта.Авторизация.Пароль;
- ТокенАвторизации = ДанныеИмпорта.Авторизация.Токен;
+ Если ДанныеИмпорта.ПовторноеВыполнение.Применить Тогда
+ ПВ = ДанныеИмпорта.ПовторноеВыполнение;
+ СпособПовторногоВыполнения = ПВ.Способ;
+ ДлительностьПаузыПовторногоВыполнения = ПВ.НачальнаяДлительность;
+ КоэффициентУвеличенияПаузыПовторногоВыполнения = ?(ПВ.КоэфициентУвеличения < 0, КоэффициентУвеличенияПаузыПовторногоВыполнения, ПВ.КоэфициентУвеличения);
+ ПорогКоличестваПопытокПовторногоВыполнения = ПВ.ПорогКоличестваПопыток;
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения = ПВ.МаксимальнаяДлительность;
+
+ КодыСостоянияОтветаПовторногоВыполнения.Очистить();
+ КодыСостоянияОтветаПовторногоВыполнения.Добавить(КлиентHTTPПовтИсп.КодСостоянияТаймаутНаКлиенте());
+ КодыСостоянияОтветаПовторногоВыполнения.Добавить(КлиентHTTPПовтИсп.КодСостоянияСлишкомМногоЗапросов());
+ Иначе
+ СпособПовторногоВыполнения = Элементы.СпособПовторногоВыполнения.СписокВыбора[0];
+ КонецЕсли;
+
+ ТипАутентификации = ДанныеИмпорта.Аутентификация.Тип;
+ Если ТипАутентификации <> Элементы.ТипАутентификации.СписокВыбора[0].Значение Тогда
+ СписокТиповАутентификации = Элементы.ТипАутентификации.СписокВыбора;
+ Если ТипАутентификации = СписокТиповАутентификации[1].Значение // Basic
+ ИЛИ ТипАутентификации = СписокТиповАутентификации[2].Значение // NTLM
+ ИЛИ ТипАутентификации = СписокТиповАутентификации[3].Значение // Digest
+ Тогда
+ ПользовательАутентификации = ДанныеИмпорта.Аутентификация.Пользователь;
+ ПарольАутентификации = ДанныеИмпорта.Аутентификация.Пароль;
+ ИначеЕсли ТипАутентификации = СписокТиповАутентификации[4].Значение Тогда // Bearer
+ ТокенАутентификации = ДанныеИмпорта.Аутентификация.Токен;
+ ИначеЕсли ТипАутентификации = СписокТиповАутентификации[5].Значение Тогда // AWS4-HMAC-SHA256
+ AWSКлючДоступа = ДанныеИмпорта.Аутентификация.Пользователь;
+ AWSСекретныйКлюч = ДанныеИмпорта.Аутентификация.Пароль;
+ AWSРегион = ДанныеИмпорта.Аутентификация.РегионAWS;
+ AWSСервис = ДанныеИмпорта.Аутентификация.СервисAWS;
+ КонецЕсли;
+ КонецЕсли;
+
+ ДопустимыеТипыСертификата = Новый Соответствие;
+ ДопустимыеТипыСертификата.Вставить("", Истина);
+ ДопустимыеТипыСертификата.Вставить("PEM", Истина);
+ ДопустимыеТипыСертификата.Вставить("P12", Истина);
+ ДопустимыйТипСертификата = ДопустимыеТипыСертификата.Получить(ВРег(ДанныеИмпорта.КлиентскийСертификат.Тип));
+ Если НЕ ПустаяСтрока(ДанныеИмпорта.КлиентскийСертификат.Сертификат) Тогда
+ Если ДопустимыйТипСертификата = Неопределено Тогда
+ ИспользоватьСертификаты = Ложь;
+ СообщитьПользователю(СтрШаблон("Тип сертификата ""%1"" не поддерживается", ДанныеИмпорта.КлиентскийСертификат.Тип));
+ Иначе
+ ИспользоватьСертификаты = Истина;
+ ИмяФайлаКлиентскогоСертификата = ДанныеИмпорта.КлиентскийСертификат.Сертификат;
+ ПарольКлиентскогоСертификата = ДанныеИмпорта.КлиентскийСертификат.Пароль;
+ ИмяФайлаСертификатовУЦ = ДанныеИмпорта.КлиентскийСертификат.СертификатыУЦ;
+ ПарольФайлаСертификатовУЦ = "";
+ КонецЕсли;
КонецЕсли;
ЗаголовкиЗапроса.Очистить();
@@ -3216,6 +4546,8 @@
ТелоЗапросаФайл = ТелоЗапросаИмпорт.Значение;
КонецЕсли;
+ Таймаут = ДанныеИмпорта.Таймаут;
+
ИспользоватьСессию = ДанныеИмпорта.ИспользоватьРедиректы;
Если ДанныеИмпорта.ИспользоватьРедиректы Тогда
ПорогПеренаправлений = ?(
@@ -3238,19 +4570,22 @@
ПортПрокси = ДанныеИмпорта.Прокси.Порт;
ПользовательПрокси = ДанныеИмпорта.Прокси.Пользователь;
ПарольПрокси = ДанныеИмпорта.Прокси.Пароль;
- ИспользоватьАутентификациюОСПрокси = НЕ ДанныеИмпорта.BasicАвторизацияПрокси;
+ ИспользоватьАутентификациюОСПрокси = НЕ ДанныеИмпорта.BasicАутентификацияПрокси;
НеИспользоватьПроксиДляЛокальныхАдресов = Ложь;
КонецЕсли;
ИдентификаторРесурсаПриИзменении(Неопределено);
- ТипАвторизацииПриИзменении(Неопределено);
+ ТипАутентификацииПриИзменении(Неопределено);
ТипТелаЗапросаПриИзменении(Неопределено);
+ СпособПовторногоВыполненияПриИзменении(Неопределено);
+ ИспользоватьСертификатыПриИзменении(Неопределено);
ИспользоватьПроксиПриИзменении(Неопределено);
РазделыКонсоли = Элементы.РазделыКонсоли.СписокВыбора[0];
РазделыКонсолиПриИзменении(Неопределено);
КонецПроцедуры
+#КонецОбласти
&НаКлиенте
Функция ОбработанныйПутьКФайлу(Знач ПутьКФайлу)
@@ -3288,8 +4623,8 @@
КонецФункции
&НаСервереБезКонтекста
-Функция РаскодированныйИдентификаторРесурса(Знач Текст)
- Возврат КлиентHTTP.РаскодированныйИдентификаторРесурса(Текст);
+Функция РаскодированныеСтрокиURLвURL(Знач МножествоСтрок)
+ Возврат КлиентHTTP.РаскодированныеСтрокиURLвURL(МножествоСтрок);
КонецФункции
&НаСервереБезКонтекста
@@ -3297,11 +4632,40 @@
Возврат КлиентHTTP.РаскодированныеСтроки(КоллекцияСтрок);
КонецФункции
+&НаСервереБезКонтекста
+Функция КодированныйТекстВURL(Знач Текст)
+ Возврат КодироватьСтроку(Текст, СпособКодированияСтроки.КодировкаURL);
+КонецФункции
+
+&НаСервереБезКонтекста
+Функция КодированныйURIВURL(Знач URI)
+ Кодировано = КодироватьСтроку(URI, СпособКодированияСтроки.URLВКодировкеURL);
+ Позиция = СтрНайти(Кодировано, "?");
+ Если Позиция = 0 Тогда
+ Позиция = СтрДлина(Кодировано) + 1;
+ КонецЕсли;
+
+ Возврат РаскодироватьСтроку(
+ Лев(Кодировано, Позиция-1),
+ СпособКодированияСтроки.URLВКодировкеURL
+ ) + Сред(
+ Кодировано,
+ Позиция,
+ СтрДлина(Кодировано) - Позиция + 1
+ );
+КонецФункции
+
+&НаСервереБезКонтекста
+Функция РазделительПутиСервера()
+ Возврат ПолучитьРазделительПутиСервера();
+КонецФункции
+
&НаКлиенте
Процедура ИзменитьКонтекстВыполненияЗапроса()
Элементы.ИмяФайлаТелаОтвета.КнопкаВыбора = ВыполнятьНаСервере;
Элементы.ТелоЗапросаФайл.КнопкаВыбора = ВыполнятьНаСервере;
Элементы.ДанныеФормыЗначение.КнопкаВыбора = ВыполнятьНаСервере;
+ Элементы.ДанныеФормыЗначение.КнопкаОткрытия = НЕ ВыполнятьНаСервере;
ВыполнятьНаСервере = НЕ ВыполнятьНаСервере;
ЗаголовокКонтекстаВыполнения = ?(
ВыполнятьНаСервере,
@@ -3322,6 +4686,16 @@
Возврат ЗначениеИзСтрокиВнутр(СтрокаВнутр);
КонецФункции
+&НаКлиенте
+Функция ПараметрыОткрытияФормыКодогенерации(Знач Текст)
+ Возврат Новый Структура("Текст, ЗаголовокФормы", Текст, "Код 1С");
+КонецФункции
+
+&НаКлиенте
+Функция ПараметрыОткрытияФормыКомандыCurl(Знач Текст)
+ Возврат Новый Структура("Текст, ЗаголовокФормы, ЦветРедактируемогоТекста", Текст, "Команда curl", WebЦвета.Серебряный);
+КонецФункции
+
#Область ОБРАТНЫЕ_ВЫЗОВЫ
&НаКлиенте
Процедура КонструкторURIЗавершение(Результат, ДополнительныеПараметры) Экспорт
@@ -3474,8 +4848,6 @@
Если ВыбранныеФайлы <> Неопределено Тогда
ИмяФайлаТелаОтвета = ВыбранныеФайлы[0];
КонецЕсли;
-
- ИмяФайлаТелаОтветаПриИзменении(Неопределено);
КонецПроцедуры
&НаКлиенте
@@ -3492,6 +4864,27 @@
КонецЕсли;
КонецПроцедуры
+&НаКлиенте
+Процедура ВыборФайлаКлиентсткогоСертификатаЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
+ Если ВыбранныеФайлы <> Неопределено Тогда
+ ИмяФайлаКлиентскогоСертификата = ВыбранныеФайлы[0];
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ВыборФайлаСертификатовУЦЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
+ Если ВыбранныеФайлы <> Неопределено Тогда
+ ИмяФайлаСертификатовУЦ = ВыбранныеФайлы[0];
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ОбъединениеСертификатаИКлючаЗавершение(Результат, ДополнительныеПараметры) Экспорт
+ Если Результат <> Неопределено Тогда
+ ИмяФайлаКлиентскогоСертификата = Результат;
+ КонецЕсли;
+КонецПроцедуры
+
&НаКлиенте
Процедура ВыборФайлаЭкспортаИстории(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы = Неопределено Тогда
diff --git "a/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260\320\236\320\261\321\212\320\265\320\264\320\270\320\275\320\265\320\275\320\270\321\217\320\241\320\265\321\200\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\260\320\230\320\232\320\273\321\216\321\207\320\260.xml" "b/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260\320\236\320\261\321\212\320\265\320\264\320\270\320\275\320\265\320\275\320\270\321\217\320\241\320\265\321\200\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\260\320\230\320\232\320\273\321\216\321\207\320\260.xml"
new file mode 100644
index 0000000..1977ce8
--- /dev/null
+++ "b/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260\320\236\320\261\321\212\320\265\320\264\320\270\320\275\320\265\320\275\320\270\321\217\320\241\320\265\321\200\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\260\320\230\320\232\320\273\321\216\321\207\320\260.xml"
@@ -0,0 +1,22 @@
+
+
+
+
\ No newline at end of file
diff --git "a/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260\320\236\320\261\321\212\320\265\320\264\320\270\320\275\320\265\320\275\320\270\321\217\320\241\320\265\321\200\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\260\320\230\320\232\320\273\321\216\321\207\320\260/Ext/Form.xml" "b/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260\320\236\320\261\321\212\320\265\320\264\320\270\320\275\320\265\320\275\320\270\321\217\320\241\320\265\321\200\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\260\320\230\320\232\320\273\321\216\321\207\320\260/Ext/Form.xml"
new file mode 100644
index 0000000..c26875f
--- /dev/null
+++ "b/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260\320\236\320\261\321\212\320\265\320\264\320\270\320\275\320\265\320\275\320\270\321\217\320\241\320\265\321\200\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\260\320\230\320\232\320\273\321\216\321\207\320\260/Ext/Form.xml"
@@ -0,0 +1,210 @@
+
+
\ No newline at end of file
diff --git "a/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260\320\236\320\261\321\212\320\265\320\264\320\270\320\275\320\265\320\275\320\270\321\217\320\241\320\265\321\200\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\260\320\230\320\232\320\273\321\216\321\207\320\260/Ext/Form/Module.bsl" "b/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260\320\236\320\261\321\212\320\265\320\264\320\270\320\275\320\265\320\275\320\270\321\217\320\241\320\265\321\200\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\260\320\230\320\232\320\273\321\216\321\207\320\260/Ext/Form/Module.bsl"
new file mode 100644
index 0000000..c09e528
--- /dev/null
+++ "b/src/v1/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260\320\236\320\261\321\212\320\265\320\264\320\270\320\275\320\265\320\275\320\270\321\217\320\241\320\265\321\200\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\260\320\230\320\232\320\273\321\216\321\207\320\260/Ext/Form/Module.bsl"
@@ -0,0 +1,132 @@
+
+// SPDX-License-Identifier: Apache-2.0+
+
+#Область ОбработчикиСобытийФормы
+&НаСервере
+Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
+ Сертификат = Параметры.Сертификат;
+КонецПроцедуры
+#КонецОбласти
+
+#Область ОбработчикиКомандФормы
+&НаКлиенте
+Асинх Процедура Объединить(Команда)
+ Если ПустаяСтрока(Сертификат) Тогда
+ СообщитьПользователю("Укажите путь к файлу сертификата", "Сертификат");
+ Возврат;
+ КонецЕсли;
+ Если ПустаяСтрока(Ключ) Тогда
+ СообщитьПользователю("Укажите путь к файлу ключа сертификата", "Ключ");
+ Возврат;
+ КонецЕсли;
+ Если ПустаяСтрока(Результат) Тогда
+ СообщитьПользователю("Укажите путь к файлу результата конкатенации", "Результат");
+ Возврат;
+ КонецЕсли;
+
+ РезультатОперации = Ждать КлиентHTTPСлужебный.ОбъединенныйФайлСертификатаИКлючаPEM(
+ Результат,
+ Новый Файл(Сертификат),
+ Новый Файл(Ключ),
+ ЗапретитьПерезапись
+ );
+ Если РезультатОперации.Ошибка Тогда
+ СообщитьПользователю(РезультатОперации.ОписаниеОшибки);
+ Возврат;
+ КонецЕсли;
+
+ Закрыть(Результат);
+КонецПроцедуры
+#КонецОбласти
+
+#Область ОбработчикиСобытийЭлементовФормы
+&НаКлиенте
+Процедура СертификатНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
+ СтандартнаяОбработка = Ложь;
+ Оповещение = Новый ОписаниеОповещения("ВыборФайлаСертификатаЗавершение", ЭтотОбъект);
+
+ ПоказатьДиалогВыбораФайла(Оповещение, "Выбор файла сертификата", "PEM (*.crt)|*.crt|PEM (*.pem)|*.pem|PEM (*.cer)|*.cer|Все файлы|*.*");
+КонецПроцедуры
+
+&НаКлиенте
+Процедура КлючНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
+ СтандартнаяОбработка = Ложь;
+ Оповещение = Новый ОписаниеОповещения("ВыборФайлаКлючаСертификатаЗавершение", ЭтотОбъект);
+
+ ПоказатьДиалогВыбораФайла(Оповещение, "Выбор файла ключа сертификата", "PEM (*.key)|*.key|PEM (*.pem)|*.pem|Все файлы|*.*");
+КонецПроцедуры
+
+&НаКлиенте
+Процедура РезультатНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
+ СтандартнаяОбработка = Ложь;
+ Оповещение = Новый ОписаниеОповещения("ВыборФайлаРезультатаЗавершение", ЭтотОбъект);
+
+ ПоказатьДиалогСохраненияФайла(Оповещение, "Выбор файла для создания", "PEM (*.crt)|*.crt|PEM (*.pem)|*.pem|PEM (*.cer)|*.cer|Все файлы|*.*");
+КонецПроцедуры
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+Процедура СообщитьПользователю(Знач Текст, Знач Поле = Неопределено)
+ Сообщение = Новый СообщениеПользователю;
+ Сообщение.Текст = Текст;
+
+ Если Поле <> Неопределено Тогда
+ Сообщение.Поле = Поле;
+ КонецЕсли;
+
+ Сообщение.Сообщить();
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПоказатьДиалогВыбораФайла(Знач Оповещение, Знач Заголовок = "Выбор файла", Знач Фильтр = Неопределено)
+ Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
+ Диалог.Заголовок = Заголовок;
+ Диалог.ПредварительныйПросмотр = Ложь;
+ Диалог.ПроверятьСуществованиеФайла = Истина;
+ Диалог.МножественныйВыбор = Ложь;
+
+ Если Фильтр <> Неопределено Тогда
+ Диалог.Фильтр = Фильтр;
+ КонецЕсли;
+
+ Диалог.Показать(Оповещение);
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПоказатьДиалогСохраненияФайла(Знач Оповещение, Знач Заголовок = "Выбор файла", Знач Фильтр = Неопределено)
+ Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
+ Диалог.Заголовок = Заголовок;
+ Диалог.ПредварительныйПросмотр = Ложь;
+ Диалог.ПроверятьСуществованиеФайла = Ложь;
+ Диалог.МножественныйВыбор = Ложь;
+
+ Если Фильтр <> Неопределено Тогда
+ Диалог.Фильтр = Фильтр;
+ КонецЕсли;
+
+ Диалог.Показать(Оповещение);
+КонецПроцедуры
+
+#Область ОБРАТНЫЕ_ВЫЗОВЫ
+&НаКлиенте
+Процедура ВыборФайлаСертификатаЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
+ Если ВыбранныеФайлы <> Неопределено Тогда
+ Сертификат = ВыбранныеФайлы[0];
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ВыборФайлаКлючаСертификатаЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
+ Если ВыбранныеФайлы <> Неопределено Тогда
+ Ключ = ВыбранныеФайлы[0];
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ВыборФайлаРезультатаЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
+ Если ВыбранныеФайлы <> Неопределено Тогда
+ Результат = ВыбранныеФайлы[0];
+ КонецЕсли;
+КонецПроцедуры
+#КонецОбласти
+#КонецОбласти
diff --git "a/src/v2/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP/Ext/Module.bsl" "b/src/v2/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP/Ext/Module.bsl"
index 40fd9b2..0533467 100644
--- "a/src/v2/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP/Ext/Module.bsl"
+++ "b/src/v2/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP/Ext/Module.bsl"
@@ -9,8 +9,8 @@
// Данные - Массив - поля HTML-формы. Элементы - Структура с ключами:
// * Ключ - Строка - имя поля
// * Значение - Строка - значение поля
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
//
// Возвращаемое значение:
// ФиксированнаяСтруктура - объект ответа:
@@ -53,13 +53,13 @@
// Данные - Массив - тело запроса. Элементы - Структура с ключами:
// * Ключ - Строка - имя поля
// * Значение - Строка, Файл - значение поля
-// * ТипMIME - Строка - тип значения поля (необязательный)
-// * Файл - Структура (необязательный), ключи:
-// ** Имя - Строка - имя файла (необязательный),
-// ** ТипMIME - Строка - MIME-тип содержимого файла (необязательный),
-// ** Кодировка - Строка - кодировка файла (необязательный)
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
+// * ТипMIME - Строка - тип значения поля
+// * Файл - Структура, ключи:
+// ** Имя - Строка - имя файла,
+// ** ТипMIME - Строка - MIME-тип содержимого файла,
+// ** Кодировка - Строка - кодировка файла
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
//
// Возвращаемое значение:
// ФиксированнаяСтруктура - объект ответа:
@@ -150,6 +150,15 @@
Возврат ТекущаяУниверсальнаяДата();
КонецФункции
+// Возвращает текущий Unix Timestamp
+//
+// Возвращаемое значение:
+// Число - количество секунд, прошедших с 01.01.1970 по текущее время UTC
+//
+Функция ВременнаяМеткаUnix() Экспорт
+ Возврат ТекущаяУниверсальнаяДата() - КлиентHTTPПовтИсп.ЭпохаUnix();
+КонецФункции
+
// Возвращает раскодированный URI в URL кодировке
//
// Параметры:
@@ -169,7 +178,7 @@
// КонтекстВыполненияАдресВХ - Строка - адрес контекста выполнения запроса во временном хранилище
//
// Возвращаемое значение:
-// Строка - значение заголовка Digest-авторизации
+// Строка - значение заголовка Digest-аутентификации
//
Функция ЗаголовокDigest(Знач Конфигурация, Знач КонтекстВыполненияАдресВХ) Экспорт
КонтекстВыполнения = ПолучитьИзВременногоХранилища(КонтекстВыполненияАдресВХ);
@@ -177,7 +186,7 @@
Параметры = Конфигурация.ДополнительныеПараметры.Сессия.ПараметрыDigest;
Аутентификация = Конфигурация.ДополнительныеПараметры.Аутентификация;
- АдресРесурсаСПараметрами = Конфигурация.ДанныеURI.АдресРесурса + Конфигурация.Параметры;
+ ПутьСПараметрами = Конфигурация.ДанныеURI.Путь + Конфигурация.ПараметрыСтрокой;
АлгоритмХеширования = НРег(Параметры.algorithm);
УникальныйКлючКлиента = Лев(СтрЗаменить(НРег(Новый УникальныйИдентификатор), "-", ""), 16);
@@ -194,8 +203,8 @@
A2 = ?(
КачествоЗащиты = "auth-int",
- СтрШаблон("%1:%2:%3", КонтекстВыполнения.Метод, АдресРесурсаСПараметрами, ХешСтрока(КонтекстВыполнения.Данные, АлгоритмХеширования)),
- СтрШаблон("%1:%2", КонтекстВыполнения.Метод, АдресРесурсаСПараметрами)
+ СтрШаблон("%1:%2:%3", КонтекстВыполнения.Метод, ПутьСПараметрами, ХешСтрока(КонтекстВыполнения.Данные, АлгоритмХеширования)),
+ СтрШаблон("%1:%2", КонтекстВыполнения.Метод, ПутьСПараметрами)
);
HA2 = ХешСтрока(A2, АлгоритмХеширования);
@@ -230,7 +239,7 @@
Конфигурация.ДополнительныеПараметры.Аутентификация.Пользователь,
Параметры.realm,
Параметры.nonce,
- АдресРесурсаСПараметрами,
+ ПутьСПараметрами,
Ответ
)
);
@@ -248,30 +257,245 @@
Возврат СтрСоединить(фРезультат);
КонецФункции
+// Возвращает заголовки AWS4-аутентификации
+//
+// Параметры:
+// Метод - Строка - имя HTTP-метода
+// Конфигурация - Структура - конфигурация выполнения запроса
+// ДанныеАдресВХ - Строка - адрес данных тела запроса во временном хранилище
+//
+// Возвращаемое значение:
+// Массив - заголовки AWS4-аутентификации
+//
+Функция ЗаголовкиAWS4(Знач Метод, Знач Конфигурация, Знач ДанныеАдресВХ) Экспорт
+ фРезультат = Новый Массив;
+
+ Данные = ПолучитьИзВременногоХранилища(ДанныеАдресВХ);
+ УдалитьИзВременногоХранилища(ДанныеАдресВХ);
+
+ ЗаголовокAmzContent = ХешСтрока(Данные, ХешФункция.SHA256);
+
+ СпецификацияЗапроса = "aws4_request";
+ АлгоритмШифрования = "AWS4-HMAC-SHA256";
+ Аутентификация = Конфигурация.ДополнительныеПараметры.АвторизоватьсяAWS4;
+ Регион = ?(ПустаяСтрока(Аутентификация.Регион), КлиентHTTPПовтИсп.РегионAWSПоУмолчанию(), Аутентификация.Регион);
+ ТУД = ТекущаяУниверсальнаяДата();
+ ЗаголовокAmzDate = Формат(ТУД, "ДФ=yyyyMMddTHHmmssZ");
+ ДатаДействия = Формат(ТУД, "ДФ=yyyyMMdd");
+
+ фРезультат.Добавить(Новый Структура("Ключ, Значение", "X-Amz-Date", ЗаголовокAmzDate));
+ фРезультат.Добавить(Новый Структура("Ключ, Значение", "X-Amz-Content-Sha256", ЗаголовокAmzContent));
+
+ СписокЗаголовков = СписокЗаголовковAWS4(Конфигурация.Заголовки, фРезультат);
+ ПодписываемыеЗаголовки = ПодписываемыеЗаголовкиAWS4(СписокЗаголовков);
+
+ ЧастиСтроки = Новый Массив;
+ ЧастиСтроки.Добавить(Метод);
+ ЧастиСтроки.Добавить(Конфигурация.ДанныеURI.Путь);
+ ЧастиСтроки.Добавить(КаноническиеПараметрыAWS4(Конфигурация.Параметры));
+ ЧастиСтроки.Добавить(КаноническиеЗаголовкиAWS4(СписокЗаголовков));
+ ЧастиСтроки.Добавить(ПодписываемыеЗаголовки);
+ ЧастиСтроки.Добавить(ЗаголовокAmzContent);
+ КаноническийЗапрос = СтрСоединить(ЧастиСтроки, Символы.ПС);
+
+ ЧастиСтроки = Новый Массив;
+ ЧастиСтроки.Добавить(ДатаДействия);
+ ЧастиСтроки.Добавить(Регион);
+ ЧастиСтроки.Добавить(Аутентификация.Сервис);
+ ЧастиСтроки.Добавить(СпецификацияЗапроса);
+ ОбластьДействия = СтрСоединить(ЧастиСтроки, "/");
+
+ ЧастиСтроки = Новый Массив;
+ ЧастиСтроки.Добавить(АлгоритмШифрования);
+ ЧастиСтроки.Добавить(ЗаголовокAmzDate);
+ ЧастиСтроки.Добавить(ОбластьДействия);
+ ЧастиСтроки.Добавить(ХешСтрока(КаноническийЗапрос, ХешФункция.SHA256));
+ СтрокаДляПодписи = СтрСоединить(ЧастиСтроки, Символы.ПС);
+
+ Подпись = HMAC256(ПолучитьДвоичныеДанныеИзСтроки("AWS4" + Аутентификация.СекретныйКлюч), ПолучитьДвоичныеДанныеИзСтроки(ДатаДействия));
+ Подпись = HMAC256(Подпись, ПолучитьДвоичныеДанныеИзСтроки(Регион));
+ Подпись = HMAC256(Подпись, ПолучитьДвоичныеДанныеИзСтроки(Аутентификация.Сервис));
+ Подпись = HMAC256(Подпись, ПолучитьДвоичныеДанныеИзСтроки(СпецификацияЗапроса));
+ Подпись = НРег(ПолучитьHexСтрокуИзДвоичныхДанных(HMAC256(Подпись, ПолучитьДвоичныеДанныеИзСтроки(СтрокаДляПодписи))));
+
+ фРезультат.Добавить(Новый Структура(
+ "Ключ, Значение",
+ КлиентHTTPПовтИсп.ЗаголовокТипАутентификации(),
+ СтрШаблон(
+ "%1 Credential=%2/%3, SignedHeaders=%4, Signature=%5",
+ АлгоритмШифрования,
+ Аутентификация.КлючДоступа,
+ ОбластьДействия,
+ ПодписываемыеЗаголовки,
+ Подпись
+ )
+ ));
+
+ Возврат Новый ФиксированныйМассив(фРезультат);
+КонецФункции
+
+// Возвращает значение заголовка Hawk-аутентификации
+// Расчёт подписи содержимого тела запроса не обязателен для Hawk-аутентификации.
+//
+// Параметры:
+// Метод - Строка - имя HTTP-метода
+// Конфигурация - Структура - конфигурация выполнения запроса
+// ДанныеАдресВХ - Строка, Неопределено - адрес данных тела запроса во временном хранилище
+//
+// Возвращаемое значение:
+// Строка - значение заголовка Hawk-аутентификации
+//
+Функция ЗаголовокHawk(Знач Метод, Конфигурация, Знач ДанныеАдресВХ = Неопределено) Экспорт
+ фРезультат = Новый Массив;
+
+ ПодписьТела = "";
+ Если ДанныеАдресВХ <> Неопределено Тогда
+ Данные = ПолучитьИзВременногоХранилища(ДанныеАдресВХ);
+ УдалитьИзВременногоХранилища(ДанныеАдресВХ);
+
+ ПодписьТела = ПодписьТелаHawk(
+ Данные,
+ КлиентHTTPКлиентСервер.ТипMIMEИзЗаголовков(Конфигурация.Заголовки)
+ );
+ КонецЕсли;
+
+ Аутентификация = Конфигурация.ДополнительныеПараметры.АвторизоватьсяHawk;
+ ДополнительныеДанные = НормализованныеДополнительныеДанныеHawk(Аутентификация.Дополнение);
+ РазовоеСлово = НовоеРазовоеСлово();
+ ВременнаяМетка = XMLСтрока(ВременнаяМеткаUnix());
+
+ ЧастиСтроки = Новый Массив;
+ ЧастиСтроки.Добавить("hawk.1.header");
+ ЧастиСтроки.Добавить(ВременнаяМетка);
+ ЧастиСтроки.Добавить(РазовоеСлово);
+ ЧастиСтроки.Добавить(Метод);
+ ЧастиСтроки.Добавить(Конфигурация.ДанныеURI.Путь);
+ ЧастиСтроки.Добавить(НРег(Конфигурация.ДанныеURI.Сервер));
+ ЧастиСтроки.Добавить(XMLСтрока(Конфигурация.ДанныеURI.Порт));
+ ЧастиСтроки.Добавить(ПодписьТела);
+ ЧастиСтроки.Добавить(ДополнительныеДанные);
+
+ Если НЕ ПустаяСтрока(Аутентификация.ИдентификаторПриложения) Тогда
+ ЧастиСтроки.Добавить(Аутентификация.ИдентификаторПриложения);
+ ЧастиСтроки.Добавить(Аутентификация.Делегирование);
+ КонецЕсли;
+
+ ЧастиСтроки.Добавить("");
+
+ Подпись = Base64Строка(HMAC256(
+ ПолучитьДвоичныеДанныеИзСтроки(Аутентификация.Ключ),
+ ПолучитьДвоичныеДанныеИзСтроки(СтрСоединить(ЧастиСтроки, Символы.ПС))
+ ));
+
+ фРезультат.Добавить(СтрШаблон("Hawk id=""%1"", ts=""%2"", nonce=""%3""", Аутентификация.Идентификатор, ВременнаяМетка, РазовоеСлово));
+ Если ПодписьТела <> "" Тогда
+ фРезультат.Добавить(СтрШаблон("hash=""%1""", ПодписьТела));
+ КонецЕсли;
+ Если ДополнительныеДанные <> "" Тогда
+ фРезультат.Добавить(СтрШаблон("ext=""%1""", ДополнительныеДанные));
+ КонецЕсли;
+ фРезультат.Добавить(СтрШаблон("mac=""%1""", Подпись));
+ Если НЕ ПустаяСтрока(Аутентификация.ИдентификаторПриложения) Тогда
+ фРезультат.Добавить(СтрШаблон("app=""%1""", Аутентификация.ИдентификаторПриложения));
+ Если НЕ ПустаяСтрока(Аутентификация.Делегирование) Тогда
+ фРезультат.Добавить(СтрШаблон("dlg=""%1""", Аутентификация.Делегирование));
+ КонецЕсли;
+ КонецЕсли;
+
+ Аутентификация = Новый Структура(Аутентификация);
+ Аутентификация.Вставить("РазовоеСлово", РазовоеСлово);
+ Аутентификация.Вставить("ВременнаяМетка", ВременнаяМетка);
+
+ Конфигурация.ДополнительныеПараметры.АвторизоватьсяHawk = Новый ФиксированнаяСтруктура(Аутентификация);
+
+ Возврат СтрСоединить(фРезультат, ", ");
+КонецФункции
+
+// Возвращает результат валидации ответа сервера по указанному заголовку (Hawk аутентификация)
+// Если валидация прошла успешно, вернётся Истина.
+//
+// Параметры:
+// ЗначениеЗаголовка - Строка - значение заголовка ответа сервера с данными Hawk аутентификации
+// КонтекстHawk - Структура - данные Hawk аутентификации запроса
+// ДанныеАдресВХ - Строка - адрес данных тела ответа и MIME-типа во временном хранилище
+// ОписаниеОшибки - Строка - описание ошибки валидации ответа
+//
+// Возвращаемое значение:
+// Булево - результат валидации
+//
+Функция ОтветСЗаголовкомHawkКорректен(Знач ЗначениеЗаголовка, Знач КонтекстHawk, Знач ДанныеАдресВХ, ОписаниеОшибки) Экспорт
+ ДанныеСервера = ДанныеЗаголовкаОтветаHawk(ЗначениеЗаголовка);
+
+ ПодписьТела = "";
+ Если ДанныеСервера.ПодписьТела <> "" Тогда
+ Данные = ПолучитьИзВременногоХранилища(ДанныеАдресВХ);
+ ПодписьТела = ПодписьТелаHawk(Данные.Тело, Данные.ТипMIME);
+ КонецЕсли;
+ УдалитьИзВременногоХранилища(ДанныеАдресВХ);
+
+ Если ПодписьТела <> ДанныеСервера.ПодписьТела Тогда
+ ОписаниеОшибки = СтрШаблон("Не совпадают подписи тела ответа: рассчитана '%1', получена '%2'", ПодписьТела, ДанныеСервера.ПодписьТела);
+ Возврат Ложь;
+ КонецЕсли;
+
+ ЧастиСтроки = Новый Массив;
+ ЧастиСтроки.Добавить("hawk.1.response");
+ ЧастиСтроки.Добавить(КонтекстHawk.ВременнаяМетка);
+ ЧастиСтроки.Добавить(КонтекстHawk.РазовоеСлово);
+ ЧастиСтроки.Добавить(КонтекстHawk.Метод);
+ ЧастиСтроки.Добавить(КонтекстHawk.Путь);
+ ЧастиСтроки.Добавить(НРег(КонтекстHawk.Хост));
+ ЧастиСтроки.Добавить(XMLСтрока(КонтекстHawk.Порт));
+ ЧастиСтроки.Добавить(ПодписьТела);
+ ЧастиСтроки.Добавить(ДанныеСервера.Дополнение);
+
+ Если НЕ ПустаяСтрока(КонтекстHawk.ИдентификаторПриложения) Тогда
+ ЧастиСтроки.Добавить(КонтекстHawk.ИдентификаторПриложения);
+ ЧастиСтроки.Добавить(КонтекстHawk.Делегирование);
+ КонецЕсли;
+
+ ЧастиСтроки.Добавить("");
+
+ Подпись = Base64Строка(HMAC256(
+ ПолучитьДвоичныеДанныеИзСтроки(КонтекстHawk.Ключ),
+ ПолучитьДвоичныеДанныеИзСтроки(СтрСоединить(ЧастиСтроки, Символы.ПС))
+ ));
+
+ Если Подпись <> ДанныеСервера.Подпись Тогда
+ ОписаниеОшибки = СтрШаблон("Не совпадают подписи ответа: рассчитана '%1', получена '%2'", Подпись, ДанныеСервера.Подпись);
+ Возврат Ложь;
+ КонецЕсли;
+
+ Возврат Истина;
+КонецФункции
+
// Возвращает объект обработанного HTTP-ответа
//
// Параметры:
// Ответ - HTTPОтвет - ответ HTTP-сервера на HTTP-запрос
// ДополнительныеПараметры - Структура - конфигурация выполнения HTTP-запроса
+// КонтекстВыполнения - Структура - контекст выполнения запроса
//
// Возвращаемое значение:
// ФиксированнаяСтруктура - объект ответа:
// * КодСостояния - Число - код состояния (ответа) HTTP-сервера,
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
-// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа,
+// * КонтекстВыполнения - Структура - контекст выполнения запроса
//
-Функция ОбъектОбработанногоОтвета(Ответ, ДополнительныеПараметры) Экспорт
+Функция ОбъектОбработанногоОтвета(Знач Ответ, Знач ДополнительныеПараметры, Знач КонтекстВыполнения) Экспорт
фРезультат = КлиентHTTPКлиентСервер.НовыйОбъектОбработанногоОтвета();
фРезультат.КодСостояния = Ответ.КодСостояния;
фРезультат.Заголовки = Ответ.Заголовки;
фРезультат.Тело = ТелоОтвета(Ответ, ДополнительныеПараметры);
фРезультат.ИмяФайлаТела = Ответ.ПолучитьИмяФайлаТела();
+ фРезультат.КонтекстВыполнения = КонтекстВыполнения.Значения;
Возврат Новый ФиксированнаяСтруктура(фРезультат);
КонецФункции
-// Возвращает коллекцию раскодированных строк
+// (УСТАРЕЛО) Возвращает коллекцию раскодированных строк
//
// Параметры:
// КоллекцияСтрок - Структура - коллекция строк для раскодирования (обрабатываются только значения)
@@ -294,7 +518,31 @@
Возврат фРезультат;
КонецФункции
-// Возвращает коллекцию кодированных строк
+// Возвращает множество раскодированных строк способом КодировкаURL
+//
+// Параметры:
+// МножествоСтрок - Соответствие - множество строк для раскодирования
+//
+// Возвращаемое значение:
+// Соответствие - множество раскодированных строк
+//
+Функция РаскодированныеСтрокиURL(Знач МножествоСтрок) Экспорт
+ Возврат РаскодированныеСтрокиСпособом(МножествоСтрок, СпособКодированияСтроки.КодировкаURL);
+КонецФункции
+
+// Возвращает множество раскодированных строк способом URLВКодировкеURL
+//
+// Параметры:
+// МножествоСтрок - Соответствие - множество строк для раскодирования
+//
+// Возвращаемое значение:
+// Соответствие - множество раскодированных строк
+//
+Функция РаскодированныеСтрокиURLвURL(Знач МножествоСтрок) Экспорт
+ Возврат РаскодированныеСтрокиСпособом(МножествоСтрок, СпособКодированияСтроки.URLВКодировкеURL);
+КонецФункции
+
+// (УСТАРЕЛО) Возвращает коллекцию кодированных строк
//
// Параметры:
// КоллекцияСтрок - Структура - коллекция строк для кодирования (обрабатываются только значения)
@@ -317,6 +565,30 @@
Возврат фРезультат;
КонецФункции
+// Возвращает множество кодированных строк способом КодировкаURL
+//
+// Параметры:
+// МножествоСтрок - Соответствие - множество строк для кодирования
+//
+// Возвращаемое значение:
+// Соответствие - множество кодированных строк
+//
+Функция КодированныеСтрокиURL(Знач МножествоСтрок) Экспорт
+ Возврат КодированныеСтрокиСпособом(МножествоСтрок, СпособКодированияСтроки.КодировкаURL);
+КонецФункции
+
+// Возвращает множество кодированных строк способом URLВКодировкеURL
+//
+// Параметры:
+// МножествоСтрок - Соответствие - множество строк для кодирования
+//
+// Возвращаемое значение:
+// Соответствие - множество кодированных строк
+//
+Функция КодированныеСтрокиURLвURL(Знач МножествоСтрок) Экспорт
+ Возврат КодированныеСтрокиСпособом(МножествоСтрок, СпособКодированияСтроки.URLВКодировкеURL);
+КонецФункции
+
// Возвращает коллекцию раскодированных полей HTML-Формы
//
// Параметры:
@@ -354,10 +626,63 @@
Возврат фРезультат;
КонецФункции
+
+// Создаёт файл путём конкатенации файлов сертификата и ключа формата PEM.
+//
+// Параметры:
+// ИмяФайла - Строка - полное имя создаваемого файла
+// Сертификат - Файл - файл сертификата формата PEM
+// Ключ - Файл - файл ключа сертификата формата PEM
+// ЗапретитьПерезапись - Булево - режим проаерки на существование создаваемого файла: если Истина, то вернётся ошибка в случае существования файла по указанному имени (возможен вызов исключения)
+//
+// Возвращаемое значение:
+// Структура - объект ответа:
+// * Ошибка - Булево - признак наличия ошибки
+// * ОписаниеОшибки - Строка - описание ошибки
+//
+Функция ОбъединенныйФайлСертификатаИКлючаPEM(Знач ИмяФайла, Знач Сертификат, Знач Ключ, Знач ЗапретитьПерезапись = Ложь) Экспорт
+ фРезультат = Новый Структура("Ошибка, ОписаниеОшибки", Истина, "");
+ Сертификат = Новый Файл;
+ Если НЕ Сертификат.Существует() Тогда
+ фРезультат.ОписаниеОшибки = "не найден файл сертификата " + Сертификат.ПолноеИмя;
+ Возврат фРезультат;
+ КонецЕсли;
+ Если НЕ Ключ.Существует() Тогда
+ фРезультат.ОписаниеОшибки = "не найден файл ключа " + Ключ.ПолноеИмя;
+ Возврат фРезультат;
+ КонецЕсли;
+
+ Если ЗапретитьПерезапись Тогда
+ Ф = Новый Файл(ИмяФайла);
+ Если Ф.Существует() Тогда
+ фРезультат.ОписаниеОшибки = "файл уже существует: " + ИмяФайла;
+ Возврат фРезультат;
+ КонецЕсли;
+ Режим = РежимОткрытияФайла.СоздатьНовый;
+ Иначе
+ Режим = РежимОткрытияФайла.Создать;
+ КонецЕсли;
+
+ Поток = Новый ФайловыйПоток(ИмяФайла, Режим);
+ Если НЕ Поток.ДоступнаЗапись Тогда
+ Поток.Закрыть();
+ фРезультат.ОписаниеОшибки = "не доступна запись в файл " + ИмяФайла;
+ Возврат фРезультат;
+ КонецЕсли;
+
+ Запись = Новый ЗаписьДанных(Поток);
+ Запись.Записать(Новый ДвоичныеДанные(Сертификат.ПолноеИмя));
+ Запись.Записать(Новый ДвоичныеДанные(Ключ.ПолноеИмя));
+
+ Поток.Закрыть();
+
+ фРезультат.Ошибка = Ложь;
+ Возврат фРезультат;
+КонецФункции
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
-// Добавляет запись ошибки в журнал регистрации
+// (СЛУЖЕБНЫЙ) Добавляет запись ошибки в журнал регистрации
//
// Параметры:
// Данные - Ссылка, Число, Строка, Дата, Булево, Неопределено, Null, Тип - данные, с которыми связано событие
@@ -378,6 +703,31 @@
);
#КонецЕсли
КонецПроцедуры
+
+// (СЛУЖЕБНЫЙ) Запуск паузы выполнения кода по ключу процесса
+// Используется механика фоновых заданий.
+//
+// Параметры:
+// Длительность - Число - длительность ожидания в секундах
+// Ключ - Строка - ключ процесса, требующего паузу (используется как ключ фонового задания)
+//
+Процедура ПаузаПередПовторнымВыполнением(Знач Длительность, Знач Ключ) Экспорт
+ Перем ФЗ;
+
+ ИмяМетода = "КлиентHTTP.ПаузаПередПовторнымВыполнением";
+ ФЗя = ФоновыеЗадания.ПолучитьФоновыеЗадания(Новый Структура("ИмяМетода, Ключ, Состояние", ИмяМетода, Ключ, СостояниеФоновогоЗадания.Активно));
+ Если ФЗя.Количество() = 0 Тогда
+ Параметры = Новый Массив;
+ Параметры.Добавить(Длительность);
+ Параметры.Добавить(Ключ);
+
+ ФЗ = ФоновыеЗадания.Выполнить(ИмяМетода, Параметры, Ключ);
+ Иначе
+ ФЗ = ФЗя[0];
+ КонецЕсли;
+
+ ФЗ.ОжидатьЗавершенияВыполнения(Длительность);
+КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
@@ -495,8 +845,11 @@
// собирать значение печеньки пока не придёт знак (ТипТокена В {1, 2}) его записать
Действие.ЗаписатьЗначениеПеченьки = Ложь;
Действие.СобиратьЗначениеПеченьки = Истина;
- СостояниеПеченьки.Построитель.Добавить(СостояниеПеченьки.Объект.Значение + ЧастьОписанияПеченья(ОписанияПеченья.Исходное, СостояниеЧтения));
- СостояниеПеченьки.Построитель.Добавить(СостояниеЧтения.Токен.Токен);
+ ЧастиОписания = ЧастьОписанияПеченья(ОписанияПеченья.Исходное, СостояниеЧтения);
+ Если НЕ ПустаяСтрока(ЧастиОписания) Тогда
+ СостояниеПеченьки.Построитель.Добавить(СостояниеПеченьки.Объект.Значение + ЧастиОписания);
+ СостояниеПеченьки.Построитель.Добавить(СостояниеЧтения.Токен.Токен);
+ КонецЕсли;
СостояниеЧтения.Позиция = СостояниеЧтения.Токен.Позиция + 1;
ПереключитьСостояниеДКА(СостояниеДКА);
КонецПроцедуры
@@ -673,6 +1026,10 @@
КонецПроцедуры
Функция ЧастьОписанияПеченья(Знач ОписаниеПеченьки, Знач СостояниеЧтения, Знач Смещение = 0)
+ Если СостояниеЧтения.Токен.Позиция - СостояниеЧтения.Позиция + Смещение < 1 Тогда
+ Возврат "";
+ КонецЕсли;
+
Возврат Сред(
ОписаниеПеченьки,
СостояниеЧтения.Позиция,
@@ -780,7 +1137,7 @@
КонецФункции
Функция ХешСтрока(Знач Данные, Знач Алгоритм)
- ТипФункции = ТипХешФункции(Алгоритм);
+ ТипФункции = ?(ТипЗнч(Алгоритм) = Тип("ХешФункция"), Алгоритм, ТипХешФункции(Алгоритм));
Если ТипЗнч(Данные) = Тип("Строка") Тогда
Данные = ПолучитьДвоичныеДанныеИзСтроки(Данные, КлиентHTTPПовтИсп.КодировкаUTF8(), Ложь);
@@ -918,4 +1275,209 @@
ЗаписьДанныхФормы.Записать(Новый ДвоичныеДанные(ПолеФормы.Значение.ПолноеИмя));
ЗаписьДанныхФормы.ЗаписатьСтроку("");
КонецПроцедуры
+
+Функция РаскодированныеСтрокиСпособом(Знач МножествоСтрок, Знач Способ)
+ фРезультат = Новый Соответствие;
+
+ Для Каждого КЗ Из МножествоСтрок Цикл
+ фРезультат.Вставить(КЗ.Ключ, РаскодироватьСтроку(КЗ.Ключ, Способ));
+ КонецЦикла;
+
+ Возврат фРезультат;
+КонецФункции
+
+Функция КодированныеСтрокиСпособом(Знач МножествоСтрок, Знач Способ)
+ фРезультат = Новый Соответствие;
+
+ Для Каждого КЗ Из МножествоСтрок Цикл
+ фРезультат.Вставить(КЗ.Ключ, КодироватьСтроку(КЗ.Ключ, Способ));
+ КонецЦикла;
+
+ Возврат фРезультат;
+КонецФункции
+
+Функция НовоеРазовоеСлово()
+ фРезультат = Новый Массив;
+
+ База = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+ ДлинаБазы = СтрДлина(База);
+ ГСЧ = Новый ГенераторСлучайныхЧисел(13);
+ Для я = 1 По 32 Цикл
+ Позиция = ГСЧ.СлучайноеЧисло(1, ДлинаБазы);
+ фРезультат.Добавить(Сред(База, Позиция, 1));
+ КонецЦикла;
+
+ Возврат СтрСоединить(фРезультат);
+КонецФункции
+
+Функция HMAC256(Знач Ключ, Знач Данные)
+ АлгоритмХеширования = ХешФункция.SHA256;
+ РазмерБлока = 64;
+ Если Ключ.Размер() > РазмерБлока Тогда
+ Хеширование = Новый ХешированиеДанных(АлгоритмХеширования);
+ Хеширование.Добавить(Ключ);
+
+ Ключ = Хеширование.ХешСумма;
+ КонецЕсли;
+
+ ВнутренняяОснова = Новый БуферДвоичныхДанных(РазмерБлока);
+ ВнешняяОснова = Новый БуферДвоичныхДанных(РазмерБлока);
+ Для Позиция = 0 По РазмерБлока - 1 Цикл
+ ВнутренняяОснова.Установить(Позиция, 54); // 0x36
+ ВнешняяОснова.Установить(Позиция, 92); // 0x5C
+ КонецЦикла;
+
+ Буфер = Новый БуферДвоичныхДанных(РазмерБлока);
+ Буфер.Записать(0, ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(Ключ));
+
+ ВнутреннийКлюч = Буфер.Скопировать();
+ ВнутреннийКлюч.ЗаписатьПобитовоеИсключительноеИли(0, ВнутренняяОснова);
+
+ ВнешнийКлюч = Буфер;
+ ВнешнийКлюч.ЗаписатьПобитовоеИсключительноеИли(0, ВнешняяОснова);
+
+ ВнутреннийХеш = Новый ХешированиеДанных(АлгоритмХеширования);
+ ВнешнийХеш = Новый ХешированиеДанных(АлгоритмХеширования);
+
+ ВнутреннийХеш.Добавить(ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ВнутреннийКлюч));
+ ВнешнийХеш.Добавить(ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ВнешнийКлюч));
+
+ Если ЗначениеЗаполнено(Данные) Тогда
+ ВнутреннийХеш.Добавить(Данные);
+ КонецЕсли;
+
+ ВнешнийХеш.Добавить(ВнутреннийХеш.ХешСумма);
+
+ Возврат ВнешнийХеш.ХешСумма;
+КонецФункции
+
+Функция КаноническиеПараметрыAWS4(Знач ПараметрыЗапроса)
+ фРезультат = Новый Массив;
+
+ СписокПараметров = Новый СписокЗначений;
+ Для Каждого Параметр Из ПараметрыЗапроса Цикл
+ Ключ = КодироватьСтроку(КлиентHTTPСлужебный.ФорматированноеИмяПараметраЗапроса(Параметр.Ключ), СпособКодированияСтроки.URLВКодировкеURL);
+ Если ПустаяСтрока(Ключ) Тогда
+ Продолжить;
+ КонецЕсли;
+ Если Параметр.Значение.Количество() = 0 Тогда
+ СписокПараметров.Добавить(Ключ);
+ Продолжить;
+ КонецЕсли;
+ Для Каждого Значение Из Параметр.Значение Цикл
+ СписокПараметров.Добавить(Ключ, КодироватьСтроку(КлиентHTTPСлужебный.ФорматированноеИмяПараметраЗапроса(Значение), СпособКодированияСтроки.URLВКодировкеURL));
+ КонецЦикла;
+ КонецЦикла;
+ СписокПараметров.СортироватьПоПредставлению();
+ СписокПараметров.СортироватьПоЗначению();
+
+ Для Каждого Параметр Из СписокПараметров Цикл
+ фРезультат.Добавить(Параметр.Значение + "=" + Параметр.Представление);
+ КонецЦикла;
+
+ Возврат СтрСоединить(фРезультат, "&");
+КонецФункции
+
+Функция СписокЗаголовковAWS4(Знач ЗаголовкиЗапроса, Знач ЗаголовкиAWS)
+ фРезультат = Новый СписокЗначений;
+
+ МножествоЗаголовков = Новый Соответствие;
+
+ Для Каждого Заголовок Из ЗаголовкиЗапроса Цикл
+ Ключ = НРег(Заголовок.Ключ);
+ Если Ключ = "host" ИЛИ СтрНачинаетсяС(Ключ, "x-amz-") Тогда
+ МножествоЗаголовков.Вставить(Ключ, Заголовок.Значение);
+ КонецЕсли;
+ КонецЦикла;
+ Для Каждого Заголовок Из ЗаголовкиAWS Цикл
+ МножествоЗаголовков.Вставить(НРег(Заголовок.Ключ), Заголовок.Значение);
+ КонецЦикла;
+
+ Для Каждого Заголовок Из МножествоЗаголовков Цикл
+ фРезультат.Добавить(Заголовок.Ключ, Заголовок.Значение);
+ КонецЦикла;
+ фРезультат.СортироватьПоЗначению(НаправлениеСортировки.Возр);
+
+ Возврат фРезультат;
+КонецФункции
+
+Функция КаноническиеЗаголовкиAWS4(Знач СписокЗаголовков)
+ фРезультат = Новый Массив;
+ Для Каждого Заголовок Из СписокЗаголовков Цикл
+ фРезультат.Добавить(СтрШаблон("%1:%2", Заголовок.Значение, Заголовок.Представление));
+ КонецЦикла;
+ фРезультат.Добавить("");
+
+ Возврат СтрСоединить(фРезультат, Символы.ПС);
+КонецФункции
+
+Функция ПодписываемыеЗаголовкиAWS4(Знач СписокЗаголовков)
+ фРезультат = Новый Массив;
+ Для Каждого Заголовок Из СписокЗаголовков Цикл
+ фРезультат.Добавить(Заголовок.Значение);
+ КонецЦикла;
+
+ Возврат СтрСоединить(фРезультат, ";");
+КонецФункции
+
+Функция НормализованныеДополнительныеДанныеHawk(Знач ДополнительныеДанные)
+ Возврат СтрЗаменить(СтрЗаменить(ДополнительныеДанные, "\", "\\"), Символы.ПС, "\n");
+КонецФункции
+
+Функция ПодписьТелаHawk(Знач Данные, Знач ТипКонтента)
+ Если Данные.Размер() = 0 ИЛИ НЕ ЗначениеЗаполнено(ТипКонтента) Тогда
+ Возврат "";
+ КонецЕсли;
+
+ Поток = Новый ПотокВПамяти;
+ Запись = Новый ЗаписьДанных(Поток);
+
+ Запись.ЗаписатьСимволы("hawk.1.payload");
+ Запись.ЗаписатьБайт(10); // символ '\n'
+ Запись.ЗаписатьСимволы(НРег(ТипКонтента));
+ Запись.ЗаписатьБайт(10);
+ Запись.Записать(Данные);
+ Запись.ЗаписатьБайт(10);
+
+ Хеширование = Новый ХешированиеДанных(ХешФункция.SHA256);
+ Хеширование.Добавить(Поток.ЗакрытьИПолучитьДвоичныеДанные());
+
+ Возврат Base64Строка(Хеширование.ХешСумма);
+КонецФункции
+
+Функция ДанныеЗаголовкаОтветаHawk(Знач ЗначениеЗаголовка)
+ фРезультат = Новый Структура("Подпись, ПодписьТела, Дополнение", "", "", "");
+
+ ПозицияНачала = СтрНайти(ЗначениеЗаголовка, " mac=""");
+ ПозицияОкончания = 0;
+ Если ПозицияНачала > 0 Тогда
+ ПозицияНачала = ПозицияНачала + 6;
+ ПозицияОкончания = СтрНайти(ЗначениеЗаголовка, """", , ПозицияНачала);
+ Если ПозицияОкончания > 0 Тогда
+ фРезультат.Подпись = Сред(ЗначениеЗаголовка, ПозицияНачала, ПозицияОкончания - ПозицияНачала);
+ КонецЕсли;
+ КонецЕсли;
+
+ ПозицияНачала = СтрНайти(ЗначениеЗаголовка, " hash=""");
+ ПозицияОкончания = 0;
+ Если ПозицияНачала > 0 Тогда
+ ПозицияНачала = ПозицияНачала + 7;
+ ПозицияОкончания = СтрНайти(ЗначениеЗаголовка, """", , ПозицияНачала);
+ Если ПозицияОкончания > 0 Тогда
+ фРезультат.ПодписьТела = Сред(ЗначениеЗаголовка, ПозицияНачала, ПозицияОкончания - ПозицияНачала);
+ КонецЕсли;
+ КонецЕсли;
+
+ ПозицияНачала = СтрНайти(ЗначениеЗаголовка, " ext=""");
+ ПозицияОкончания = 0;
+ Если ПозицияНачала > 0 Тогда
+ ПозицияНачала = ПозицияНачала + 6;
+ ПозицияОкончания = СтрНайти(ЗначениеЗаголовка, """", , ПозицияНачала);
+ Если ПозицияОкончания > 0 Тогда
+ фРезультат.Дополнение = Сред(ЗначениеЗаголовка, ПозицияНачала, ПозицияОкончания - ПозицияНачала);
+ КонецЕсли;
+ КонецЕсли;
+
+ Возврат фРезультат;
+КонецФункции
#КонецОбласти
diff --git "a/src/v2/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Ext/Module.bsl" "b/src/v2/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Ext/Module.bsl"
index 762dd87..ea95c77 100644
--- "a/src/v2/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Ext/Module.bsl"
+++ "b/src/v2/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Ext/Module.bsl"
@@ -22,6 +22,15 @@
Возврат КлиентHTTP.ТекущаяУниверсальнаяДатаНаСервере();
КонецФункции
+// Возвращает текущий Unix Timestamp
+//
+// Возвращаемое значение:
+// Число - количество секунд, прошедших с 01.01.1970 по текущее время UTC
+//
+Функция ВременнаяМеткаUnix() Экспорт
+ Возврат КлиентHTTP.ВременнаяМеткаUnix();
+КонецФункции
+
// Возвращает раскодированный URI
//
// Параметры:
@@ -47,6 +56,51 @@
Возврат КлиентHTTP.ЗаголовокDigest(Конфигурация, КонтекстВыполненияАдресВХ);
КонецФункции
+// Возвращает заголовки AWS4-аутентификации
+//
+// Параметры:
+// Метод - Строка - имя HTTP-метода
+// Конфигурация - Структура - конфигурация выполнения запроса
+// ДанныеАдресВХ - Строка - адрес данных тела запроса во временном хранилище
+//
+// Возвращаемое значение:
+// Массив - заголовки AWS4-авторизации
+//
+Функция ЗаголовкиAWS4(Знач Метод, Знач Конфигурация, Знач ДанныеАдресВХ) Экспорт
+ Возврат КлиентHTTP.ЗаголовкиAWS4(Метод, Конфигурация, ДанныеАдресВХ);
+КонецФункции
+
+// Возвращает значение заголовка Hawk-аутентификации
+// Расчёт подписи содержимого тела запроса не обязателен для Hawk-аутентификации.
+//
+// Параметры:
+// Метод - Строка - имя HTTP-метода
+// Конфигурация - Структура - конфигурация выполнения запроса
+// ДанныеАдресВХ - Строка, Неопределено - адрес данных тела запроса во временном хранилище
+//
+// Возвращаемое значение:
+// Строка - значение заголовка Hawk-аутентификации
+//
+Функция ЗаголовокHawk(Знач Метод, Конфигурация, Знач ДанныеАдресВХ = Неопределено) Экспорт
+ Возврат КлиентHTTP.ЗаголовокHawk(Метод, Конфигурация, ДанныеАдресВХ);
+КонецФункции
+
+// Возвращает результат валидации ответа сервера по указанному заголовку (Hawk аутентификация)
+// Если валидация прошла успешно, вернётся Истина.
+//
+// Параметры:
+// ЗначениеЗаголовка - Строка - значение заголовка ответа сервера с данными Hawk аутентификации
+// КонтекстHawk - Структура - данные Hawk аутентификации запроса
+// ДанныеАдресВХ - Строка - адрес данных тела ответа и MIME-типа во временном хранилище
+// ОписаниеОшибки - Строка - описание ошибки валидации ответа
+//
+// Возвращаемое значение:
+// Булево - результат валидации
+//
+Функция ОтветСЗаголовкомHawkКорректен(Знач ЗначениеЗаголовка, Знач КонтекстHawk, Знач ДанныеАдресВХ, ОписаниеОшибки) Экспорт
+ Возврат КлиентHTTP.ОтветСЗаголовкомHawkКорректен(ЗначениеЗаголовка, КонтекстHawk, ДанныеАдресВХ, ОписаниеОшибки);
+КонецФункции
+
// Добавляет запись ошибки в журнал регистрации
//
// Параметры:
@@ -58,7 +112,7 @@
КлиентHTTP.ДобавитьЗаписьОшибкиВЖурналРегистрации(Данные, Комментарий, СобытиеВТранзакции);
КонецПроцедуры
-// Возвращает коллекцию раскодированных строк
+// (УСТАРЕЛО) Возвращает коллекцию раскодированных строк
//
// Параметры:
// КоллекцияСтрок - Структура - коллекция строк для раскодирования (обрабатываются только значения)
@@ -71,7 +125,31 @@
Возврат КлиентHTTP.РаскодированныеСтроки(КоллекцияСтрок, Способ);
КонецФункции
-// Возвращает коллекцию кодированных строк
+// Возвращает множество раскодированных строк способом КодировкаURL
+//
+// Параметры:
+// МножествоСтрок - Соответствие - множество строк для раскодирования
+//
+// Возвращаемое значение:
+// Соответствие - множество раскодированных строк
+//
+Функция РаскодированныеСтрокиURL(Знач МножествоСтрок) Экспорт
+ Возврат КлиентHTTP.РаскодированныеСтрокиURL(МножествоСтрок);
+КонецФункции
+
+// Возвращает множество раскодированных строк способом URLВКодировкеURL
+//
+// Параметры:
+// МножествоСтрок - Соответствие - множество строк для раскодирования
+//
+// Возвращаемое значение:
+// Соответствие - множество раскодированных строк
+//
+Функция РаскодированныеСтрокиURLвURL(Знач МножествоСтрок) Экспорт
+ Возврат КлиентHTTP.РаскодированныеСтрокиURLвURL(МножествоСтрок);
+КонецФункции
+
+// (УСТАРЕЛО) Возвращает коллекцию кодированных строк
//
// Параметры:
// КоллекцияСтрок - Структура - коллекция строк для кодирования (обрабатываются только значения)
@@ -84,6 +162,30 @@
Возврат КлиентHTTP.ЗакодированныеСтроки(КоллекцияСтрок, Способ);
КонецФункции
+// Возвращает множество кодированных строк способом КодировкаURL
+//
+// Параметры:
+// МножествоСтрок - Соответствие - множество строк для кодирования
+//
+// Возвращаемое значение:
+// Соответствие - множество кодированных строк
+//
+Функция КодированныеСтрокиURL(Знач МножествоСтрок) Экспорт
+ Возврат КлиентHTTP.КодированныеСтрокиURL(МножествоСтрок);
+КонецФункции
+
+// Возвращает множество кодированных строк способом URLВКодировкеURL
+//
+// Параметры:
+// МножествоСтрок - Соответствие - множество строк для кодирования
+//
+// Возвращаемое значение:
+// Соответствие - множество кодированных строк
+//
+Функция КодированныеСтрокиURLвURL(Знач МножествоСтрок) Экспорт
+ Возврат КлиентHTTP.КодированныеСтрокиURLвURL(МножествоСтрок);
+КонецФункции
+
// Возвращает коллекцию раскодированных полей HTML-Формы
//
// Параметры:
@@ -107,4 +209,15 @@
Функция ЗакодированныеПоляФормыHTML(Знач ПоляФормыHTML) Экспорт
Возврат КлиентHTTP.ЗакодированныеПоляФормыHTML(ПоляФормыHTML);
КонецФункции
+
+// Запуск паузы выполнения кода по ключу процесса
+// Используется механика фоновых заданий.
+//
+// Параметры:
+// Длительность - Число - длительность ожидания в секундах
+// Ключ - Строка - ключ процесса, требующего паузу (используется как ключ фонового задания)
+//
+Процедура ПаузаПередПовторнымВыполнением(Знач Длительность, Знач Ключ) Экспорт
+ КлиентHTTP.ПаузаПередПовторнымВыполнением(Длительность, Ключ);
+КонецПроцедуры
#КонецОбласти
diff --git "a/src/v2/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\232\320\273\320\270\320\265\320\275\321\202/Ext/Module.bsl" "b/src/v2/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\232\320\273\320\270\320\265\320\275\321\202/Ext/Module.bsl"
index 55c71d0..471399e 100644
--- "a/src/v2/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\232\320\273\320\270\320\265\320\275\321\202/Ext/Module.bsl"
+++ "b/src/v2/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\232\320\273\320\270\320\265\320\275\321\202/Ext/Module.bsl"
@@ -9,8 +9,8 @@
// Данные - Массив - поля HTML-формы. Элементы - Структура с ключами:
// * Ключ - Строка - имя поля
// * Значение - Строка - значение поля
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
//
// Возвращаемое значение:
// Обещание - содержит объект ответа (ФиксированнаяСтруктура):
@@ -53,13 +53,13 @@
// Данные - Массив - тело запроса. Элементы - Структура с ключами:
// * Ключ - Строка - имя поля
// * Значение - Строка, Файл - значение поля
-// * ТипMIME - Строка - тип значения поля (необязательный)
-// * Файл - Структура (необязательный), ключи:
-// ** Имя - Строка - имя файла (необязательный),
-// ** ТипMIME - Строка - MIME-тип содержимого файла (необязательный),
-// ** Кодировка - Строка - кодировка файла (необязательный)
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
+// * ТипMIME - Строка - тип значения поля
+// * Файл - Структура, ключи:
+// ** Имя - Строка - имя файла,
+// ** ТипMIME - Строка - MIME-тип содержимого файла,
+// ** Кодировка - Строка - кодировка файла
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
//
// Возвращаемое значение:
// Обещание - содержит объект ответа (ФиксированнаяСтруктура):
@@ -103,23 +103,78 @@
// Параметры:
// Ответ - HTTPОтвет - ответ HTTP-сервера на HTTP-запрос
// ДополнительныеПараметры - Структура - конфигурация выполнения HTTP-запроса
+// КонтекстВыполнения - Структура - контекст выполнения запроса
//
// Возвращаемое значение:
// Обещание - содержит объект ответа (ФиксированнаяСтруктура):
// * КодСостояния - Число - код состояния (ответа) HTTP-сервера,
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
-// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа,
+// * КонтекстВыполнения - Структура - контекст выполнения запроса
//
-Асинх Функция ОбъектОбработанногоОтвета(Ответ, ДополнительныеПараметры) Экспорт
+Асинх Функция ОбъектОбработанногоОтвета(Знач Ответ, Знач ДополнительныеПараметры, Знач КонтекстВыполнения) Экспорт
фРезультат = КлиентHTTPКлиентСервер.НовыйОбъектОбработанногоОтвета();
фРезультат.КодСостояния = Ответ.КодСостояния;
фРезультат.Заголовки = Ответ.Заголовки;
фРезультат.Тело = Ждать ТелоОтвета(Ответ, ДополнительныеПараметры);
фРезультат.ИмяФайлаТела = Ответ.ПолучитьИмяФайлаТела();
+ фРезультат.КонтекстВыполнения = КонтекстВыполнения.Значения;
Возврат Новый ФиксированнаяСтруктура(фРезультат);
КонецФункции
+
+// Создаёт файл путём конкатенации файлов сертификата и ключа формата PEM.
+//
+// Параметры:
+// ИмяФайла - Строка - полное имя создаваемого файла
+// Сертификат - Файл - файл сертификата формата PEM
+// Ключ - Файл - файл ключа сертификата формата PEM
+// ЗапретитьПерезапись - Булево - режим проаерки на существование создаваемого файла: если Истина, то вернётся ошибка в случае существования файла по указанному имени (возможен вызов исключения)
+//
+// Возвращаемое значение:
+// Обещание - объект ответа:
+// * Ошибка - Булево - признак наличия ошибки
+// * ОписаниеОшибки - Строка - описание ошибки
+//
+Асинх Функция ОбъединенныйФайлСертификатаИКлючаPEM(Знач ИмяФайла, Знач Сертификат, Знач Ключ, Знач ЗапретитьПерезапись = Ложь) Экспорт
+ фРезультат = Новый Структура("Ошибка, ОписаниеОшибки", Истина, "");
+ Если НЕ Ждать Сертификат.СуществуетАсинх() Тогда
+ фРезультат.ОписаниеОшибки = "не найден файл сертификата " + Сертификат.ПолноеИмя;
+ Возврат фРезультат;
+ КонецЕсли;
+ Если НЕ Ждать Ключ.СуществуетАсинх() Тогда
+ фРезультат.ОписаниеОшибки = "не найден файл ключа " + Ключ.ПолноеИмя;
+ Возврат фРезультат;
+ КонецЕсли;
+
+ Если ЗапретитьПерезапись Тогда
+ Ф = Новый Файл(ИмяФайла);
+ Если Ждать Ф.СуществуетАсинх() Тогда
+ фРезультат.ОписаниеОшибки = "файл уже существует: " + Ф.ПолноеИмя;
+ Возврат фРезультат;
+ КонецЕсли;
+ Режим = РежимОткрытияФайла.СоздатьНовый;
+ Иначе
+ Режим = РежимОткрытияФайла.Создать;
+ КонецЕсли;
+
+ Поток = Новый ФайловыйПоток(ИмяФайла, Режим);
+ Если НЕ Поток.ДоступнаЗапись Тогда
+ Поток.ЗакрытьАсинх();
+ фРезультат.ОписаниеОшибки = "не доступна запись в файл " + ИмяФайла;
+ Возврат фРезультат;
+ КонецЕсли;
+
+ Запись = Новый ЗаписьДанных(Поток);
+ Ждать Запись.ЗаписатьАсинх(Новый ДвоичныеДанные(Сертификат.ПолноеИмя));
+ Ждать Запись.ЗаписатьАсинх(Новый ДвоичныеДанные(Ключ.ПолноеИмя));
+
+ Поток.ЗакрытьАсинх();
+
+ фРезультат.Ошибка = Ложь;
+ Возврат фРезультат;
+КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
diff --git "a/src/v2/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl" "b/src/v2/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl"
index fe023a9..426b080 100644
--- "a/src/v2/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl"
+++ "b/src/v2/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl"
@@ -6,8 +6,8 @@
//
// Параметры:
// ИдентификаторРесурса - Строка, Структура - URI сервиса либо объект идентификатора ресурса
-// ПараметрыЗапроса - Соответствие - коллекция параметров GET-запроса (необязательный)
-// ДополнительныеПараметры - Структура - конфигурация выполнения POST-запроса (необязательный)
+// ПараметрыЗапроса - Соответствие - коллекция параметров GET-запроса
+// ДополнительныеПараметры - Структура - конфигурация выполнения POST-запроса
//
// Возвращаемое значение:
// Обещание, ФиксированнаяСтруктура - объект ответа:
@@ -15,9 +15,10 @@
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * КонтекстВыполнения - Структура - служебный набор значений процесса выполнения запроса
//
Функция Получить(Знач ИдентификаторРесурса, Знач ПараметрыЗапроса = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт
- Возврат ВыполнитьЗапросHTTP(
+ Возврат ВыполненныйЗапросHTTP(
КлиентHTTPПовтИсп.МетодGET(),
КонфигурацияЗапроса(ИдентификаторРесурса, ПараметрыЗапроса, ДополнительныеПараметры)
);
@@ -27,8 +28,8 @@
//
// Параметры:
// ИдентификаторРесурса - Строка, Структура - URI сервиса либо объект идентификатора ресурса
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
//
// Возвращаемое значение:
// Обещание, ФиксированнаяСтруктура - объект ответа:
@@ -36,9 +37,10 @@
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * КонтекстВыполнения - Структура - служебный набор значений процесса выполнения запроса
//
Функция ПолучитьЗаголовки(Знач ИдентификаторРесурса, Знач ПараметрыЗапроса = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт
- Возврат ВыполнитьЗапросHTTP(
+ Возврат ВыполненныйЗапросHTTP(
КлиентHTTPПовтИсп.МетодHEAD(),
КонфигурацияЗапроса(ИдентификаторРесурса, ПараметрыЗапроса, ДополнительныеПараметры)
);
@@ -49,8 +51,8 @@
// Параметры:
// ИдентификаторРесурса - Строка, Структура - URI сервиса либо объект идентификатора ресурса
// Данные - ДвоичныеДанные - тело запроса
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
//
// Возвращаемое значение:
// Обещание, ФиксированнаяСтруктура - объект ответа:
@@ -58,13 +60,14 @@
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * КонтекстВыполнения - Структура - служебный набор значений процесса выполнения запроса
//
Функция ОтправитьДвоичныеДанные(Знач ИдентификаторРесурса, Знач Данные, ДополнительныеПараметры = Неопределено, Знач ПараметрыЗапроса = Неопределено) Экспорт
Конфигурация = КонфигурацияЗапроса(ИдентификаторРесурса, ПараметрыЗапроса, ДополнительныеПараметры);
ДобавитьРазмерДанныхВЗаголовкиЗапроса(Конфигурация.Заголовки, Конфигурация.ДополнительныеПараметры, Данные);
- Возврат ВыполнитьЗапросHTTP(КлиентHTTPПовтИсп.МетодPOST(), Конфигурация, Данные);
+ Возврат ВыполненныйЗапросHTTP(КлиентHTTPПовтИсп.МетодPOST(), Конфигурация, Данные);
КонецФункции
// Реализация PUT
@@ -72,8 +75,8 @@
// Параметры:
// ИдентификаторРесурса - Строка, Структура - URI сервиса либо объект идентификатора ресурса
// Данные - ДвоичныеДанные - тело запроса
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
//
// Возвращаемое значение:
// Обещание, ФиксированнаяСтруктура - объект ответа:
@@ -81,13 +84,14 @@
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * КонтекстВыполнения - Структура - служебный набор значений процесса выполнения запроса
//
Функция ЗаписатьДвоичныеДанные(Знач ИдентификаторРесурса, Знач Данные, ДополнительныеПараметры = Неопределено, Знач ПараметрыЗапроса = Неопределено) Экспорт
Конфигурация = КонфигурацияЗапроса(ИдентификаторРесурса, ПараметрыЗапроса, ДополнительныеПараметры);
ДобавитьРазмерДанныхВЗаголовкиЗапроса(Конфигурация.Заголовки, Конфигурация.ДополнительныеПараметры, Данные);
- Возврат ВыполнитьЗапросHTTP(КлиентHTTPПовтИсп.МетодPUT(), Конфигурация, Данные);
+ Возврат ВыполненныйЗапросHTTP(КлиентHTTPПовтИсп.МетодPUT(), Конфигурация, Данные);
КонецФункции
// Реализация PATCH
@@ -95,8 +99,8 @@
// Параметры:
// ИдентификаторРесурса - Строка, Структура - URI сервиса либо объект идентификатора ресурса
// Данные - ДвоичныеДанные - тело запроса
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
//
// Обещание, Возвращаемое значение:
// ФиксированнаяСтруктура - объект ответа:
@@ -104,22 +108,23 @@
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * КонтекстВыполнения - Структура - служебный набор значений процесса выполнения запроса
//
Функция ИзменитьДвоичныеДанные(Знач ИдентификаторРесурса, Знач Данные, ДополнительныеПараметры = Неопределено, Знач ПараметрыЗапроса = Неопределено) Экспорт
Конфигурация = КонфигурацияЗапроса(ИдентификаторРесурса, ПараметрыЗапроса, ДополнительныеПараметры);
ДобавитьРазмерДанныхВЗаголовкиЗапроса(Конфигурация.Заголовки, Конфигурация.ДополнительныеПараметры, Данные);
- Возврат ВыполнитьЗапросHTTP(КлиентHTTPПовтИсп.МетодPATCH(), Конфигурация, Данные);
+ Возврат ВыполненныйЗапросHTTP(КлиентHTTPПовтИсп.МетодPATCH(), Конфигурация, Данные);
КонецФункции
// Реализация DELETE
//
// Параметры:
// ИдентификаторРесурса - Строка, Структура - URI сервиса либо объект идентификатора ресурса
-// Данные - Строка - тело запроса (необязательный)
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
+// Данные - Строка - тело запроса
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
//
// Возвращаемое значение:
// Обещание, ФиксированнаяСтруктура - объект ответа:
@@ -127,6 +132,7 @@
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * КонтекстВыполнения - Структура - служебный набор значений процесса выполнения запроса
//
Функция Удалить(Знач ИдентификаторРесурса, Знач Данные = "", ДополнительныеПараметры = Неопределено, Знач ПараметрыЗапроса = Неопределено) Экспорт
Конфигурация = КонфигурацияЗапроса(ИдентификаторРесурса, ПараметрыЗапроса, ДополнительныеПараметры);
@@ -136,7 +142,7 @@
ДобавитьРазмерДанныхВЗаголовкиЗапроса(Конфигурация.Заголовки, Конфигурация.ДополнительныеПараметры, Данные);
КонецЕсли;
- Возврат ВыполнитьЗапросHTTP(КлиентHTTPПовтИсп.МетодDELETE(), Конфигурация, Данные);
+ Возврат ВыполненныйЗапросHTTP(КлиентHTTPПовтИсп.МетодDELETE(), Конфигурация, ПолучитьДвоичныеДанныеИзСтроки(Данные, КодировкаИзДопПараметров(Конфигурация.ДополнительныеПараметры)));
КонецФункции
#Область ДЕКОРАТОРЫ
@@ -145,8 +151,8 @@
// Параметры:
// ИдентификаторРесурса - Строка, Структура - URI сервиса либо объект идентификатора ресурса
// Данные - Строка - тело запроса
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
//
// Возвращаемое значение:
// Обещание, ФиксированнаяСтруктура - объект ответа:
@@ -154,6 +160,7 @@
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * КонтекстВыполнения - Структура - служебный набор значений процесса выполнения запроса
//
Функция ОтправитьТекст(Знач ИдентификаторРесурса, Знач Данные, ДополнительныеПараметры = Неопределено, Знач ПараметрыЗапроса = Неопределено) Экспорт
Если ДополнительныеПараметры = Неопределено Тогда
@@ -180,8 +187,8 @@
// Параметры:
// ИдентификаторРесурса - Строка, Структура - URI сервиса либо объект идентификатора ресурса
// Данные - Файл - тело запроса
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
//
// Обещание, Возвращаемое значение:
// ФиксированнаяСтруктура - объект ответа:
@@ -189,6 +196,7 @@
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * КонтекстВыполнения - Структура - служебный набор значений процесса выполнения запроса
//
Функция ОтправитьФайл(Знач ИдентификаторРесурса, Знач Данные, ДополнительныеПараметры = Неопределено, Знач ПараметрыЗапроса = Неопределено) Экспорт
Если ДополнительныеПараметры = Неопределено Тогда
@@ -214,8 +222,8 @@
// Данные - Массив - поля HTML-формы. Элементы - Структура с ключами:
// * Ключ - Строка - имя поля
// * Значение - Строка - значение поля
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
//
// Возвращаемое значение:
// Обещание, ФиксированнаяСтруктура - объект ответа:
@@ -223,6 +231,7 @@
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * КонтекстВыполнения - Структура - служебный набор значений процесса выполнения запроса
//
Функция ОтправитьДанныеHTMLФормы(Знач ИдентификаторРесурса, Знач Данные, ДополнительныеПараметры = Неопределено, Знач ПараметрыЗапроса = Неопределено) Экспорт
#Если Клиент Тогда
@@ -239,13 +248,13 @@
// Данные - Массив - тело запроса. Элементы - Структура с ключами:
// * Ключ - Строка - имя поля
// * Значение - Строка, Файл - значение поля
-// * ТипMIME - Строка - тип значения поля (необязательный)
-// * Файл - Структура (необязательный), ключи:
-// ** Имя - Строка - имя файла (необязательный),
-// ** ТипMIME - Строка - MIME-тип содержимого файла (необязательный),
-// ** Кодировка - Строка - кодировка файла (необязательный)
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
+// * ТипMIME - Строка - тип значения поля
+// * Файл - Структура, ключи:
+// ** Имя - Строка - имя файла,
+// ** ТипMIME - Строка - MIME-тип содержимого файла,
+// ** Кодировка - Строка - кодировка файла
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
//
// Возвращаемое значение:
// Обещание, ФиксированнаяСтруктура - объект ответа:
@@ -253,6 +262,7 @@
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * КонтекстВыполнения - Структура - служебный набор значений процесса выполнения запроса
//
Функция ОтправитьДанныеФормы(Знач ИдентификаторРесурса, Знач Данные, ДополнительныеПараметры = Неопределено, Знач ПараметрыЗапроса = Неопределено) Экспорт
#Если Клиент Тогда
@@ -267,8 +277,8 @@
// Параметры:
// ИдентификаторРесурса - Строка, Структура - URI сервиса либо объект идентификатора ресурса
// Данные - Строка - тело запроса
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
//
// Возвращаемое значение:
// Обещание, ФиксированнаяСтруктура - объект ответа:
@@ -276,6 +286,7 @@
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * КонтекстВыполнения - Структура - служебный набор значений процесса выполнения запроса
//
Функция ЗаписатьТекст(Знач ИдентификаторРесурса, Знач Данные, ДополнительныеПараметры = Неопределено, Знач ПараметрыЗапроса = Неопределено) Экспорт
Если ДополнительныеПараметры = Неопределено Тогда
@@ -302,8 +313,8 @@
// Параметры:
// ИдентификаторРесурса - Строка, Структура - URI сервиса либо объект идентификатора ресурса
// Данные - Файл - тело запроса
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
//
// Возвращаемое значение:
// Обещание, ФиксированнаяСтруктура - объект ответа:
@@ -311,6 +322,7 @@
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * КонтекстВыполнения - Структура - служебный набор значений процесса выполнения запроса
//
Функция ЗаписатьФайл(Знач ИдентификаторРесурса, Знач Данные, ДополнительныеПараметры = Неопределено, Знач ПараметрыЗапроса = Неопределено) Экспорт
Если ДополнительныеПараметры = Неопределено Тогда
@@ -334,8 +346,8 @@
// Параметры:
// ИдентификаторРесурса - Строка, Структура - URI сервиса либо объект идентификатора ресурса
// Данные - Строка - тело запроса
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
//
// Возвращаемое значение:
// Обещание, ФиксированнаяСтруктура - объект ответа:
@@ -343,6 +355,7 @@
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * КонтекстВыполнения - Структура - служебный набор значений процесса выполнения запроса
//
Функция ИзменитьТекст(Знач ИдентификаторРесурса, Знач Данные, ДополнительныеПараметры = Неопределено, Знач ПараметрыЗапроса = Неопределено) Экспорт
Если ДополнительныеПараметры = Неопределено Тогда
@@ -369,8 +382,8 @@
// Параметры:
// ИдентификаторРесурса - Строка, Структура - URI сервиса либо объект идентификатора ресурса
// Данные - Файл - тело запроса
-// ДополнительныеПараметры - Структура - конфигурация выполнения запроса (необязательный)
-// ПараметрыЗапроса - Соответствие - коллекция параметров запроса (необязательный)
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ПараметрыЗапроса - Соответствие - коллекция параметров запроса
//
// Возвращаемое значение:
// Обещание, ФиксированнаяСтруктура - объект ответа:
@@ -378,6 +391,7 @@
// * Заголовки - Соответствие - HTTP-заголовки ответа сервера в виде соответствия "Название заголовка" - "Значение",
// * Тело - ДвоичныеДанные, Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные тела HTTP-ответа,
// * ИмяФайлаТела - Строка, Неопределено - имя файла, в который было записано тело ответа
+// * КонтекстВыполнения - Структура - служебный набор значений процесса выполнения запроса
//
Функция ИзменитьФайл(Знач ИдентификаторРесурса, Знач Данные, ДополнительныеПараметры = Неопределено, Знач ПараметрыЗапроса = Неопределено) Экспорт
Если ДополнительныеПараметры = Неопределено Тогда
@@ -549,6 +563,20 @@
Возврат КлиентHTTPКлиентСервер;
КонецФункции
+// Отмена требования попытки преобразования тела полученного ответа
+//
+// Параметры:
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+//
+// Возвращаемое значение:
+// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
+//
+Функция ТелоОтветаКакДвоичныеДанные(ДополнительныеПараметры) Экспорт
+ ДополнительныеПараметры.Удалить("ПрочитатьТелоОтветаКак");
+
+ Возврат КлиентHTTPКлиентСервер;
+КонецФункции
+
// Требование попытки преобразования тела полученного ответа в текст
//
// Параметры:
@@ -648,6 +676,26 @@
Возврат КлиентHTTPКлиентСервер;
КонецФункции
+// Установка режима переиспользования HTTP-соединения при последующих запросах.
+// При включённом режиме переиспользования HTTP-соединения
+// передача конфигурации выполнения запроса (дополнительные параметры) между клиентом и сервером
+// становится недоступной.
+// Сохранённое HTTP-соединение удаляется при вызове функции.
+//
+// Параметры:
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// Переиспользовать - Булево - флаг переиспользования HTTP-соединеиня при последующих запросах
+//
+// Возвращаемое значение:
+// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
+//
+Функция ПереиспользоватьСоединение(ДополнительныеПараметры, Знач Переиспользовать = Истина) Экспорт
+ ДополнительныеПараметры.Удалить("HTTPСоединение");
+ ДополнительныеПараметры.Вставить("ПереиспользоватьСоединение", Переиспользовать);
+
+ Возврат КлиентHTTPКлиентСервер;
+КонецФункции
+
// Инициализация сессии
//
// Параметры:
@@ -685,6 +733,30 @@
Возврат КлиентHTTPКлиентСервер;
КонецФункции
+// Требование принудительно переключаться на метод GET для кодов перенаправления 301 и 302
+//
+// Параметры:
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// КакGET - Булево - установить переключение на GET
+//
+// Возвращаемое значение:
+// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
+//
+Функция ПеренаправленияКакGET(ДополнительныеПараметры, Знач КакGET = Истина) Экспорт
+ СессияАктивирована = ДополнительныеПараметры.Свойство("Сессия");
+ Если КакGET Тогда
+ Если НЕ СессияАктивирована Тогда
+ ИспользоватьСессию(ДополнительныеПараметры);
+ КонецЕсли;
+
+ ДополнительныеПараметры.Сессия.Вставить("ПеренаправлениеКакGET");
+ ИначеЕсли СессияАктивирована Тогда
+ ДополнительныеПараметры.Сессия.Удалить("ПеренаправлениеКакGET");
+ КонецЕсли;
+
+ Возврат КлиентHTTPКлиентСервер;
+КонецФункции
+
// Установка Basic-авторизации
//
// Параметры:
@@ -746,7 +818,62 @@
// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
//
Функция УстановитьBearerАвторизацию(ДополнительныеПараметры, Знач Токен) Экспорт
- ДополнительныеПараметры.Вставить("Аутентификация", ОбъектАутентификации("Bearer", Токен, ""));
+ ДополнительныеПараметры.Вставить("Аутентификация", ОбъектАутентификацииBearer(Токен));
+
+ Возврат КлиентHTTPКлиентСервер;
+КонецФункции
+
+// Установка AWS4-авторизации
+//
+// Параметры:
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// КлючДоступа - Строка - AWS ключ доступа
+// СекретныйКлюч - Строка - AWS секретный ключ
+// Регион - Строка - AWS регион получателя запроса
+// Сервис - Строка - AWS сервис получателя запроса
+//
+// Возвращаемое значение:
+// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
+//
+Функция УстановитьAWS4Авторизацию(ДополнительныеПараметры, Знач КлючДоступа, Знач СекретныйКлюч, Знач Регион = "", Знач Сервис = "") Экспорт
+ ДополнительныеПараметры.Вставить("Аутентификация", ОбъектАутентификацииAWS4(КлючДоступа, СекретныйКлюч, СокрЛП(Регион), СокрЛП(Сервис)));
+
+ Возврат КлиентHTTPКлиентСервер;
+КонецФункции
+
+// Установка Hawk-авторизации
+//
+// Параметры:
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// Идентификатор - Строка - ID аутентификации
+// Ключ - Строка - секретный ключ
+// Дополнение - Строка - (ext) специфические данные клиента
+// ИдентификаторПриложения - Строка - (app) идентификатор приложения
+// Делегирование - Строка - (dlg) выданный идентификатор приложения
+//
+// Возвращаемое значение:
+// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
+//
+Функция УстановитьHawkАвторизацию(ДополнительныеПараметры, Знач Идентификатор, Знач Ключ, Знач Дополнение = "", Знач ИдентификаторПриложения = "", Знач Делегирование = "") Экспорт
+ ДополнительныеПараметры.Вставить(
+ "Аутентификация",
+ ОбъектАутентификацииHawk(Идентификатор, Ключ, СокрЛП(Дополнение), СокрЛП(ИдентификаторПриложения), СокрЛП(Делегирование))
+ );
+
+ Возврат КлиентHTTPКлиентСервер;
+КонецФункции
+
+// Установка пользовательского значения заголовка "User-Agent"
+//
+// Параметры:
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// АгентПользователя - Строка - значение для заголовка User-Agent
+//
+// Возвращаемое значение:
+// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
+//
+Функция УстановитьАгентаПользователя(ДополнительныеПараметры, Знач АгентПользователя) Экспорт
+ ДополнительныеПараметры.Вставить("АгентПользователя", СокрЛП(АгентПользователя));
Возврат КлиентHTTPКлиентСервер;
КонецФункции
@@ -770,7 +897,7 @@
//
// Параметры:
// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
-// Кодировка - КодировкаТекста, Строка, Неопределено - кодировка (необязательный) - -
+// Кодировка - КодировкаТекста, Строка, Неопределено - кодировка
//
// Возвращаемое значение:
// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
@@ -955,6 +1082,42 @@
Возврат КлиентHTTPКлиентСервер;
КонецФункции
+// Использовать файл клиентского сертификата OpenSSL (с приватным ключом) для установки защищённого соединения.
+// Допустимо применение форматов PEM и PKCS#12 (формат определяется по расширению имени файла).
+//
+// Параметры:
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ЗащищенноеСоединение - ЗащищенноеСоединениеOpenSSL - объект защищенного соединения OpenSSL
+// Сертификат - Файл - клиентский сертификат
+// Пароль - Строка - пароль файла клиентского сертификата
+//
+// Возвращаемое значение:
+// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
+//
+Функция ИспользоватьФайлСертификатаКлиента(ДополнительныеПараметры, Знач Сертификат, Знач Пароль = "") Экспорт
+ ДополнительныеПараметры.Вставить("СертификатК", Новый Структура("Тип, Файл, Пароль", "Файл", Сертификат, Пароль));
+
+ Возврат КлиентHTTPКлиентСервер;
+КонецФункции
+
+// Использовать файл сертификатов удостоверяющих центров OpenSSL.
+// Допустимо применение форматов PEM и PKCS#12 (формат определяется по расширению имени файла).
+//
+// Параметры:
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// ЗащищенноеСоединение - ЗащищенноеСоединениеOpenSSL - объект защищенного соединения OpenSSL
+// СертификатыУЦ - Файл - файл сертификатов удостоверяющих центров
+// Пароль - Строка - пароль файла сертификатов удостоверяющих центров
+//
+// Возвращаемое значение:
+// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
+//
+Функция ИспользоватьФайлСертификатовУдостоверяющихЦентров(ДополнительныеПараметры, Знач СертификатыУЦ, Знач Пароль = "") Экспорт
+ ДополнительныеПараметры.Вставить("СертификатыУЦ", Новый Структура("Тип, Файл, Пароль", "Файл", СертификатыУЦ, Пароль));
+
+ Возврат КлиентHTTPКлиентСервер;
+КонецФункции
+
// Установка режима использования аутентификации NTLM или Negotiate
//
// Параметры:
@@ -1007,8 +1170,8 @@
// ПоляФормы - Массив - коллекция полей формы
// Ключ - Строка - наименование поля
// Значение - Строка - значение текстового поля
-// ТипMIME - Строка, Неопределено - MIME-тип (необязательный)
-// Кодировка - КодировкаТекста, Строка, Неопределено - кодировка текста поля формы (необязательный)
+// ТипMIME - Строка, Неопределено - MIME-тип
+// Кодировка - КодировкаТекста, Строка, Неопределено - кодировка текста поля формы
//
// Возвращаемое значение:
// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
@@ -1034,9 +1197,9 @@
// ПоляФормы - Массив - коллекция полей формы
// Ключ - Строка - наименование поля
// Значение - Файл - объект доступа к файлу
-// ИмяФайла - Строка, Неопределено - имя файла в поле формы (необязательный)
-// ТипMIME - Строка, Неопределено - MIME-тип содержимого файла (необязательный)
-// Кодировка - КодировкаТекста, Строка, Неопределено - кодировка содержимого файла (необязательный)
+// ИмяФайла - Строка, Неопределено - имя файла в поле формы
+// ТипMIME - Строка, Неопределено - MIME-тип содержимого файла
+// Кодировка - КодировкаТекста, Строка, Неопределено - кодировка содержимого файла
//
// Возвращаемое значение:
// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
@@ -1073,6 +1236,129 @@
Возврат КлиентHTTPКлиентСервер;
КонецФункции
+
+// Отмена требования повторять попытки выполнить запрос после неуспешного результата
+// Неуспешным считается вызов исключения и ответ с кодом состояния 5хх или каким-либо из определённых пользователем.
+// ВНИМАНИЕ! Неуспешный HTTP-запрос вызывает исключение, что отменит цепочку транзаций, в которой выполнялся запрос.
+//
+// Параметры:
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+//
+// Возвращаемое значение:
+// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
+//
+Функция РазовоеВыполнение(ДополнительныеПараметры) Экспорт
+ ДополнительныеПараметры.Удалить("ПовторноеВыполнение");
+
+ Возврат КлиентHTTPКлиентСервер;
+КонецФункции
+
+// Требование повторять попытки выполнить запрос после неуспешного результата через фиксированный интервал времени
+// Неуспешным считается вызов исключения и ответ с кодом состояния 5хх или каким-либо из определённых пользователем.
+//
+// Параметры:
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// Длительность - Число - длительность задержки между попытками в секундах
+// ПорогКоличестваПопыток - Число - максимальное количество неуспешных попыток выполнить HTTP-запрос
+// МаксимальнаяДлительность - Число - максимальная длительность паузы между попытками в секундах (ограничение фреймворка 3600)
+// КодыСостояния - Массив - коды состояния ответа (Число), при получении которых необходимо повторять попытки
+//
+// Возвращаемое значение:
+// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
+//
+Функция ФиксированоОтложенныеВыполнения(ДополнительныеПараметры, Знач Длительность = 1, Знач ПорогКоличестваПопыток = 9, Знач МаксимальнаяДлительность = 600, Знач КодыСостояния = Неопределено) Экспорт
+ МножествоКодов = Новый Соответствие;
+ Если КодыСостояния <> Неопределено Тогда
+ Для Каждого Код Из КодыСостояния Цикл
+ МножествоКодов.Вставить(Код, Истина);
+ КонецЦикла;
+ КонецЕсли;
+
+ ДополнительныеПараметры.Вставить("ПовторноеВыполнение", Новый Структура(
+ "Способ, Длительность, МаксимальнаяДлительность, ПорогКоличестваПопыток, КодыСостояния, ОсталосьПопыток, Ключ",
+ СпособБезУвеличения(),
+ ?(Длительность < 0, 0, Длительность),
+ ?(МаксимальнаяДлительность < 0, 0, МаксимальнаяДлительность),
+ КорректныйПорогКоличестваПопыток(ПорогКоличестваПопыток),
+ МножествоКодов
+ ));
+
+ Возврат КлиентHTTPКлиентСервер;
+КонецФункции
+
+// Требование повторять попытки выполнить запрос после неуспешного результата через линейно увеличивающийся интервал времени
+// Формула: НачальнаяДлительность + КоэфициентУвеличения * НачальнаяДлительность * (НомерПопытки - 1)
+// Неуспешным считается вызов исключения и ответ с кодом состояния 5хх или каким-либо из определённых пользователем.
+// ВНИМАНИЕ! Неуспешный HTTP-запрос вызывает исключение, что отменит цепочку транзаций, в которой выполнялся запрос.
+//
+// Параметры:
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// НачальнаяДлительность - Число - длительность паузы после первой попытки в секундах
+// КоэфициентУвеличения - Число - коэффициент увеличения длительности пауз
+// ПорогКоличестваПопыток - Число - максимальное количество неуспешных попыток выполнить HTTP-запрос
+// МаксимальнаяДлительность - Число - максимальная длительность паузы между попытками в секундах (ограничение фреймворка 3600)
+// КодыСостояния - Массив - коды состояния ответа (Число), при получении которых необходимо повторять попытки
+//
+// Возвращаемое значение:
+// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
+//
+Функция ЛинейноОтложенныеВыполнения(ДополнительныеПараметры, Знач НачальнаяДлительность = 1, Знач КоэфициентУвеличения = 1, Знач ПорогКоличестваПопыток = 9, Знач МаксимальнаяДлительность = 600, Знач КодыСостояния = Неопределено) Экспорт
+ МножествоКодов = Новый Соответствие;
+ Если КодыСостояния <> Неопределено Тогда
+ Для Каждого Код Из КодыСостояния Цикл
+ МножествоКодов.Вставить(Код, Истина);
+ КонецЦикла;
+ КонецЕсли;
+
+ ДополнительныеПараметры.Вставить("ПовторноеВыполнение", Новый Структура(
+ "Способ, НачальнаяДлительность, МаксимальнаяДлительность, КоэфициентУвеличения, ПорогКоличестваПопыток, КодыСостояния, ОсталосьПопыток, Ключ",
+ СпособУвеличенияЛинейно(),
+ ?(НачальнаяДлительность < 1, 1, НачальнаяДлительность),
+ ?(МаксимальнаяДлительность < 1, 1, МаксимальнаяДлительность),
+ ?(КоэфициентУвеличения < 0, 0, КоэфициентУвеличения),
+ КорректныйПорогКоличестваПопыток(ПорогКоличестваПопыток),
+ МножествоКодов
+ ));
+
+ Возврат КлиентHTTPКлиентСервер;
+КонецФункции
+
+// Требование повторять попытки выполнить запрос после неуспешного результата через экспоненциально увеличивающийся интервал времени
+// Формула: НачальнаяДлительность * Pow(КоэфициентУвеличения, НомерПопытки - 1)
+// Неуспешным считается вызов исключения и ответ с кодом состояния 5хх или каким-либо из определённых пользователем.
+// ВНИМАНИЕ! Неуспешный HTTP-запрос вызывает исключение, что отменит цепочку транзаций, в которой выполнялся запрос.
+//
+// Параметры:
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+// НачальнаяДлительность - Число - длительность паузы после первой попытки в секундах
+// КоэфициентУвеличения - Число - коэффициент экспоненциального увеличения длительности пауз
+// ПорогКоличестваПопыток - Число - максимальное количество неуспешных попыток выполнить HTTP-запрос
+// МаксимальнаяДлительность - Число - максимальная длительность паузы между попытками в секундах (ограничение фреймворка 3600)
+// КодыСостояния - Массив - коды состояния ответа (Число), при получении которых необходимо повторять попытки
+//
+// Возвращаемое значение:
+// ОбщийМодуль.КлиентHTTPКлиентСервер - модуль вызова функции
+//
+Функция ЭкспоненциальноОтложенныеВыполнения(ДополнительныеПараметры, Знач НачальнаяДлительность = 1, Знач КоэфициентУвеличения = 2, Знач ПорогКоличестваПопыток = 9, Знач МаксимальнаяДлительность = 3600, Знач КодыСостояния = Неопределено) Экспорт
+ МножествоКодов = Новый Соответствие;
+ Если КодыСостояния <> Неопределено Тогда
+ Для Каждого Код Из КодыСостояния Цикл
+ МножествоКодов.Вставить(Код, Истина);
+ КонецЦикла;
+ КонецЕсли;
+
+ ДополнительныеПараметры.Вставить("ПовторноеВыполнение", Новый Структура(
+ "Способ, НачальнаяДлительность, МаксимальнаяДлительность, КоэфициентУвеличения, ПорогКоличестваПопыток, КодыСостояния, ОсталосьПопыток, Ключ",
+ СпособУвеличенияЭкспоненциально(),
+ ?(НачальнаяДлительность < 1, 1, НачальнаяДлительность),
+ ?(МаксимальнаяДлительность < 1, 1, МаксимальнаяДлительность),
+ ?(КоэфициентУвеличения < 1, 1, КоэфициентУвеличения),
+ КорректныйПорогКоличестваПопыток(ПорогКоличестваПопыток),
+ МножествоКодов
+ ));
+
+ Возврат КлиентHTTPКлиентСервер;
+КонецФункции
#КонецОбласти
// Возвращает строку параметров URL из коллекции
@@ -1086,18 +1372,38 @@
Функция ПараметрыЗапросаСтрокой(Знач Параметры) Экспорт
фРезультат = Новый Массив;
+ ПараметрыИдентификатора = Новый Массив;
+ МножествоСтрок = Новый Соответствие;
Для Каждого КЗ Из Параметры Цикл
- ИмяПараметра = ФорматированноеИмяПараметраЗапроса(КЗ.Ключ);
- Если ПустаяСтрока(ИмяПараметра) Тогда
+ Параметр = Новый Структура("Ключ, Значение", КлиентHTTPСлужебный.ФорматированноеИмяПараметраЗапроса(КЗ.Ключ), "");
+ Если ПустаяСтрока(Параметр.Ключ) Тогда
+ Продолжить;
+ КонецЕсли;
+ МножествоСтрок.Вставить(Параметр.Ключ);
+ Если КЗ.Значение.Количество() = 0 Тогда
+ ПараметрыИдентификатора.Добавить(Параметр);
Продолжить;
КонецЕсли;
Для Каждого ЗначениеПараметра Из КЗ.Значение Цикл
- ФЗП = СокрЛП(ФорматированноеЗначениеПараметраЗапроса(ЗначениеПараметра));
- фРезультат.Добавить(ИмяПараметра + ?(ФЗП = "", "", "=") + ФЗП);
+ Параметр.Значение = КлиентHTTPСлужебный.ФорматированноеЗначениеПараметраЗапроса(ЗначениеПараметра);
+ Если Параметр.Значение <> "" Тогда
+ МножествоСтрок.Вставить(Параметр.Значение);
+ КонецЕсли;
+
+ ПараметрыИдентификатора.Добавить(Параметр);
КонецЦикла;
КонецЦикла;
+ МножествоСтрок = КлиентHTTPВызовСервера.КодированныеСтрокиURLвURL(МножествоСтрок);
+
+ Для Каждого Параметр Из ПараметрыИдентификатора Цикл
+ ИмяПараметра = МножествоСтрок.Получить(Параметр.Ключ);
+ ЗначениеПараметра = МножествоСтрок.Получить(Параметр.Значение);
+
+ фРезультат.Добавить(ИмяПараметра + ?(ЗначениеПараметра = "", "", "=") + ЗначениеПараметра);
+ КонецЦикла;
+
Возврат ?(фРезультат.Количество() = 0, "", "?" + СтрСоединить(фРезультат, "&"));
КонецФункции
@@ -1149,6 +1455,25 @@
Возврат фРезультат;
КонецФункции
+// Возвращает значение заголовка Cookie для идентификатора ресурса
+//
+// Параметры:
+// ИдентификаторРесурса - Строка, Структура - URI сервиса либо объект идентификатора ресурса
+// ДополнительныеПараметры - Структура - конфигурация выполнения запроса
+//
+// Возвращаемое значение:
+// Строка, Неопределено - значение заголовка Cookie
+//
+Функция ЗначениеЗаголовкаCookieРесурса(Знач ИдентификаторРесурса, Знач ДополнительныеПараметры) Экспорт
+ Если НЕ ДополнительныеПараметры.Свойство("Сессия") Тогда
+ Возврат Неопределено;
+ КонецЕсли;
+
+ ДанныеURI = СтруктураИдентификатораРесурса(ИдентификаторРесурса);
+
+ Возврат ЗначениеЗаголовкаCookie(ДанныеURI, ДополнительныеПараметры.Сессия);
+КонецФункции
+
// Возвращает MIME-тип из заголовков
//
// Параметры:
@@ -1186,6 +1511,49 @@
Возврат ?(ПозицияКодировки = 0, Неопределено, Сред(ТипКонтента, ПозицияКодировки + 8));
КонецФункции
+
+// Возвращает результат валидации ответа сервера по указанному заголовку (Hawk аутентификация)
+//
+// Параметры:
+// Ответ - Структура - объект ответа сервера
+// ИмяЗаголовка - Строка - имя заголовка ответа сервера с данными Hawk аутентификации
+// ОписаниеОшибки - Строка - описание ошибки валидации ответа
+//
+// Возвращаемое значение:
+// Булево - результат валидации ответа
+//
+Функция ОтветСЗаголовкомHawkКорректен(Знач Ответ, Знач ИмяЗаголовка, ОписаниеОшибки) Экспорт
+ Если НЕ Ответ.КонтекстВыполнения.Свойство("АутентификацияHawk") Тогда
+ ОписаниеОшибки = "Отсутствует контекст Hawk аутентификации";
+ Возврат Ложь;
+ КонецЕсли;
+ Если Ответ.КодСостояния < 200 ИЛИ Ответ.КодСостояния > 299 Тогда
+ Возврат Истина;
+ КонецЕсли;
+ Если ТипЗнч(Ответ.Тело) <> Тип("ДвоичныеДанные") Тогда
+ ОписаниеОшибки = "Валидация доступна только для ответа с телом типа ДвоичныеДанные";
+ Возврат Ложь;
+ КонецЕсли;
+
+ ЗначениеЗаголовкаHawk = ЗначениеЗаголовка(ИмяЗаголовка, Ответ.Заголовки);
+ Если ЗначениеЗаголовкаHawk = Неопределено Тогда
+ ОписаниеОшибки = "В ответе отсутствует заголовок Hawk аутентификации";
+ Возврат Ложь;
+ КонецЕсли;
+
+ Данные = Новый Структура(
+ "Тело, ТипMIME",
+ Ответ.Тело,
+ ЗначениеЗаголовка(КлиентHTTPПовтИсп.ЗаголовокТипКонтента(), Ответ.Заголовки)
+ );
+
+ Возврат КлиентHTTPВызовСервера.ОтветСЗаголовкомHawkКорректен(
+ ЗначениеЗаголовкаHawk,
+ Ответ.КонтекстВыполнения.АутентификацияHawk,
+ ПоместитьВоВременноеХранилище(Данные, Новый УникальныйИдентификатор),
+ ОписаниеОшибки
+ );
+КонецФункции
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
@@ -1195,7 +1563,7 @@
// Структура - пустой объект обработанного ответа
//
Функция НовыйОбъектОбработанногоОтвета() Экспорт
- Возврат Новый Структура("КодСостояния, Заголовки, Тело, ИмяФайлаТела");
+ Возврат Новый Структура("КодСостояния, Заголовки, Тело, ИмяФайлаТела, КонтекстВыполнения");
КонецФункции
// (СЛУЖЕБНЫЙ) Возвращает перобразованное тело HTTP-ответа
@@ -1206,7 +1574,7 @@
// СпособЧтения - Структура - настройки преобразования тела HTTP-ответа
//
// Возвращаемое значение:
-// Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, Неопределено - данные преобразованного тела HTTP-ответа
+// Строка, Структура, Соответствие, ОбъектXDTO, ЗначениеXDTO, ДвоичныеДанные, Неопределено - данные преобразованного тела HTTP-ответа
//
Функция ПреобразованноеТелоОтвета(Знач Ответ, Знач ДанныеТелаОтвета, Знач СпособЧтения) Экспорт
Перем фРезультат;
@@ -1224,30 +1592,11 @@
Если СпособЧтения.Формат = ФорматТелаОтветаТекст() Тогда
фРезультат = ПолучитьСтрокуИзДвоичныхДанных(ДанныеТелаОтвета, Кодировка);
ИначеЕсли СпособЧтения.Формат = ФорматТелаОтветаJSON() Тогда
- Чтение = Новый ЧтениеJSON;
- Чтение.ОткрытьПоток(ДанныеТелаОтвета.ОткрытьПотокДляЧтения(), Кодировка);
-
- фРезультат = ПрочитатьJSON(
- Чтение,
- СпособЧтения.Параметры.ПрочитатьВСоответствие,
- СпособЧтения.Параметры.ИменаСвойствСоЗначениямиДата,
- СпособЧтения.Параметры.ОжидаемыйФорматДаты,
- СпособЧтения.Параметры.ИмяФункцииВосстановления,
- СпособЧтения.Параметры.МодульФункцииВосстановления,
- СпособЧтения.Параметры.ДополнительныеПараметрыФункцииВосстановления,
- СпособЧтения.Параметры.ИменаСвойствДляВосстановления,
- СпособЧтения.Параметры.МаксимальнаяВложенность
- );
-
- Чтение.Закрыть();
+ фРезультат = ОбъектТелаОтветаИзJSON(ДанныеТелаОтвета, Кодировка, СпособЧтения);
ИначеЕсли СпособЧтения.Формат = ФорматТелаОтветаXML() Тогда
- Фабрика = Новый ФабрикаXDTO(СпособЧтения.Параметры.НаборСхемXML, СпособЧтения.Параметры.Пакеты);
-
- Чтение = Новый ЧтениеXML;
- Чтение.ОткрытьПоток(ДанныеТелаОтвета.ОткрытьПотокДляЧтения(), СпособЧтения.Параметры.ПараметрыЧтенияXML, , Кодировка);
- фРезультат = Фабрика.ПрочитатьXML(Чтение);
-
- Чтение.Закрыть();
+ фРезультат = ОбъектТелаОтветаИзXML(ДанныеТелаОтвета, Кодировка, СпособЧтения);
+ Иначе
+ фРезультат = ДанныеТелаОтвета;
КонецЕсли;
Возврат фРезультат;
@@ -1268,42 +1617,106 @@
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
-Функция ВыполнитьЗапросHTTP(Знач Метод, Знач Конфигурация, Знач Данные = Неопределено, Знач НомерПеренаправления = 0)
- Соединение = НовоеHTTPСоединение(Конфигурация.ДанныеURI, Конфигурация.ДополнительныеПараметры);
- Запрос = Новый HTTPЗапрос(АдресРесурсаЗапроса(Конфигурация), Конфигурация.Заголовки);
-
- Если Метод = КлиентHTTPПовтИсп.МетодPOST() ИЛИ Метод = КлиентHTTPПовтИсп.МетодPUT() ИЛИ Метод = КлиентHTTPПовтИсп.МетодDELETE() Тогда
- Если ТипЗнч(Данные) = Тип("Строка") Тогда
- Запрос.УстановитьТелоИзСтроки(Данные, КодировкаИзДопПараметров(Конфигурация.ДополнительныеПараметры));
- Иначе
- Запрос.УстановитьТелоИзДвоичныхДанных(Данные);
- КонецЕсли;
+Функция ВыполненныйЗапросHTTP(Знач Метод, Знач Конфигурация, Знач Данные = Неопределено, Знач НомерПеренаправления = 0)
+ Контекст = КонтекстВыполнения(Метод, Конфигурация, НомерПеренаправления, Данные);
+
+ ПрименитьAWS4Аутентификацию(Метод, Данные, Конфигурация);
+ ПрименитьHawkАутентификацию(Метод, Данные, Конфигурация, Контекст);
+
+ Соединение = НовоеHTTPСоединениеСПереиспользованием(Конфигурация);
+ Запрос = Новый HTTPЗапрос(Контекст.Значения.АдресРесурса, Конфигурация.Заголовки);
+
+ Если МетодПодразумеваетТелоЗапроса(Метод) Тогда
+ Запрос.УстановитьТелоИзДвоичныхДанных(Данные);
КонецЕсли;
+ Попытка
+ Ответ = Соединение.ВызватьHTTPМетод(Метод, Запрос, ИмяВыходногоФайлаИзДопПараметров(Конфигурация.ДополнительныеПараметры));
+ Исключение
+ Контекст.Вставить("ИнформацияОбОшибке", ИнформацияОбОшибке());
+ Ответ = Неопределено;
+ КонецПопытки;
+
Возврат ОбработанныйОтвет(
- Соединение.ВызватьHTTPМетод(Метод, Запрос, ИмяВыходногоФайлаИзДопПараметров(Конфигурация.ДополнительныеПараметры)),
+ Ответ,
Конфигурация,
- КонтекстВыполнения(Метод, НомерПеренаправления, Данные)
+ Контекст
);
КонецФункции
-Функция КонтекстВыполнения(Знач Метод, Знач НомерПеренаправления, Знач Данные)
- Возврат Новый ФиксированнаяСтруктура("Метод, НомерПеренаправления, Данные", Метод, НомерПеренаправления, Данные);
+Функция КонтекстВыполнения(Знач Метод, Знач Конфигурация, Знач НомерПеренаправления, Знач Данные)
+ Возврат Новый Структура(
+ "Метод, НомерПеренаправления, Данные, Значения",
+ Метод,
+ НомерПеренаправления,
+ Данные,
+ Новый Структура( // Значения
+ "Схема, Хост, АдресРесурса",
+ СхемаЗапроса(Конфигурация.ДанныеURI),
+ Конфигурация.Заголовки.Получить(КлиентHTTPПовтИсп.ЗаголовокХост()),
+ АдресРесурсаЗапроса(Конфигурация)
+ )
+ );
КонецФункции
Функция КонфигурацияЗапроса(Знач ИдентификаторРесурса, Знач ПараметрыЗапроса = Неопределено, ДополнительныеПараметры = Неопределено)
Если ПараметрыЗапроса = Неопределено Тогда
ПараметрыЗапроса = НовыеПараметрыЗапроса();
- КонецЕсли;
+ КонецЕсли;
Если ДополнительныеПараметры = Неопределено Тогда
ДополнительныеПараметры = НовыеДополнительныеПараметры();
КонецЕсли;
ДанныеURI = СтруктураИдентификатораРесурса(ИдентификаторРесурса);
- Параметры = ОбъединениеПараметровЗапросаВСтроку(ДанныеURI.Параметры, ПараметрыЗапроса);
+ Параметры = ОбъединениеПараметровЗапроса(ДанныеURI.Параметры, ПараметрыЗапроса);
+ ПараметрыСтрокой = ПараметрыЗапросаСтрокой(Параметры);
Заголовки = ЗаголовкиЗапроса(ДанныеURI, ДополнительныеПараметры);
- Возврат Новый Структура("ДанныеURI, Параметры, Заголовки, ДополнительныеПараметры", ДанныеURI, Параметры, Заголовки, ДополнительныеПараметры);
+ СброситьСостояниеПовторногоВыполнения(ДополнительныеПараметры);
+
+ Возврат Новый Структура("ДанныеURI, Параметры, ПараметрыСтрокой, Заголовки, ДополнительныеПараметры", ДанныеURI, Параметры, ПараметрыСтрокой, Заголовки, ДополнительныеПараметры);
+КонецФункции
+
+Функция СхемаЗапроса(Знач ДанныеURI)
+ Возврат ?(ДанныеURI.ЗащищенноеСоединение, "https://", "http://");
+КонецФункции
+
+Функция МетодПодразумеваетТелоЗапроса(Знач Метод)
+ Возврат Метод = КлиентHTTPПовтИсп.МетодPOST()
+ ИЛИ Метод = КлиентHTTPПовтИсп.МетодPUT()
+ ИЛИ Метод = КлиентHTTPПовтИсп.МетодDELETE()
+ ИЛИ Метод = КлиентHTTPПовтИсп.МетодPATCH();
+КонецФункции
+
+Функция СоставляющиеАдресаРесурса(Знач АдресРесурса)
+ фРезультат = Новый Структура("Путь, Параметры, Фрагмент", "/", НовыеПараметрыЗапроса(), "");
+
+ АдресРесурса = СокрЛП(АдресРесурса);
+ Если АдресРесурса = "" ИЛИ АдресРесурса = "/" Тогда
+ Возврат фРезультат;
+ КонецЕсли;
+ Если НЕ СтрНачинаетсяС(АдресРесурса, "/") Тогда
+ АдресРесурса = "/" + АдресРесурса;
+ КонецЕсли;
+
+ ДлинаАдресаРесурса = СтрДлина(АдресРесурса);
+ ПозицияОкончанияПути = ДлинаАдресаРесурса;
+ ПозицияСимволаПараметров = СтрНайти(АдресРесурса, "?");
+ ПозицияСимволаФрагмента = СтрНайти(АдресРесурса, "#", , ?(ПозицияСимволаПараметров = 0, 1, ПозицияСимволаПараметров));
+ ПозицияОкончанияПути = ?(ПозицияСимволаПараметров = 0, ПозицияСимволаФрагмента, ПозицияСимволаПараметров);
+
+ фРезультат.Путь = Лев(
+ АдресРесурса,
+ ?(
+ ПозицияОкончанияПути = 0,
+ ДлинаАдресаРесурса,
+ ПозицияОкончанияПути - 1
+ )
+ );
+ фРезультат.Параметры = ПараметрыИдентификатора(АдресРесурса, ПозицияСимволаПараметров, ПозицияСимволаФрагмента);
+ фРезультат.Фрагмент = ?(ПозицияСимволаФрагмента = 0, "", Сред(АдресРесурса, ПозицияСимволаФрагмента + 1));
+
+ Возврат фРезультат;
КонецФункции
Функция ДлинаСхемыИдентификатораРесурса(ДанныеURI, Знач ИдентификаторРесурса)
@@ -1323,12 +1736,16 @@
Возврат фРезультат;
КонецФункции
-Процедура РазобратьОснованиеИдентификатораРесурса(ДанныеURI, Знач ИдентификаторРесурса, Знач ПозицияНачала, ПозицияОкончания)
+Процедура РазобратьОснованиеИдентификатораРесурса(ДанныеURI, Знач ИдентификаторРесурса, Знач ПозицияНачала, ПозицияПараметров, ПозицияФрагмента)
ОписаниеТипаЧисло = Новый ОписаниеТипов("Число");
ДлинаИдентификатораРесурса = СтрДлина(ИдентификаторРесурса);
ПозицияНачалаАдресаРесурса = СтрНайти(ИдентификаторРесурса, "/", , ПозицияНачала);
- ПозицияОкончания = СтрНайти(ИдентификаторРесурса, "?", , ПозицияНачала);
+ ПозицияПоиска = ?(ПозицияНачалаАдресаРесурса = 0, ПозицияНачала, ПозицияНачалаАдресаРесурса);
+ ПозицияПараметров = СтрНайти(ИдентификаторРесурса, "?", , ПозицияПоиска);
+ ПозицияПоиска = ?(ПозицияПараметров = 0, ПозицияПоиска, ПозицияПараметров);
+ ПозицияФрагмента = СтрНайти(ИдентификаторРесурса, "#", , ПозицияПоиска);
+ ПозицияОкончания = ?(ПозицияПараметров = 0, ПозицияФрагмента, ПозицияПараметров);
Обращение = Сред(
ИдентификаторРесурса,
@@ -1349,15 +1766,15 @@
Если ПозицияРазделителяАвторизации = 0 Тогда
ПозицияРазделителяАвторизации = ДлинаАвторизации + 1;
КонецЕсли;
+ ЗакодированныйПользователь = СокрЛП(Лев(Авторизация, ПозицияРазделителяАвторизации - 1));
+ ЗакодированныйПароль = Прав(Авторизация, ДлинаАвторизации - ПозицияРазделителяАвторизации);
+ МножествоСтрок = Новый Соответствие;
+ МножествоСтрок.Вставить(ЗакодированныйПользователь);
+ МножествоСтрок.Вставить(ЗакодированныйПароль);
- ЗакодированныеДанные = Новый Структура("Пользователь, Пароль");
- ЗакодированныеДанные.Пользователь = СокрЛП(Лев(Авторизация, ПозицияРазделителяАвторизации - 1));
- ЗакодированныеДанные.Пароль = Прав(Авторизация, ДлинаАвторизации - ПозицияРазделителяАвторизации);
-
- РаскодированныеДанные = КлиентHTTPВызовСервера.РаскодированныеСтроки(ЗакодированныеДанные);
-
- ДанныеURI.Пользователь = РаскодированныеДанные.Пользователь;
- ДанныеURI.Пароль = РаскодированныеДанные.Пароль;
+ МножествоСтрок = КлиентHTTPВызовСервера.РаскодированныеСтрокиURLвURL(МножествоСтрок);
+ ДанныеURI.Пользователь = МножествоСтрок.Получить(ЗакодированныйПользователь);
+ ДанныеURI.Пароль = МножествоСтрок.Получить(ЗакодированныйПароль);
КонецЕсли;
ИмяХоста = Прав(Обращение, ДлинаОбращения - ПозицияПослеАвторизации);
@@ -1378,7 +1795,7 @@
ДанныеURI.Сервер = ?(ПозицияПорта = 0, ИмяХоста, Лев(ИмяХоста, ПозицияПорта - 1));
Если ПозицияНачалаАдресаРесурса > 0 Тогда
- ДанныеURI.АдресРесурса = Сред(
+ ДанныеURI.Путь = Сред(
ИдентификаторРесурса,
ПозицияНачалаАдресаРесурса,
?(
@@ -1390,17 +1807,27 @@
КонецЕсли;
КонецПроцедуры
-Функция ПараметрыИдентификатора(Знач ИдентификаторРесурса, Знач ПозицияНачала) Экспорт
+Функция ПараметрыИдентификатора(Знач ИдентификаторРесурса, Знач ПозицияНачала, Знач ПозицияОкончания)
фРезультат = НовыеПараметрыЗапроса();
+ ДлинаИдентификатораРесурса = СтрДлина(ИдентификаторРесурса);
ПараметрыСтрока = ?(
- ПозицияНачала = 0,
+ ПозицияНачала = 0 ИЛИ ПозицияНачала = ДлинаИдентификатораРесурса,
"",
- Сред(ИдентификаторРесурса, ПозицияНачала + 1)
+ Сред(
+ ИдентификаторРесурса,
+ ПозицияНачала + 1,
+ ?(
+ ПозицияОкончания = 0,
+ ДлинаИдентификатораРесурса,
+ ПозицияОкончания - 1
+ ) - ПозицияНачала
+ )
);
- Параметры = СтрРазделить(ПараметрыСтрока, "&", Ложь);
- Для Каждого Параметр Из Параметры Цикл
+ Параметры = Новый Массив;
+ МножествоСтрок = Новый Соответствие;
+ Для Каждого Параметр Из СтрРазделить(ПараметрыСтрока, "&", Ложь) Цикл
ПозицияРазделителя = СтрНайти(Параметр, "=");
Если ПозицияРазделителя = 0 Тогда
ПозицияРазделителя = СтрДлина(Параметр) + 1;
@@ -1413,6 +1840,17 @@
ЗначениеПараметра = Сред(Параметр, ПозицияРазделителя + 1);
+ Параметры.Добавить(Новый Структура("Ключ, Значение", ИмяПараметра, ЗначениеПараметра));
+ МножествоСтрок.Вставить(ИмяПараметра);
+ МножествоСтрок.Вставить(ЗначениеПараметра);
+ КонецЦикла;
+
+ МножествоСтрок = КлиентHTTPВызовСервера.РаскодированныеСтрокиURLвURL(МножествоСтрок);
+
+ Для Каждого Параметр Из Параметры Цикл
+ ИмяПараметра = МножествоСтрок.Получить(Параметр.Ключ);
+ ЗначениеПараметра = МножествоСтрок.Получить(Параметр.Значение);
+
ДобавитьПараметр(фРезультат, ИмяПараметра, ЗначениеПараметра);
КонецЦикла;
@@ -1421,47 +1859,85 @@
Функция СтруктураИдентификатораРесурса(Знач ИдентификаторРесурса)
фРезультат = Новый Структура(
- "Сервер, АдресРесурса, Пользователь, Пароль, Порт, ЗащищенноеСоединение, Параметры",
+ "Сервер, Путь, Пользователь, Пароль, Порт, ЗащищенноеСоединение, Параметры, Фрагмент",
"", // Сервер
- "/", // АдресРесурса
+ "/", // Путь
"", // Пользователь
"", // Пароль
80, // Порт
Ложь, // ЗащищенноеСоединение
- Неопределено // Параметры
+ Неопределено, // Параметры
+ "" // Фрагмент
);
Если ТипЗнч(ИдентификаторРесурса) = Тип("Структура") Тогда
+ АдресРесурса = СоставляющиеАдресаРесурса(ИдентификаторРесурса.АдресРесурса);
фРезультат.Сервер = ИдентификаторРесурса.Сервер;
- фРезультат.АдресРесурса = ИдентификаторРесурса.АдресРесурса;
+ фРезультат.Путь = АдресРесурса.Путь;
фРезультат.Порт = ИдентификаторРесурса.Порт;
- фРезультат.Параметры = НовыеПараметрыЗапроса();
+ фРезультат.Параметры = АдресРесурса.Параметры;
фРезультат.ЗащищенноеСоединение = ИдентификаторРесурса.ЗащищенноеСоединение;
фРезультат.Пользователь = ИдентификаторРесурса.Пользователь;
фРезультат.Пароль = ИдентификаторРесурса.Пароль;
+ фРезультат.Фрагмент = АдресРесурса.Фрагмент;
Возврат фРезультат;
КонецЕсли;
ПозицияНачалаПоиска = ДлинаСхемыИдентификатораРесурса(фРезультат, ИдентификаторРесурса);
- ПозицияНачалаСтрокиПараметров = 0;
- РазобратьОснованиеИдентификатораРесурса(фРезультат, ИдентификаторРесурса, ПозицияНачалаПоиска, ПозицияНачалаСтрокиПараметров);
+ ПозицияСимволаПараметров = 0;
+ ПозицияСимволаФрагмента = 0;
+ РазобратьОснованиеИдентификатораРесурса(фРезультат, ИдентификаторРесурса, ПозицияНачалаПоиска, ПозицияСимволаПараметров, ПозицияСимволаФрагмента);
+
+ фРезультат.Параметры = ПараметрыИдентификатора(ИдентификаторРесурса, ПозицияСимволаПараметров, ПозицияСимволаФрагмента);
+ фРезультат.Фрагмент = ?(ПозицияСимволаФрагмента = 0, "", Сред(ИдентификаторРесурса, ПозицияСимволаФрагмента + 1));
+
+ Возврат фРезультат;
+КонецФункции
+
+Функция НовоеHTTPСоединениеСПереиспользованием(Конфигурация)
+ Перем фРезультат, ПереиспользоватьСоединение;
- фРезультат.Параметры = ПараметрыИдентификатора(ИдентификаторРесурса, ПозицияНачалаСтрокиПараметров);
+ Конфигурация.ДополнительныеПараметры.Свойство("ПереиспользоватьСоединение", ПереиспользоватьСоединение);
+ Если ЗначениеЗаполнено(ПереиспользоватьСоединение) И ПереиспользоватьСоединение = Истина Тогда
+ Если НЕ Конфигурация.ДополнительныеПараметры.Свойство("HTTPСоединение", фРезультат) Тогда
+ фРезультат = НовоеHTTPСоединение(Конфигурация.ДанныеURI, Конфигурация.ДополнительныеПараметры);
+ Конфигурация.ДополнительныеПараметры.Вставить("HTTPСоединение", фРезультат);
+ КонецЕсли;
+ Иначе
+ фРезультат = НовоеHTTPСоединение(Конфигурация.ДанныеURI, Конфигурация.ДополнительныеПараметры);
+ КонецЕсли;
Возврат фРезультат;
КонецФункции
Функция НовоеHTTPСоединение(Знач ДанныеURI, Знач ДополнительныеПараметры)
+ Перем СертификатК, СертификатыУЦ;
+
КонфигурацияСоединения = Новый Структура(
"Сервер, Порт",
ДанныеURI.Сервер,
?(ДополнительныеПараметры.Свойство("Порт"), ДополнительныеПараметры.Порт, ДанныеURI.Порт)
);
+ Если ДополнительныеПараметры.Свойство("СертификатК") Тогда
+ СертификатК = Новый СертификатКлиентаФайл(
+ ДополнительныеПараметры.СертификатК.Файл.ПолноеИмя,
+ ДополнительныеПараметры.СертификатК.Пароль
+ );
+ КонецЕсли;
+ Если ДополнительныеПараметры.Свойство("СертификатыУЦ") Тогда
+ СертификатыУЦ = Новый СертификатыУдостоверяющихЦентровФайл(
+ ДополнительныеПараметры.СертификатыУЦ.Файл.ПолноеИмя,
+ ДополнительныеПараметры.СертификатыУЦ.Пароль
+ );
+ КонецЕсли;
+
Если ДополнительныеПараметры.Свойство("ЗащищенноеСоединение") Тогда
КонфигурацияСоединения.Вставить("ЗащищенноеСоединение", ДополнительныеПараметры.ЗащищенноеСоединение);
+ ИначеЕсли СертификатК <> Неопределено Тогда
+ КонфигурацияСоединения.Вставить("ЗащищенноеСоединение", Новый ЗащищенноеСоединениеOpenSSL(СертификатК, СертификатыУЦ));
ИначеЕсли ДанныеURI.ЗащищенноеСоединение Тогда
КонфигурацияСоединения.Вставить("ЗащищенноеСоединение", Новый ЗащищенноеСоединениеOpenSSL);
КонецЕсли;
@@ -1489,18 +1965,18 @@
);
КонецФункции
-Функция ОбъединениеПараметровЗапросаВСтроку(Знач ПараметрыURI, Знач ПараметрыЗапроса)
- МножествоПараметров = Новый Соответствие;
+Функция ОбъединениеПараметровЗапроса(Знач ПараметрыURI, Знач ПараметрыЗапроса)
+ фРезультат = Новый Соответствие;
Для Каждого КЗ Из ПараметрыURI Цикл
- МножествоПараметров.Вставить(КЗ.Ключ, КЗ.Значение);
+ фРезультат.Вставить(КЗ.Ключ, КЗ.Значение);
КонецЦикла;
Для Каждого КЗ Из ПараметрыЗапроса Цикл
- МножествоПараметров.Вставить(КЗ.Ключ, КЗ.Значение);
+ фРезультат.Вставить(КЗ.Ключ, КЗ.Значение);
КонецЦикла;
- Возврат ПараметрыЗапросаСтрокой(МножествоПараметров);
+ Возврат фРезультат;
КонецФункции
Функция ЗаголовкиЗапроса(Знач ДанныеURI, ДополнительныеПараметры)
@@ -1516,6 +1992,8 @@
КонецЦикла;
КонецЕсли;
+ ДобавитьХостВЗаголовкиЗапроса(фРезультат, ДанныеURI);
+ ДобавитьАгентаПользователяВЗаголовкиЗапроса(фРезультат, ДополнительныеПараметры);
ДобавитьТипКонтентаВЗаголовкиЗапроса(фРезультат, ДополнительныеПараметры);
ДобавитьКодировкуВЗаголовкиЗапроса(фРезультат, ДополнительныеПараметры);
ДобавитьРазделительПолейФормыВЗаголовкиЗапроса(фРезультат, ДополнительныеПараметры);
@@ -1530,6 +2008,27 @@
Возврат ?(ДополнительныеПараметры.Свойство("ИмяВыходногоФайла"), ДополнительныеПараметры.ИмяВыходногоФайла, "");
КонецФункции
+Процедура ДобавитьХостВЗаголовкиЗапроса(Заголовки, Знач ДанныеURI)
+ Хост = КлиентHTTPСлужебный.НормализованныйАдресСервера(ДанныеURI.Сервер);
+
+ Заголовки.Вставить(КлиентHTTPПовтИсп.ЗаголовокХост(), ?(
+ ЗначениеЗаполнено(ДанныеURI.Порт)
+ И (ДанныеURI.ЗащищенноеСоединение И ДанныеURI.Порт <> 443
+ ИЛИ НЕ ДанныеURI.ЗащищенноеСоединение И ДанныеURI.Порт <> 80),
+ СтрШаблон("%1:%2", Хост, Формат(ДанныеURI.Порт, "ЧГ=")),
+ Хост
+ ));
+КонецПроцедуры
+
+Процедура ДобавитьАгентаПользователяВЗаголовкиЗапроса(Заголовки, Знач ДополнительныеПараметры)
+ Перем АгентПользователя;
+
+ ДополнительныеПараметры.Свойство("АгентПользователя", АгентПользователя);
+ Если ЗначениеЗаполнено(АгентПользователя) Тогда
+ Заголовки.Вставить(КлиентHTTPПовтИсп.ЗаголовокАгентПользователя(), АгентПользователя);
+ КонецЕсли;
+КонецПроцедуры
+
Процедура ДобавитьТипКонтентаВЗаголовкиЗапроса(Заголовки, Знач ДополнительныеПараметры)
Если ДополнительныеПараметры.Свойство("ТипMIME") Тогда
Заголовки.Вставить(КлиентHTTPПовтИсп.ЗаголовокТипКонтента(), ДополнительныеПараметры.ТипMIME);
@@ -1549,7 +2048,7 @@
Процедура ДобавитьСжатиеВЗаголовкиЗапроса(Заголовки, Знач ДополнительныеПараметры)
Если ДополнительныеПараметры.Свойство("СжатиеОтвета") Тогда
- Заголовки.Вставить("Accept-Encoding", ДополнительныеПараметры.СжатиеОтвета);
+ Заголовки.Вставить(КлиентHTTPПовтИсп.ЗаголовокДопустимыеСпособыКодированияОтвета(), ДополнительныеПараметры.СжатиеОтвета);
КонецЕсли;
КонецПроцедуры
@@ -1558,11 +2057,9 @@
Возврат;
КонецЕсли;
- Если ДополнительныеПараметры.Сессия.Свойство("Печенье") Тогда
- Печенье = ПеченьеДляURI(ДанныеURI, ДополнительныеПараметры.Сессия.Печенье);
- Если ЗначениеЗаполнено(Печенье) Тогда
- Заголовки.Вставить("Cookie", СтрСоединить(Печенье, "; "));
- КонецЕсли;
+ Значение = ЗначениеЗаголовкаCookie(ДанныеURI, ДополнительныеПараметры.Сессия);
+ Если ЗначениеЗаполнено(Значение) Тогда
+ Заголовки.Вставить(КлиентHTTPПовтИсп.ЗаголовокПеченье(), Значение);
КонецЕсли;
КонецПроцедуры
@@ -1581,6 +2078,10 @@
ДополнительныеПараметры.Вставить("АвторизоватьсяDigest");
ИначеЕсли ТипАутентификации = "Bearer" Тогда
ДобавитьBearerАутентификациюВЗаголовкиЗапроса(Заголовки, ДополнительныеПараметры.Аутентификация);
+ ИначеЕсли ТипАутентификации = "AWS4" Тогда
+ ЗарегистрироватьAWS4Аутентификацию(ДополнительныеПараметры);
+ ИначеЕсли ТипАутентификации = "Hawk" Тогда
+ ЗарегистрироватьHawkАутентификацию(ДополнительныеПараметры);
Иначе
ВызватьИсключение СтрШаблон("Неизвестный тип аутентификации: %1", ТипАутентификации);
КонецЕсли;
@@ -1589,7 +2090,7 @@
Процедура ДобавитьBasicАутентификациюВЗаголовкиЗапроса(Заголовки, Знач ДанныеАутентификации)
СтрокаАутентификации = КлиентHTTPСлужебный.СтрокаBasicАвторизации(ДанныеАутентификации.Пользователь, ДанныеАутентификации.Пароль);
- Заголовки.Вставить("Authorization", "Basic " + СтрокаАутентификации);
+ Заголовки.Вставить(КлиентHTTPПовтИсп.ЗаголовокТипАутентификации(), "Basic " + СтрокаАутентификации);
КонецПроцедуры
Процедура УстановитьNTLMАутентификацию(ДополнительныеПараметры, Знач ДанныеАутентификации)
@@ -1599,9 +2100,62 @@
КонецПроцедуры
Процедура ДобавитьBearerАутентификациюВЗаголовкиЗапроса(Заголовки, Знач ДанныеАутентификации)
- Заголовки.Вставить("Authorization", "Bearer " + ДанныеАутентификации.Пользователь);
+ Заголовки.Вставить(КлиентHTTPПовтИсп.ЗаголовокТипАутентификации(), "Bearer " + ДанныеАутентификации.Токен);
+КонецПроцедуры
+
+Процедура ЗарегистрироватьAWS4Аутентификацию(ДополнительныеПараметры)
+ ДополнительныеПараметры.Вставить("АвторизоватьсяAWS4", ДополнительныеПараметры.Аутентификация);
+КонецПроцедуры
+
+Процедура ЗарегистрироватьHawkАутентификацию(ДополнительныеПараметры)
+ ДополнительныеПараметры.Вставить("АвторизоватьсяHawk", ДополнительныеПараметры.Аутентификация);
КонецПроцедуры
+Процедура ПрименитьAWS4Аутентификацию(Знач Метод, Знач Данные, Конфигурация)
+ Если НЕ Конфигурация.ДополнительныеПараметры.Свойство("АвторизоватьсяAWS4") Тогда
+ Возврат;
+ КонецЕсли;
+
+ ДанныеАдресВХ = ПоместитьВоВременноеХранилище(?(Данные = Неопределено, "", Данные), Новый УникальныйИдентификатор);
+ Для Каждого Заголовок Из КлиентHTTPВызовСервера.ЗаголовкиAWS4(Метод, Конфигурация, ДанныеАдресВХ) Цикл
+ Конфигурация.Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
+ КонецЦикла;
+КонецПроцедуры
+
+Процедура ПрименитьHawkАутентификацию(Знач Метод, Знач Данные, Конфигурация, Контекст)
+ Если НЕ Конфигурация.ДополнительныеПараметры.Свойство("АвторизоватьсяHawk") Тогда
+ Возврат;
+ КонецЕсли;
+
+ ДанныеАдресВХ = ?(
+ Данные = Неопределено,
+ Неопределено,
+ ПоместитьВоВременноеХранилище(Данные, Новый УникальныйИдентификатор)
+ );
+
+ ЗначениеЗаголовкаHawk = КлиентHTTPВызовСервера.ЗаголовокHawk(Метод, Конфигурация, ДанныеАдресВХ);
+ Конфигурация.Заголовки.Вставить(КлиентHTTPПовтИсп.ЗаголовокТипАутентификации(), ЗначениеЗаголовкаHawk);
+
+ Контекст.Значения.Вставить("АутентификацияHawk", КонтекстАутентификацииHawk(Контекст, Конфигурация));
+КонецПроцедуры
+
+Функция КонтекстАутентификацииHawk(Контекст, Конфигурация)
+ Аутентификация = Конфигурация.ДополнительныеПараметры.АвторизоватьсяHawk;
+ Возврат Новый ФиксированнаяСтруктура(
+ "Ключ, Дополнение, ИдентификаторПриложения, Делегирование, Метод, Хост, Порт, Путь, ВременнаяМетка, РазовоеСлово",
+ Аутентификация.Ключ,
+ Аутентификация.Дополнение,
+ Аутентификация.ИдентификаторПриложения,
+ Аутентификация.Делегирование,
+ Контекст.Метод,
+ Конфигурация.ДанныеURI.Сервер,
+ Конфигурация.ДанныеURI.Порт,
+ Конфигурация.ДанныеURI.Путь,
+ Аутентификация.ВременнаяМетка,
+ Аутентификация.РазовоеСлово
+ );
+КонецФункции
+
Процедура ДобавитьРазделительПолейФормыВЗаголовкиЗапроса(Заголовки, Знач ДополнительныеПараметры)
ТекущееЗначение = Заголовки.Получить(КлиентHTTPПовтИсп.ЗаголовокТипКонтента());
@@ -1615,18 +2169,78 @@
Процедура ДобавитьРазмерДанныхВЗаголовкиЗапроса(Заголовки, Знач ДополнительныеПараметры, Знач Данные)
Если ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда
- Заголовки.Вставить("Content-Length", XMLСтрока(Данные.Размер()));
+ Заголовки.Вставить(КлиентHTTPПовтИсп.ЗаголовокРазмерКонтента(), XMLСтрока(Данные.Размер()));
ИначеЕсли ТипЗнч(Данные) = Тип("Строка") Тогда
Кодировка = КодировкаИзДопПараметров(ДополнительныеПараметры);
- Заголовки.Вставить("Content-Length", XMLСтрока(КлиентHTTPСлужебный.РазмерТекстовыхДанных(Данные, Кодировка)));
+ Заголовки.Вставить(
+ КлиентHTTPПовтИсп.ЗаголовокРазмерКонтента(),
+ XMLСтрока(КлиентHTTPСлужебный.РазмерТекстовыхДанных(Данные, Кодировка))
+ );
Иначе
ВызватьИсключение "Неизвестный тип данных: " + ТипЗнч(Данные);
КонецЕсли;
КонецПроцедуры
+Функция ПеренаправлениеЗапросаHTTP(Знач АдресПеренаправления, Знач Ответ, Знач Конфигурация, Знач КонтекстВыполнения)
+ Метод = КонтекстВыполнения.Метод;
+ Данные = КонтекстВыполнения.Данные;
+ Если (
+ Ответ.КодСостояния = КлиентHTTPПовтИсп.КодСостоянияПеремещен()
+ ИЛИ Ответ.КодСостояния = КлиентHTTPПовтИсп.КодСостоянияНайден()
+ ) И Конфигурация.ДополнительныеПараметры.Сессия.Свойство("ПеренаправлениеКакGET")
+ Тогда
+ Метод = КлиентHTTPПовтИсп.МетодGET();
+ Данные = Неопределено;
+
+ Конфигурация.Заголовки.Удалить(КлиентHTTPПовтИсп.ЗаголовокРазмерКонтента());
+ Конфигурация.Заголовки.Удалить(КлиентHTTPПовтИсп.ЗаголовокТипКонтента());
+ КонецЕсли;
+
+ Конфигурация.ДанныеURI = СтруктураИдентификатораРесурса(ИдентификаторРесурсаПеренаправления(АдресПеренаправления, Конфигурация.ДанныеURI));
+ Конфигурация.Параметры = ОбъединениеПараметровЗапроса(Конфигурация.ДанныеURI.Параметры, НовыеПараметрыЗапроса());
+ Конфигурация.ПараметрыСтрокой = ПараметрыЗапросаСтрокой(Конфигурация.Параметры);
+
+ ДобавитьХостВЗаголовкиЗапроса(Конфигурация.Заголовки, Конфигурация.ДанныеURI);
+ ДобавитьДанныеСессииВЗаголовкиЗапроса(Конфигурация.Заголовки, Конфигурация.ДанныеURI, Конфигурация.ДополнительныеПараметры);
+ СброситьСостояниеПовторногоВыполнения(Конфигурация.ДополнительныеПараметры);
+ ВыполнитьПаузуПередРедиректомПриНеобходимости(Ответ);
+
+ Возврат ВыполненныйЗапросHTTP(Метод, Конфигурация, Данные, КонтекстВыполнения.НомерПеренаправления + 1);
+КонецФункции
+
+Функция ОтложеноВыполненныйЗапросHTTP(Знач Ответ, Конфигурация, Знач КонтекстВыполнения)
+ Перем ПовторноеВыполнение;
+
+ Конфигурация.ДополнительныеПараметры.Свойство("ПовторноеВыполнение", ПовторноеВыполнение);
+
+ Если Ответ = Неопределено И ПовторноеВыполнение = Неопределено Тогда
+ ВызватьИсключение ?(
+ КонтекстВыполнения.Свойство("ИнформацияОбОшибке"),
+ ОбработкаОшибок.КраткоеПредставлениеОшибки(КонтекстВыполнения.ИнформацияОбОшибке),
+ "Превышено количетво попыток выполнения запроса"
+ );
+ КонецЕсли;
+
+ ПовторноеВыполнение.ОсталосьПопыток = ПовторноеВыполнение.ОсталосьПопыток - 1;
+ Если ПовторноеВыполнение.ОсталосьПопыток < 1 Тогда
+ ВызватьИсключение "Превышено количетво попыток выполнения запроса";
+ КонецЕсли;
+
+ ДлительностьПаузы = ДлительностьПаузыОтложеногоВыполнения(ПовторноеВыполнение, Ответ);
+ Если ДлительностьПаузы >= 1 Тогда
+ КлиентHTTPВызовСервера.ПаузаПередПовторнымВыполнением(ДлительностьПаузы, ПовторноеВыполнение.Ключ);
+ КонецЕсли;
+
+ Возврат ВыполненныйЗапросHTTP(КонтекстВыполнения.Метод, Конфигурация, КонтекстВыполнения.Данные, КонтекстВыполнения.НомерПеренаправления);
+КонецФункции
+
Функция ОбработанныйОтвет(Знач Ответ, Знач Конфигурация, Знач КонтекстВыполнения)
+ Если ТребуетсяПовторноеВыполнение(Ответ, Конфигурация.ДополнительныеПараметры) Тогда
+ Возврат ОтложеноВыполненныйЗапросHTTP(Ответ, Конфигурация, КонтекстВыполнения);
+ КонецЕсли;
+
Если НЕ Конфигурация.ДополнительныеПараметры.Свойство("Сессия") Тогда
- Возврат ОбъектОбработанногоОтвета(Ответ, Конфигурация.ДополнительныеПараметры);
+ Возврат ОбъектОбработанногоОтвета(Ответ, Конфигурация.ДополнительныеПараметры, КонтекстВыполнения);
КонецЕсли;
Печенье = ЗначениеЗаголовка(КлиентHTTPПовтИсп.ЗаголовокОтветаСПеченьем(), Ответ.Заголовки);
@@ -1643,44 +2257,87 @@
КонецЕсли;
Сессия = Конфигурация.ДополнительныеПараметры.Сессия;
- НовыйИдентификаторРесурса = ИдентификаторПеренаправления(Ответ.КодСостояния, Ответ.Заголовки);
- Если ЗначениеЗаполнено(НовыйИдентификаторРесурса) И КонтекстВыполнения.НомерПеренаправления <= Сессия.ПорогПеренаправлений Тогда
- Конфигурация.ДанныеURI = СтруктураИдентификатораРесурса(НовыйИдентификаторРесурса);
- Конфигурация.Параметры = ОбъединениеПараметровЗапросаВСтроку(Конфигурация.ДанныеURI.Параметры, НовыеПараметрыЗапроса());
-
- Возврат ВыполнитьЗапросHTTP(КонтекстВыполнения.Метод, Конфигурация, КонтекстВыполнения.Данные, КонтекстВыполнения.НомерПеренаправления + 1);
+ АдресПеренаправления = АдресПеренаправленияИзЗаголовков(Ответ.КодСостояния, Ответ.Заголовки);
+ Если ЗначениеЗаполнено(АдресПеренаправления) И КонтекстВыполнения.НомерПеренаправления <= Сессия.ПорогПеренаправлений Тогда
+ Возврат ПеренаправлениеЗапросаHTTP(АдресПеренаправления, Ответ, Конфигурация, КонтекстВыполнения);
КонецЕсли;
Если Ответ.КодСостояния = КлиентHTTPПовтИсп.КодСостоянияНеАвторизовано() И Конфигурация.ДополнительныеПараметры.Свойство("АвторизоватьсяDigest") Тогда
- РецептАвторизации = ЗначениеЗаголовка("WWW-Authenticate", Ответ.Заголовки);
+ РецептАвторизации = ЗначениеЗаголовка(КлиентHTTPПовтИсп.ЗаголовокОтветаМетодыАутентификации(), Ответ.Заголовки);
Если СтрНачинаетсяС(НРег(РецептАвторизации), "digest") Тогда
+ СброситьСостояниеПовторногоВыполнения(Конфигурация.ДополнительныеПараметры);
+
КонтекстВыполненияАдресВХ = ПоместитьВоВременноеХранилище(КонтекстВыполнения, Новый УникальныйИдентификатор);
Конфигурация.ДополнительныеПараметры.Удалить("АвторизоватьсяDigest");
Сессия.Вставить("ПараметрыDigest", ПараметрыDigest(РецептАвторизации));
- Конфигурация.Заголовки.Вставить("Authorization", КлиентHTTPВызовСервера.ЗаголовокDigest(Конфигурация, КонтекстВыполненияАдресВХ));
+ Конфигурация.Заголовки.Вставить(
+ КлиентHTTPПовтИсп.ЗаголовокТипАутентификации(),
+ КлиентHTTPВызовСервера.ЗаголовокDigest(Конфигурация, КонтекстВыполненияАдресВХ)
+ );
- Возврат ВыполнитьЗапросHTTP(КонтекстВыполнения.Метод, Конфигурация, КонтекстВыполнения.Данные, КонтекстВыполнения.НомерПеренаправления + 1);
+ Возврат ВыполненныйЗапросHTTP(КонтекстВыполнения.Метод, Конфигурация, КонтекстВыполнения.Данные, КонтекстВыполнения.НомерПеренаправления + 1);
КонецЕсли;
КонецЕсли;
- Возврат ОбъектОбработанногоОтвета(Ответ, Конфигурация.ДополнительныеПараметры);
+ Возврат ОбъектОбработанногоОтвета(Ответ, Конфигурация.ДополнительныеПараметры, КонтекстВыполнения);
КонецФункции
-Функция ОбъектОбработанногоОтвета(Знач Ответ, Знач ДополнительныеПараметры)
+Функция ОбъектОбработанногоОтвета(Знач Ответ, Знач ДополнительныеПараметры, Знач КонтекстВыполнения)
#Если Клиент Тогда
- Возврат КлиентHTTPКлиент.ОбъектОбработанногоОтвета(Ответ, ДополнительныеПараметры);
+ Возврат КлиентHTTPКлиент.ОбъектОбработанногоОтвета(Ответ, ДополнительныеПараметры, КонтекстВыполнения);
#Иначе
- Возврат КлиентHTTP.ОбъектОбработанногоОтвета(Ответ, ДополнительныеПараметры);
+ Возврат КлиентHTTP.ОбъектОбработанногоОтвета(Ответ, ДополнительныеПараметры, КонтекстВыполнения);
#КонецЕсли
КонецФункции
+Функция ОбъектТелаОтветаИзJSON(Знач ДанныеТелаОтвета, Знач Кодировка, Знач СпособЧтения)
+ Если ДанныеТелаОтвета.Размер() = 0 Тогда
+ Возврат Неопределено;
+ КонецЕсли;
+
+ Чтение = Новый ЧтениеJSON;
+ Чтение.ОткрытьПоток(ДанныеТелаОтвета.ОткрытьПотокДляЧтения(), Кодировка);
+
+ фРезультат = ПрочитатьJSON(
+ Чтение,
+ СпособЧтения.Параметры.ПрочитатьВСоответствие,
+ СпособЧтения.Параметры.ИменаСвойствСоЗначениямиДата,
+ СпособЧтения.Параметры.ОжидаемыйФорматДаты,
+ СпособЧтения.Параметры.ИмяФункцииВосстановления,
+ СпособЧтения.Параметры.МодульФункцииВосстановления,
+ СпособЧтения.Параметры.ДополнительныеПараметрыФункцииВосстановления,
+ СпособЧтения.Параметры.ИменаСвойствДляВосстановления,
+ СпособЧтения.Параметры.МаксимальнаяВложенность
+ );
+
+ Чтение.Закрыть();
+
+ Возврат фРезультат;
+КонецФункции
+
+Функция ОбъектТелаОтветаИзXML(Знач ДанныеТелаОтвета, Знач Кодировка, Знач СпособЧтения)
+ Если ДанныеТелаОтвета.Размер() = 0 Тогда
+ Возврат Неопределено;
+ КонецЕсли;
+
+ Фабрика = Новый ФабрикаXDTO(СпособЧтения.Параметры.НаборСхемXML, СпособЧтения.Параметры.Пакеты);
+
+ Чтение = Новый ЧтениеXML;
+ Чтение.ОткрытьПоток(ДанныеТелаОтвета.ОткрытьПотокДляЧтения(), СпособЧтения.Параметры.ПараметрыЧтенияXML, , Кодировка);
+ фРезультат = Фабрика.ПрочитатьXML(Чтение);
+
+ Чтение.Закрыть();
+
+ Возврат фРезультат;
+КонецФункции
+
Функция ПеченьеДляURI(Знач ДанныеURI, Знач Печенье)
фРезультат = Новый Массив;
Получатель = КлиентHTTPСлужебный.НормализованныйАдресСервера(ДанныеURI.Сервер);
ДатаЗапроса = КлиентHTTPВызовСервера.ТекущаяУниверсальнаяДатаНаСервере();
- ВзятьПеченье(фРезультат, Печенье, Получатель, ДатаЗапроса, ДанныеURI.АдресРесурса, ДанныеURI.ЗащищенноеСоединение);
+ ВзятьПеченье(фРезультат, Печенье, Получатель, ДатаЗапроса, ДанныеURI.Путь, ДанныеURI.ЗащищенноеСоединение);
Если фРезультат.Количество() > 0 Тогда
Возврат Новый ФиксированныйМассив(фРезультат);
КонецЕсли;
@@ -1689,7 +2346,7 @@
Пока Части.Количество() > 1 Цикл
Получатель = "." + СтрСоединить(Части, ".");
- ВзятьПеченье(фРезультат, Печенье, Получатель, ДатаЗапроса, ДанныеURI.АдресРесурса, ДанныеURI.ЗащищенноеСоединение);
+ ВзятьПеченье(фРезультат, Печенье, Получатель, ДатаЗапроса, ДанныеURI.Путь, ДанныеURI.ЗащищенноеСоединение);
Если фРезультат.Количество() > 0 Тогда
Прервать;
КонецЕсли;
@@ -1700,9 +2357,9 @@
Возврат Новый ФиксированныйМассив(фРезультат);
КонецФункции
-Процедура ВзятьПеченье(ПеченьеПолучателя, Печенье, Знач Получатель, Знач ДатаЗапроса, Знач АдресРесурса, Знач ЗащищенноеСоединение)
+Процедура ВзятьПеченье(ПеченьеПолучателя, Печенье, Знач Получатель, Знач ДатаЗапроса, Знач Путь, Знач ЗащищенноеСоединение)
ИмяСрок = КлиентHTTPПовтИсп.СвойствоПеченькаСрок();
- ИмяАдресРесурса = КлиентHTTPПовтИсп.СвойствоПеченькаАдресРесурса();
+ ИмяПуть = КлиентHTTPПовтИсп.СвойствоПеченькаАдресРесурса();
ИмяЗащищенноеСоединение = КлиентHTTPПовтИсп.СвойствоПеченькаЗащищенноеСоединение();
Печеньки = Печенье.Получить(Получатель);
@@ -1718,7 +2375,7 @@
ПеченькиНаУдаление.Добавить(КЗ.Ключ);
Продолжить;
КонецЕсли;
- Если Печенька.Свойство(ИмяАдресРесурса) И НЕ СтрНачинаетсяС(АдресРесурса, Печенька[ИмяАдресРесурса]) Тогда
+ Если Печенька.Свойство(ИмяПуть) И НЕ СтрНачинаетсяС(Путь, Печенька[ИмяПуть]) Тогда
Продолжить;
КонецЕсли;
Если Печенька.Свойство(ИмяЗащищенноеСоединение) И НЕ ЗащищенноеСоединение Тогда
@@ -1754,15 +2411,49 @@
КонецЦикла;
КонецПроцедуры
+Функция ЗначениеЗаголовкаCookie(Знач ДанныеURI, Знач Сессия)
+ Если НЕ Сессия.Свойство("Печенье") Тогда
+ Возврат Неопределено;
+ КонецЕсли;
+
+ Печенье = ПеченьеДляURI(ДанныеURI, Сессия.Печенье);
+
+ Возврат ?(ЗначениеЗаполнено(Печенье), СтрСоединить(Печенье, "; "), "");
+КонецФункции
+
Функция АдресРесурсаЗапроса(Знач Конфигурация)
- Возврат Конфигурация.ДанныеURI.АдресРесурса + Конфигурация.Параметры;
+ Возврат Конфигурация.ДанныеURI.Путь +
+ Конфигурация.ПараметрыСтрокой +
+ ?(ПустаяСтрока(Конфигурация.ДанныеURI.Фрагмент), "", "#") +
+ Конфигурация.ДанныеURI.Фрагмент;
КонецФункции
-Функция ИдентификаторПеренаправления(Знач КодСостояния, Знач Заголовки)
+Функция АдресПеренаправленияИзЗаголовков(Знач КодСостояния, Знач Заголовки)
Возврат ?(
КлиентHTTPПовтИсп.КодыСостоянияПеренаправления().Получить(КодСостояния) = Неопределено,
Неопределено,
- КлиентHTTPВызовСервера.РаскодированныйИдентификаторРесурса(ЗначениеЗаголовка(КлиентHTTPПовтИсп.ЗаголовокОтветаПеренаправление(), Заголовки))
+ КлиентHTTPВызовСервера.РаскодированныйИдентификаторРесурса(СокрЛП(ЗначениеЗаголовка(КлиентHTTPПовтИсп.ЗаголовокОтветаПеренаправление(), Заголовки)))
+ );
+КонецФункции
+
+Функция ИдентификаторРесурсаПеренаправления(Знач АдресПеренаправления, Знач ДанныеURI)
+ Если СтрНачинаетсяС(АдресПеренаправления, "https://") ИЛИ СтрНачинаетсяС(АдресПеренаправления, "http://") Тогда
+ Возврат АдресПеренаправления;
+ КонецЕсли;
+
+ СхемаИОбращение =
+ СхемаЗапроса(ДанныеURI) +
+ ДанныеURI.Сервер +
+ ?(
+ ДанныеURI.ЗащищенноеСоединение И ДанныеURI.Порт = 443 ИЛИ НЕ ДанныеURI.ЗащищенноеСоединение И ДанныеURI.Порт = 80,
+ "",
+ ":" + XMLСтрока(ДанныеURI.Порт)
+ );
+
+ Возврат СхемаИОбращение + ?(
+ СтрНачинаетсяС(АдресПеренаправления, "/"),
+ АдресПеренаправления,
+ Лев(ДанныеURI.Путь, СтрНайти(ДанныеURI.Путь, "/", НаправлениеПоиска.СКонца)) + АдресПеренаправления
);
КонецФункции
@@ -1770,6 +2461,26 @@
Возврат Новый ФиксированнаяСтруктура("Тип, Пользователь, Пароль", Тип, Пользователь, Пароль);
КонецФункции
+Функция ОбъектАутентификацииBearer(Знач Токен)
+ Возврат Новый ФиксированнаяСтруктура("Тип, Токен", "Bearer", Токен);
+КонецФункции
+
+Функция ОбъектАутентификацииAWS4(Знач КлючДоступа, Знач СекретныйКлюч, Знач Регион, Знач Сервис)
+ Возврат Новый ФиксированнаяСтруктура("Тип, КлючДоступа, СекретныйКлюч, Регион, Сервис", "AWS4", КлючДоступа, СекретныйКлюч, Регион, Сервис);
+КонецФункции
+
+Функция ОбъектАутентификацииHawk(Знач Идентификатор, Знач Ключ, Знач Дополнение, Знач ИдентификаторПриложения, Знач Делегирование)
+ Возврат Новый ФиксированнаяСтруктура(
+ "Тип, Идентификатор, Ключ, Дополнение, ИдентификаторПриложения, Делегирование",
+ "Hawk",
+ Идентификатор,
+ Ключ,
+ Дополнение,
+ ИдентификаторПриложения,
+ Делегирование
+ );
+КонецФункции
+
Функция ПараметрыDigest(Знач РецептАвторизации)
фРезультат = Новый Структура("algorithm, realm, nonce, qop, opaque");
@@ -1782,18 +2493,97 @@
Возврат фРезультат;
КонецФункции
-Функция ФорматированноеИмяПараметраЗапроса(Знач Имя)
- Возврат СтрЗаменить(ФорматированноеЗначениеПараметраЗапроса(Имя), "=", "%3D");
+Функция СпособЧтенияТелаОтвета(Знач Формат, Знач Параметры = Неопределено)
+ Возврат Новый Структура("Формат, Параметры", Формат, Параметры);
КонецФункции
-Функция ФорматированноеЗначениеПараметраЗапроса(Знач Значение)
- Возврат СтрЗаменить(СтрЗаменить(СтрЗаменить(Значение, Символы.ПС, ""), "#", "%23"), "&", "%26");
+Функция ТребуетсяПовторноеВыполнение(Знач Ответ, Знач ДополнительныеПараметры)
+ Если Ответ = Неопределено Тогда
+ Возврат Истина;
+ КонецЕсли;
+
+ Если НЕ ДополнительныеПараметры.Свойство("ПовторноеВыполнение") Тогда
+ Возврат Ложь;
+ КонецЕсли;
+
+ Возврат Ответ.КодСостояния >= КлиентHTTPПовтИсп.КодСостоянияВнутренняяОшибкаСервера()
+ ИЛИ ДополнительныеПараметры.ПовторноеВыполнение.КодыСостояния.Получить(Ответ.КодСостояния) <> Неопределено;
КонецФункции
-Функция СпособЧтенияТелаОтвета(Знач Формат, Знач Параметры = Неопределено)
- Возврат Новый Структура("Формат, Параметры", Формат, Параметры);
+Функция НовыйКлючПовторногоВыполнения()
+ Возврат "http_client_retry_" + XMLСтрока(Новый УникальныйИдентификатор);
КонецФункции
+Процедура СброситьСостояниеПовторногоВыполнения(ДополнительныеПараметры)
+ Если НЕ ДополнительныеПараметры.Свойство("ПовторноеВыполнение") Тогда
+ Возврат;
+ КонецЕсли;
+
+ ПВ = ДополнительныеПараметры.ПовторноеВыполнение;
+ ПВ.Ключ = НовыйКлючПовторногоВыполнения();
+ ПВ.ОсталосьПопыток = ПВ.ПорогКоличестваПопыток;
+КонецПроцедуры
+
+Функция ДлительностьПаузыОтложеногоВыполнения(Знач Параметры, Знач Ответ)
+ ЗаголовокПовторитьПосле = ?(
+ Ответ = Неопределено ИЛИ КлиентHTTPПовтИсп.КодыСостоянияЧтенияЗаголовкаОтложенногоВыполнения().Получить(Ответ.КодСостояния) = Неопределено,
+ Неопределено,
+ ЗначениеЗаголовка(КлиентHTTPПовтИсп.ЗаголовокОтветаПовторитьПосле(), Ответ.Заголовки)
+ );
+ Если ЗаголовокПовторитьПосле <> Неопределено Тогда
+ Возврат ДлительностьПаузыЗаголовкаОтвета(ЗаголовокПовторитьПосле);
+ КонецЕсли;
+
+ НомерПопытки = Параметры.ПорогКоличестваПопыток - Параметры.ОсталосьПопыток;
+ фРезультат = 0;
+
+ Если Параметры.Способ = СпособУвеличенияЛинейно() Тогда
+ фРезультат = Параметры.НачальнаяДлительность + Параметры.КоэфициентУвеличения * Параметры.НачальнаяДлительность * (НомерПопытки - 1);
+ ИначеЕсли Параметры.Способ = СпособБезУвеличения() Тогда
+ фРезультат = Параметры.Длительность;
+ ИначеЕсли Параметры.Способ = СпособУвеличенияЭкспоненциально() Тогда
+ фРезультат = Параметры.НачальнаяДлительность * Pow(Параметры.КоэфициентУвеличения, НомерПопытки - 1);
+ КонецЕсли;
+
+ Возврат КорректнаяДлительностьПаузы(Мин(Параметры.МаксимальнаяДлительность, фРезультат));
+КонецФункции
+
+Функция ДлительностьПаузыЗаголовкаОтвета(Знач ЗначениеЗаголовка)
+ ОписаниеТипаЧисло = Новый ОписаниеТипов("Число");
+ Ошибка = Ложь;
+ ДатаЗаголовка = КлиентHTTPСлужебный.ДатаИзHTTP(ЗначениеЗаголовка, Ошибка);
+
+ Возврат КорректнаяДлительностьПаузы(?(
+ Ошибка,
+ ОписаниеТипаЧисло.ПривестиЗначение(ДатаЗаголовка),
+ Мин(0, Макс(0, ДатаЗаголовка - КлиентHTTPВызовСервера.ТекущаяУниверсальнаяДатаНаСервере()))
+ ));
+КонецФункции
+
+Функция КорректныйПорогКоличестваПопыток(Знач ПорогКоличестваПопыток)
+ Возврат ?(ПорогКоличестваПопыток < 1, 1, Мин(99, ПорогКоличестваПопыток));
+КонецФункции
+
+Функция КорректнаяДлительностьПаузы(Знач Длительность)
+ Возврат ?(Длительность < 0, 0, Мин(КлиентHTTPПовтИсп.МаксимальноДопустимаяДлительностьПаузы(), Цел(Длительность)));
+КонецФункции
+
+Процедура ВыполнитьПаузуПередРедиректомПриНеобходимости(Знач Ответ)
+ Если Ответ.КодСостояния <> КлиентHTTPПовтИсп.КодСостоянияПеремещен() Тогда
+ Возврат;
+ КонецЕсли;
+
+ ЗаголовокПовторитьПосле = ЗначениеЗаголовка(КлиентHTTPПовтИсп.ЗаголовокОтветаПовторитьПосле(), Ответ.Заголовки);
+ Если ЗаголовокПовторитьПосле = Неопределено Тогда
+ Возврат;
+ КонецЕсли;
+
+ ДлительностьПаузы = ДлительностьПаузыЗаголовкаОтвета(ЗаголовокПовторитьПосле);
+ Если ДлительностьПаузы > 0 Тогда
+ КлиентHTTPВызовСервера.ПаузаПередПовторнымВыполнением(ДлительностьПаузы, НовыйКлючПовторногоВыполнения());
+ КонецЕсли;
+КонецПроцедуры
+
Функция ПараметрыЧтенияJSON(
Знач ПрочитатьВСоответствие = Ложь,
Знач ИменаСвойствСоЗначениямиДата = Неопределено,
@@ -1892,4 +2682,16 @@
Функция ФорматТелаОтветаXML()
Возврат "xml";
КонецФункции
+
+Функция СпособБезУвеличения()
+ Возврат "Фиксировано";
+КонецФункции
+
+Функция СпособУвеличенияЛинейно()
+ Возврат "Линейно";
+КонецФункции
+
+Функция СпособУвеличенияЭкспоненциально()
+ Возврат "Экспоненциально";
+КонецФункции
#КонецОбласти
diff --git "a/src/v2/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Ext/Module.bsl" "b/src/v2/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Ext/Module.bsl"
index 86bd2c4..54fba4b 100644
--- "a/src/v2/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Ext/Module.bsl"
+++ "b/src/v2/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Ext/Module.bsl"
@@ -96,7 +96,7 @@
308 // ПеренаправлениеНаПостояннойОснове
),
Новый ФиксированнаяСтруктура( // Клиентские
- "ПлохойЗапрос, НеАвторизовано, НеобходимаОплата, Запрещено, НеНайден, МетодНеРазрешен, НеПриемлемо, НеАвторизованоПрокси, Таймаут, Конфликт, Удалено, ТребуетсяРазмерКонтента, НевыполнимыеУсловия, ПревышенЛимитТела, ПревышенаДлинаURI, ТипМедиаНеПоддерживается, ДиапазонНеМожетБытьВыполнен, ОжиданиеНеМожетБытьВыполнено, Чайник, ТаймаутАвторизации, Мисдирект, НеобрабатываемыйЭкземпляр, Заблокировано, НевыполненнаяЗависимость, НеобходимоОбновление, НеобходимоПредусловие, СлишкомМногоЗапросов, ПоляЗаголовкаСлишкомБольшие, НедостаточноИнформации, НедоступноПоЮридическимПричинам, КлиентЗакрылСоединение",
+ "ПлохойЗапрос, НеАвторизовано, НеобходимаОплата, Запрещено, НеНайден, МетодНеРазрешен, НеПриемлемо, НеАвторизованоПрокси, Таймаут, Конфликт, Удалено, ТребуетсяРазмерКонтента, НевыполнимыеУсловия, ПревышенЛимитТела, ПревышенаДлинаURI, ТипМедиаНеПоддерживается, ДиапазонНеМожетБытьВыполнен, ОжиданиеНеМожетБытьВыполнено, Чайник, ТаймаутАвторизации, Мисдирект, НеобрабатываемыйЭкземпляр, Заблокировано, НевыполненнаяЗависимость, СлишкомРано, НеобходимоОбновление, НеобходимоПредусловие, СлишкомМногоЗапросов, ПоляЗаголовкаСлишкомБольшие, НедостаточноИнформации, НедоступноПоЮридическимПричинам, КлиентЗакрылСоединение",
400, // ПлохойЗапрос
401, // НеАвторизовано
402, // НеобходимаОплата
@@ -200,6 +200,15 @@
Возврат КлиентHTTPПовтИсп.КодыСостояния().Перенаправления.Найден;
КонецФункции
+// Возвращает код состояния HTTP-сервера 303
+//
+// Возвращаемое значение:
+// Число - код состояния
+//
+Функция КодСостоянияПросмотрДругихРесурсов() Экспорт
+ Возврат КлиентHTTPПовтИсп.КодыСостояния().Перенаправления.ПросмотрДругихРесурсов;
+КонецФункции
+
// Возвращает код состояния HTTP-сервера 307
//
// Возвращаемое значение:
@@ -209,6 +218,15 @@
Возврат КлиентHTTPПовтИсп.КодыСостояния().Перенаправления.ВременноеПеренаправление;
КонецФункции
+// Возвращает код состояния HTTP-сервера 308
+//
+// Возвращаемое значение:
+// Число - код состояния
+//
+Функция КодСостоянияПеренаправление() Экспорт
+ Возврат КлиентHTTPПовтИсп.КодыСостояния().Перенаправления.ПеренаправлениеНаПостояннойОснове;
+КонецФункции
+
// Возвращает код состояния HTTP-сервера 400
//
// Возвращаемое значение:
@@ -290,6 +308,15 @@
Возврат КлиентHTTPПовтИсп.КодыСостояния().Клиентские.Чайник;
КонецФункции
+// Возвращает код состояния HTTP-сервера 429
+//
+// Возвращаемое значение:
+// Число - код состояния
+//
+Функция КодСостоянияСлишкомМногоЗапросов() Экспорт
+ Возврат КлиентHTTPПовтИсп.КодыСостояния().Клиентские.СлишкомМногоЗапросов;
+КонецФункции
+
// Возвращает код состояния HTTP-сервера 500
//
// Возвращаемое значение:
@@ -345,9 +372,23 @@
фРезультат = Новый Соответствие;
фРезультат.Вставить(КлиентHTTPПовтИсп.КодСостоянияПеремещен(), Истина);
фРезультат.Вставить(КлиентHTTPПовтИсп.КодСостоянияНайден(), Истина);
- фРезультат.Вставить(КлиентHTTPПовтИсп.КодыСостояния().Перенаправления.ПросмотрДругихРесурсов, Истина);
+ фРезультат.Вставить(КлиентHTTPПовтИсп.КодСостоянияПросмотрДругихРесурсов(), Истина);
фРезультат.Вставить(КлиентHTTPПовтИсп.КодСостоянияВременноеПеренаправление(), Истина);
- фРезультат.Вставить(КлиентHTTPПовтИсп.КодыСостояния().Перенаправления.ПеренаправлениеНаПостояннойОснове, Истина);
+ фРезультат.Вставить(КлиентHTTPПовтИсп.КодСостоянияПеренаправление(), Истина);
+
+ Возврат Новый ФиксированноеСоответствие(фРезультат);
+КонецФункции
+
+// Возвращает множество кодов состояния HTTP-сервера, требующих чтения заголовка ответа Retry-After
+//
+// Возвращаемое значение:
+// ФиксированноеСоответствие - ключи: коды состояния
+//
+Функция КодыСостоянияЧтенияЗаголовкаОтложенногоВыполнения() Экспорт
+ фРезультат = Новый Соответствие;
+ фРезультат.Вставить(КлиентHTTPПовтИсп.КодСостоянияСервисНедоступен(), Истина);
+ фРезультат.Вставить(КлиентHTTPПовтИсп.КодСостоянияСлишкомМногоЗапросов(), Истина);
+ фРезультат.Вставить(КлиентHTTPПовтИсп.КодСостоянияПеремещен(), Истина);
Возврат Новый ФиксированноеСоответствие(фРезультат);
КонецФункции
@@ -530,6 +571,15 @@
Возврат КлиентHTTPПовтИсп.ТипыMIME().text.xml;
КонецФункции
+// Возвращает MIME-тип application/xml
+//
+// Возвращаемое значение:
+// Строка - MIME-тип
+//
+Функция ТипMIMEApplicationXML() Экспорт
+ Возврат КлиентHTTPПовтИсп.ТипыMIME().application.xml;
+КонецФункции
+
// Возвращает MIME-тип text/html
//
// Возвращаемое значение:
@@ -703,7 +753,7 @@
Возврат Новый ФиксированноеСоответствие(фРезультат);
КонецФункции
-// Возвращает кодировку по умолчанию для HTTP-клиента
+// Возвращает кодировку по умолчанию для HTTP-клиента (UTF-8)
//
// Возвращаемое значение:
// Строка - кодировка
@@ -748,6 +798,15 @@
Возврат "UTF-32";
КонецФункции
+// Возвращает кодировку ISO-8859-1
+//
+// Возвращаемое значение:
+// Строка - кодировка
+//
+Функция КодировкаISO8859() Экспорт
+ Возврат "ISO-8859-1";
+КонецФункции
+
// Возвращает кодировку CESU-8
//
// Возвращаемое значение:
@@ -793,6 +852,24 @@
Возврат "cp866";
КонецФункции
+// Возвращает имя заголовка, содержащего хост сервера
+//
+// Возвращаемое значение:
+// Строка - имя заголовка
+//
+Функция ЗаголовокХост() Экспорт
+ Возврат "Host";
+КонецФункции
+
+// Возвращает имя заголовка, содержащего характеристику пользовательского агента
+//
+// Возвращаемое значение:
+// Строка - имя заголовка
+//
+Функция ЗаголовокАгентПользователя() Экспорт
+ Возврат "User-Agent";
+КонецФункции
+
// Возвращает имя заголовка, содержащего тип контента
//
// Возвращаемое значение:
@@ -802,6 +879,42 @@
Возврат "Content-Type";
КонецФункции
+// Возвращает имя заголовка, содержащего размер контента
+//
+// Возвращаемое значение:
+// Строка - имя заголовка
+//
+Функция ЗаголовокРазмерКонтента() Экспорт
+ Возврат "Content-Length";
+КонецФункции
+
+// Возвращает имя заголовка, содержащего данные аутентификации
+//
+// Возвращаемое значение:
+// Строка - имя заголовка
+//
+Функция ЗаголовокТипАутентификации() Экспорт
+ Возврат "Authorization";
+КонецФункции
+
+// Возвращает имя заголовка, содержащего допустимые для клиента способы кодирования тела ответа (обычно, это алгоритмы сжатия)
+//
+// Возвращаемое значение:
+// Строка - имя заголовка
+//
+Функция ЗаголовокДопустимыеСпособыКодированияОтвета() Экспорт
+ Возврат "Accept-Encoding";
+КонецФункции
+
+// Возвращает имя заголовка с Cookie
+//
+// Возвращаемое значение:
+// Строка - имя заголовка
+//
+Функция ЗаголовокПеченье() Экспорт
+ Возврат "Cookie";
+КонецФункции
+
// Возвращает имя заголовка ответа с Cookie
//
// Возвращаемое значение:
@@ -829,6 +942,24 @@
Возврат "Location";
КонецФункции
+// Возвращает имя заголовка ответа с доступными типами аутентификации
+//
+// Возвращаемое значение:
+// Строка - имя заголовка
+//
+Функция ЗаголовокОтветаМетодыАутентификации() Экспорт
+ Возврат "WWW-Authenticate";
+КонецФункции
+
+// Возвращает имя заголовка ответа с датой повторного выполнения или длительностью паузы до повторного выполнения
+//
+// Возвращаемое значение:
+// Строка - имя заголовка
+//
+Функция ЗаголовокОтветаПовторитьПосле() Экспорт
+ Возврат "Retry-After";
+КонецФункции
+
// Возвращает дату, называемую эпохой Unix
//
// Возвращаемое значение:
@@ -837,6 +968,112 @@
Функция ЭпохаUnix() Экспорт
Возврат Дата(1970, 1, 1);
КонецФункции
+
+// Возвращает AWS сервис S3
+//
+// Возвращаемое значение:
+// Строка - сервис
+//
+Функция СервисAWSS3() Экспорт
+ Возврат "s3";
+КонецФункции
+
+// Возвращает адресный перечень регионов AWS
+//
+// Возвращаемое значение:
+// ФиксированнаяСтруктура - ключи: константы регионов AWS
+//
+Функция РегионыAWS() Экспорт
+ фРезультат = Новый Структура;
+
+ Регионы = Новый Массив;
+ Регионы.Добавить("RU_1");
+ Регионы.Добавить("RU_MSK");
+ Регионы.Добавить("RU_CENTRAL1");
+ Регионы.Добавить("AF_SOUTH_1");
+ Регионы.Добавить("AP_EAST_1");
+ Регионы.Добавить("AP_NORTHEAST_1");
+ Регионы.Добавить("AP_NORTHEAST_2");
+ Регионы.Добавить("AP_NORTHEAST_3");
+ Регионы.Добавить("AP_SOUTH_1");
+ Регионы.Добавить("AP_SOUTH_2");
+ Регионы.Добавить("AP_SOUTHEAST_1");
+ Регионы.Добавить("AP_SOUTHEAST_2");
+ Регионы.Добавить("AP_SOUTHEAST_3");
+ Регионы.Добавить("AP_SOUTHEAST_4");
+ Регионы.Добавить("AWS_CN_GLOBAL");
+ Регионы.Добавить("AWS_GLOBAL");
+ Регионы.Добавить("AWS_ISO_B_GLOBAL");
+ Регионы.Добавить("AWS_ISO_GLOBAL");
+ Регионы.Добавить("AWS_US_GOV_GLOBAL");
+ Регионы.Добавить("CA_CENTRAL_1");
+ Регионы.Добавить("CN_NORTH_1");
+ Регионы.Добавить("CN_NORTHWEST_1");
+ Регионы.Добавить("EU_CENTRAL_1");
+ Регионы.Добавить("EU_CENTRAL_2");
+ Регионы.Добавить("EU_NORTH_1");
+ Регионы.Добавить("EU_SOUTH_1");
+ Регионы.Добавить("EU_SOUTH_2");
+ Регионы.Добавить("EU_WEST_1");
+ Регионы.Добавить("EU_WEST_2");
+ Регионы.Добавить("EU_WEST_3");
+ Регионы.Добавить("ME_CENTRAL_1");
+ Регионы.Добавить("ME_SOUTH_1");
+ Регионы.Добавить("SA_EAST_1");
+ Регионы.Добавить("US_EAST_1");
+ Регионы.Добавить("US_EAST_2");
+ Регионы.Добавить("US_GOV_EAST_1");
+ Регионы.Добавить("US_GOV_WEST_1");
+ Регионы.Добавить("US_ISO_EAST_1");
+ Регионы.Добавить("US_ISO_WEST_1");
+ Регионы.Добавить("US_ISOB_EAST_1");
+ Регионы.Добавить("US_WEST_1");
+ Регионы.Добавить("US_WEST_2");
+
+ Для Каждого Регион Из Регионы Цикл
+ фРезультат.Вставить(Регион, СтрЗаменить(НРег(Регион), "_", "-"));
+ КонецЦикла;
+
+ Возврат Новый ФиксированнаяСтруктура(фРезультат);
+КонецФункции
+
+#Область AWS_РЕГИОНЫ
+// Возвращает AWS регион по умолчанию (ru-1)
+//
+// Возвращаемое значение:
+// Строка - регион
+//
+Функция РегионAWSПоУмолчанию() Экспорт
+ Возврат КлиентHTTPПовтИсп.РегионAWSRu1();
+КонецФункции
+
+// Возвращает AWS регион ru-1
+//
+// Возвращаемое значение:
+// Строка - регион
+//
+Функция РегионAWSRu1() Экспорт
+ Возврат КлиентHTTPПовтИсп.РегионыAWS().RU_1;
+КонецФункции
+
+// Возвращает AWS регион ru-msk-1
+//
+// Возвращаемое значение:
+// Строка - регион
+//
+Функция РегионAWSRuMsk() Экспорт
+ Возврат КлиентHTTPПовтИсп.РегионыAWS().RU_MSK;
+КонецФункции
+
+// Возвращает AWS регион ru-central1
+//
+// Возвращаемое значение:
+// Строка - регион
+//
+Функция РегионAWSRuCentral1() Экспорт
+ Возврат КлиентHTTPПовтИсп.РегионыAWS().RU_CENTRAL1;
+КонецФункции
+#КонецОбласти
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
@@ -1195,6 +1432,15 @@
Возврат Новый ФиксированноеСоответствие(фРезультат);
КонецФункции
+// Возвращает максимально допустимую для фреймворка длительность паузы в секундах
+//
+// Возвращаемое значение:
+// Число - количество секунд
+//
+Функция МаксимальноДопустимаяДлительностьПаузы() Экспорт
+ Возврат 3600;
+КонецФункции
+
// Возвращает имя события для журнала регистрации
//
// Возвращаемое значение:
diff --git "a/src/v2/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\241\320\265\321\200\320\262\320\265\321\200\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Ext/Module.bsl" "b/src/v2/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\241\320\265\321\200\320\262\320\265\321\200\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Ext/Module.bsl"
index 359f1d7..e00984c 100644
--- "a/src/v2/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\241\320\265\321\200\320\262\320\265\321\200\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Ext/Module.bsl"
+++ "b/src/v2/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\241\320\265\321\200\320\262\320\265\321\200\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Ext/Module.bsl"
@@ -2,7 +2,7 @@
// SPDX-License-Identifier: Apache-2.0+
#Область СлужебныйПрограммныйИнтерфейс
-// Возвращает словарь типов хеш-функций по наименованиям из заголовка WWW-Authenticate
+// (СЛУЖЕБНЫЙ) Возвращает словарь типов хеш-функций по наименованиям из заголовка WWW-Authenticate
//
// Возвращаемое значение:
// ФиксированноеСоответствие - словарь типов хеш-функций
diff --git "a/src/v2/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Ext/Module.bsl" "b/src/v2/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Ext/Module.bsl"
index b0c732c..d9bb025 100644
--- "a/src/v2/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Ext/Module.bsl"
+++ "b/src/v2/CommonModules/\320\232\320\273\320\270\320\265\320\275\321\202HTTP\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Ext/Module.bsl"
@@ -16,9 +16,7 @@
Возврат ПолучитьДвоичныеДанныеИзСтроки(Текст, Кодировка).Размер();
КонецФункции
-#КонецОбласти
-#Область СлужебныйПрограммныйИнтерфейс
// Возвращает строку Basic-аутентификации для пользователя и пароля
//
// Параметры:
@@ -78,6 +76,10 @@
КонецЦикла;
ЧастиДатыHTTP = СтрРазделить(ДатаHTTP, " ");
+ Если ЧастиДатыHTTP.Количество() < 7 Тогда
+ Ошибка = Истина;
+ Возврат фРезультат;
+ КонецЕсли;
Год = ОписаниеТипаЧисло.ПривестиЗначение(ЧастиДатыHTTP[3]);
Если Год < 70 Тогда
@@ -111,6 +113,7 @@
КонецФункции
// Возвращает текстовое представление даты RFC 1123
+// Date: Tue, 15-Nov-1994 08:12:31 GMT
//
// Параметры:
// Дата - Дата - конвертируемое значение
@@ -126,6 +129,23 @@
);
КонецФункции
+// Возвращает текстовое представление даты RFC 7231 (7.1.1.2)
+// Date: Tue, 15 Nov 1994 08:12:31 GMT
+//
+// Параметры:
+// Дата - Дата - конвертируемое значение
+//
+// Возвращаемое значение:
+// Строка - дата формата RFC 7231 (7.1.1.2)
+//
+Функция ДатаВHTTP7231(Знач Дата) Экспорт
+ Возврат СтрШаблон(
+ Формат(Дата, "ДФ='""%1"", дд ""%2"" гггг Ч:м:с ""GMT""'"),
+ ДеньНеделиНаАнглийском(Дата),
+ МесяцНаАнглийском(Дата)
+ );
+КонецФункции
+
// Возвращает преобразованный в ACE-последовательность IDN
//
// Параметры:
@@ -137,6 +157,54 @@
Функция НормализованныйАдресСервера(Знач АдресСервера) Экспорт
Возврат КодироватьАдресСервера(НРег(СокрЛП(АдресСервера)));
КонецФункции
+
+// Возвращает имя параметра запроса с экранированием
+//
+// Параметры:
+// Имя - Строка - имя параметра запроса
+//
+// Возвращаемое значение:
+// Строка - экранированное имя параметра запроса
+//
+Функция ФорматированноеИмяПараметраЗапроса(Знач Имя) Экспорт
+ Возврат СтрЗаменить(ФорматированноеЗначениеПараметраЗапроса(Имя), "=", "%3D");
+КонецФункции
+
+// Возвращает значение параметра запроса с экранированием
+//
+// Параметры:
+// Значение - Строка - значение параметра запроса
+//
+// Возвращаемое значение:
+// Строка - экранированное значение параметра запроса
+//
+Функция ФорматированноеЗначениеПараметраЗапроса(Знач Значение) Экспорт
+ Возврат СтрЗаменить(СтрЗаменить(СтрЗаменить(СокрЛП(Значение), Символы.ПС, ""), "#", "%23"), "&", "%26");
+КонецФункции
+
+// Создаёт файл путём конкатенации файлов сертификата и ключа формата PEM.
+// Полезно для использования объединённых сертификата и ключа в функции КлиентHTTPКлиентСервер.ИспользоватьФайлСертификатаКлиента.
+// Платформа 1С позволяет использовать только один файл. При необходимости передать ключ можно единым файлом с сертификатом,
+// объединив файл сертификата с файлом ключа этой функцией.
+//
+// Параметры:
+// ИмяФайла - Строка - полное имя создаваемого файла
+// Сертификат - Файл - файл сертификата формата PEM
+// Ключ - Файл - файл ключа сертификата формата PEM
+// ЗапретитьПерезапись - Булево - режим проаерки на существование создаваемого файла: если Истина, то вернётся ошибка в случае существования файла по указанному имени (возможен вызов исключения)
+//
+// Возвращаемое значение:
+// Обещание, Структура - объект ответа:
+// * Ошибка - Булево - признак наличия ошибки
+// * ОписаниеОшибки - Строка - описание ошибки
+//
+Функция ОбъединенныйФайлСертификатаИКлючаPEM(Знач ИмяФайла, Знач Сертификат, Знач Ключ, Знач ЗапретитьПерезапись = Ложь) Экспорт
+#Если Клиент Тогда
+ Возврат КлиентHTTPКлиент.ОбъединенныйФайлСертификатаИКлючаPEM(ИмяФайла, Сертификат, Ключ, ЗапретитьПерезапись);
+#Иначе
+ Возврат КлиентHTTP.ОбъединенныйФайлСертификатаИКлючаPEM(ИмяФайла, Сертификат, Ключ, ЗапретитьПерезапись);
+#КонецЕсли
+КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
diff --git a/src/v2/Configuration.xml b/src/v2/Configuration.xml
index 62560cd..0273e0b 100644
--- a/src/v2/Configuration.xml
+++ b/src/v2/Configuration.xml
@@ -50,7 +50,7 @@
Russian
Брызгалин Андрей Васильевич (andrew.bryzgalin@gmail.com)
- 2.1.0
+ 2.5.0
https://github.com/SpaceHead1C/1c_http/releases
false
false
diff --git "a/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP.xml" "b/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP.xml"
index 47dad38..ca67279 100644
--- "a/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP.xml"
+++ "b/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP.xml"
@@ -34,6 +34,8 @@
+
+ MonacoEditor
\ No newline at end of file
diff --git "a/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\230\320\264\320\265\320\275\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\276\321\200\320\260\320\240\320\265\321\201\321\203\321\200\321\201\320\260/Ext/Form.xml" "b/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\230\320\264\320\265\320\275\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\276\321\200\320\260\320\240\320\265\321\201\321\203\321\200\321\201\320\260/Ext/Form.xml"
index 7114232..086e2f1 100644
--- "a/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\230\320\264\320\265\320\275\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\276\321\200\320\260\320\240\320\265\321\201\321\203\321\200\321\201\320\260/Ext/Form.xml"
+++ "b/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\230\320\264\320\265\320\275\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\276\321\200\320\260\320\240\320\265\321\201\321\203\321\200\321\201\320\260/Ext/Form.xml"
@@ -188,6 +188,21 @@
ПортПриИзменении
+
+ false
+ false
+ false
+ false
+
+
+
+ ru
+ /
+
+
+
+
+
АдресРесурса
@@ -198,12 +213,6 @@
Top
false
-
-
- ru
- /
-
-
@@ -314,6 +323,53 @@
+
+
+
+ ru
+ фрагмент
+
+
+ AlwaysHorizontal
+ Usual
+ None
+ false
+ DontUse
+
+
+
+ false
+ false
+ false
+ false
+
+
+
+ ru
+ #
+
+
+
+
+
+
+ Фрагмент
+ None
+
+
+ ru
+ Фрагмент
+
+
+ false
+
+
+
+ ФрагментПриИзменении
+
+
+
+
@@ -468,6 +524,9 @@
Top
+ false
+ true
+ false
true
@@ -542,6 +601,52 @@
+
+
+
+ ru
+ Фрагмент
+
+
+
+
+ ru
+ Группа фрагмент МП
+
+
+ AlwaysHorizontal
+ Usual
+ None
+ false
+ DontUse
+
+
+
+ Фрагмент
+
+
+ ru
+ фрагмент:
+
+
+ Top
+ false
+ true
+ false
+
+
+ ru
+ #
+
+
+
+
+
+ ФрагментМППриИзменении
+
+
+
+
@@ -711,6 +816,21 @@
+
+
+
+ ru
+ Фрагмент
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
diff --git "a/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\230\320\264\320\265\320\275\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\276\321\200\320\260\320\240\320\265\321\201\321\203\321\200\321\201\320\260/Ext/Form/Module.bsl" "b/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\230\320\264\320\265\320\275\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\276\321\200\320\260\320\240\320\265\321\201\321\203\321\200\321\201\320\260/Ext/Form/Module.bsl"
index 4ddb785..b02abc1 100644
--- "a/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\230\320\264\320\265\320\275\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\276\321\200\320\260\320\240\320\265\321\201\321\203\321\200\321\201\320\260/Ext/Form/Module.bsl"
+++ "b/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\230\320\264\320\265\320\275\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\276\321\200\320\260\320\240\320\265\321\201\321\203\321\200\321\201\320\260/Ext/Form/Module.bsl"
@@ -4,63 +4,71 @@
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ОписаниеТипаЧисло = Новый ОписаниеТипов("Число");
- ИР = Параметры.ИдентификаторРесурса;
+ ИдентификаторРесурса = Параметры.ИдентификаторРесурса;
- ЗащищенноеСоединение = СтрНачинаетсяС(ИР, "https://");
+ ЗащищенноеСоединение = СтрНачинаетсяС(ИдентификаторРесурса, "https://");
Если ЗащищенноеСоединение Тогда
Элементы.ДекорацияСхема.Заголовок = "https://";
Элементы.ДекорацияСхемаМП.Заголовок = "https://";
КонецЕсли;
- ИР = СтрЗаменить(ИР, "https://", "");
- ИР = СтрЗаменить(ИР, "http://", "");
- ПозицияОкончания = СтрНайти(ИР, "?") - 1;
- Если ПозицияОкончания < 0 Тогда
- ПозицияОкончания = СтрДлина(ИР);
+ ИдентификаторРесурса = СтрЗаменить(ИдентификаторРесурса, "https://", "");
+ ИдентификаторРесурса = СтрЗаменить(ИдентификаторРесурса, "http://", "");
+ ПозицияСимволаПараметров = СтрНайти(ИдентификаторРесурса, "?");
+ ПозицияСимволаФрагмента = СтрНайти(ИдентификаторРесурса, "#", , ?(ПозицияСимволаПараметров = 0, 1, ПозицияСимволаПараметров));
+ Если ПозицияСимволаФрагмента > 0 Тогда
+ Фрагмент = Сред(ИдентификаторРесурса, ПозицияСимволаФрагмента + 1);
КонецЕсли;
+ ПозицияОкончания = ?(ПозицияСимволаПараметров = 0, ПозицияСимволаФрагмента, ПозицияСимволаПараметров) - 1;
+ Если ПозицияОкончания > 0 Тогда
+ ИдентификаторРесурса = Лев(ИдентификаторРесурса, ПозицияОкончания);
+ КонецЕсли;
+ ПозицияОкончания = СтрДлина(ИдентификаторРесурса);
- ПозицияПослеАвторизации = СтрНайти(ИР, "@");
+ ПозицияПослеАвторизации = СтрНайти(ИдентификаторРесурса, "@");
Если ПозицияПослеАвторизации > 0 И ПозицияПослеАвторизации < ПозицияОкончания Тогда
- Авторизация = Лев(ИР, ПозицияПослеАвторизации - 1);
+ Авторизация = Лев(ИдентификаторРесурса, ПозицияПослеАвторизации - 1);
ДлинаАвторизации = СтрДлина(Авторизация);
ПозицияРазделителяАвторизации = СтрНайти(Авторизация, ":");
Если ПозицияРазделителяАвторизации = 0 Тогда
ПозицияРазделителяАвторизации = ДлинаАвторизации + 1;
КонецЕсли;
- ЗакодированныеДанные = Новый Структура("Пользователь, Пароль");
- ЗакодированныеДанные.Пользователь = СокрЛП(Лев(Авторизация, ПозицияРазделителяАвторизации - 1));
- ЗакодированныеДанные.Пароль = Прав(Авторизация, ДлинаАвторизации - ПозицияРазделителяАвторизации);
- РаскодированныеДанные = КлиентHTTP.РаскодированныеСтроки(ЗакодированныеДанные);
+ ЗакодированныйПользователь = СокрЛП(Лев(Авторизация, ПозицияРазделителяАвторизации - 1));
+ ЗакодированныйПароль = Прав(Авторизация, ДлинаАвторизации - ПозицияРазделителяАвторизации);
+ МножествоСтрок = Новый Соответствие;
+ МножествоСтрок.Вставить(ЗакодированныйПользователь);
+ МножествоСтрок.Вставить(ЗакодированныйПароль);
- Пользователь = РаскодированныеДанные.Пользователь;
- Пароль = РаскодированныеДанные.Пароль;
- ИР = Сред(ИР, ПозицияПослеАвторизации + 1);
- ПозицияОкончания = СтрДлина(ИР);
+ МножествоСтрок = КлиентHTTP.РаскодированныеСтрокиURLвURL(МножествоСтрок);
+ Пользователь = МножествоСтрок.Получить(ЗакодированныйПользователь);
+ Пароль = МножествоСтрок.Получить(ЗакодированныйПароль);
+ ИдентификаторРесурса = Сред(ИдентификаторРесурса, ПозицияПослеАвторизации + 1);
+ ПозицияОкончания = СтрДлина(ИдентификаторРесурса);
КонецЕсли;
- ПозицияАдресаРесурса = СтрНайти(ИР, "/");
+ ПозицияАдресаРесурса = СтрНайти(ИдентификаторРесурса, "/");
Если ПозицияАдресаРесурса > 0 Тогда
- АдресРесурса = Сред(ИР, ПозицияАдресаРесурса, ПозицияОкончания - ПозицияАдресаРесурса + 1);
+ АдресРесурса = Сред(ИдентификаторРесурса, ПозицияАдресаРесурса + 1, ПозицияОкончания - ПозицияАдресаРесурса + 1);
ПозицияОкончания = ПозицияАдресаРесурса - 1;
КонецЕсли;
- ПозицияПорта = СтрНайти(ИР, ":", НаправлениеПоиска.СКонца, ПозицияОкончания);
+ ПозицияПорта = СтрНайти(ИдентификаторРесурса, ":", НаправлениеПоиска.СКонца, ПозицияОкончания);
Если ПозицияПорта > 0 Тогда
- Порт = ОписаниеТипаЧисло.ПривестиЗначение(Сред(ИР, ПозицияПорта + 1, ПозицияОкончания));
+ Порт = ОписаниеТипаЧисло.ПривестиЗначение(Сред(ИдентификаторРесурса, ПозицияПорта + 1, ПозицияОкончания - ПозицияПорта));
ПозицияОкончания = ПозицияПорта - 1;
Иначе
Порт = ?(ЗащищенноеСоединение, 443, 80);
КонецЕсли;
- Сервер = Лев(ИР, ПозицияОкончания);
+ Сервер = Лев(ИдентификаторРесурса, ПозицияОкончания);
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
URI = ИдентификаторРесурса();
-#Если МобильныйКлиент Тогда
+#Если МобильныйКлиент ИЛИ МобильноеПриложениеКлиент Тогда
Элементы.Основная.Видимость = Ложь;
Элементы.ФормаОК.Видимость = Ложь;
Элементы.ОсновнаяМП.Видимость = Истина;
@@ -73,7 +81,7 @@
Процедура ОК(Команда)
Перем ПроверяемоеПоле;
-#Если МобильныйКлиент Тогда
+#Если МобильныйКлиент ИЛИ МобильноеПриложениеКлиент Тогда
ПроверяемоеПоле = "СерверМП";
#Иначе
ПроверяемоеПоле = "Сервер";
@@ -88,7 +96,7 @@
Возврат;
КонецЕсли;
- Закрыть(ИдентификаторРесурса());
+ Закрыть(ИдентификаторРесурса() + ?(ПустаяСтрока(Фрагмент), "", "#" + Фрагмент));
КонецПроцедуры
#КонецОбласти
@@ -125,6 +133,11 @@
Процедура ПарольПриИзменении(Элемент)
URI = ИдентификаторРесурса();
КонецПроцедуры
+
+&НаКлиенте
+Процедура ФрагментПриИзменении(Элемент)
+ URI = ИдентификаторРесурса();
+КонецПроцедуры
#КонецОбласти
#КонецОбласти
@@ -151,6 +164,11 @@
URI = ИдентификаторРесурса();
КонецПроцедуры
+&НаКлиенте
+Процедура ФрагментМППриИзменении(Элемент)
+ URI = ИдентификаторРесурса();
+КонецПроцедуры
+
&НаКлиенте
Процедура ПользовательМППриИзменении(Элемент)
URI = ИдентификаторРесурса();
@@ -194,6 +212,11 @@
ЧастиURL.Добавить(АдресРесурса);
+ Фрагмент = СокрЛП(Фрагмент);
+ Если НЕ ПустаяСтрока(Фрагмент) И СтрНачинаетсяС(Фрагмент, "#") Тогда
+ Фрагмент = СокрЛ(Сред(Фрагмент, 2));
+ КонецЕсли;
+
Возврат СтрСоединить(ЧастиURL);
КонецФункции
diff --git "a/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\240\320\265\320\264\320\260\320\272\321\202\320\276\321\200\320\242\320\265\320\272\321\201\321\202\320\276\320\262\320\276\320\263\320\276\320\237\320\276\320\273\321\217/Ext/Form.xml" "b/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\240\320\265\320\264\320\260\320\272\321\202\320\276\321\200\320\242\320\265\320\272\321\201\321\202\320\276\320\262\320\276\320\263\320\276\320\237\320\276\320\273\321\217/Ext/Form.xml"
index 564a0e5..9f46ade 100644
--- "a/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\240\320\265\320\264\320\260\320\272\321\202\320\276\321\200\320\242\320\265\320\272\321\201\321\202\320\276\320\262\320\276\320\263\320\276\320\237\320\276\320\273\321\217/Ext/Form.xml"
+++ "b/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\240\320\265\320\264\320\260\320\272\321\202\320\276\321\200\320\242\320\265\320\272\321\201\321\202\320\276\320\262\320\276\320\263\320\276\320\237\320\276\320\273\321\217/Ext/Form.xml"
@@ -26,28 +26,88 @@
+ ПриОткрытии
ПриСозданииНаСервере
-
- РедактируемыйТекст
- None
- 50
- false
- false
- true
- true
- true
- true
- false
- false
- false
- false
- false
- false
-
-
-
+
+
+
+ ru
+ Основная
+
+
+
+
+ ru
+ Основная
+
+
+ None
+
+
+
+
+
+ ru
+ Страница редактируемый текст
+
+
+
+
+ ru
+ Страница редактируемый текст
+
+
+
+
+
+ РедактируемыйТекст
+ None
+ false
+ false
+ true
+ true
+ true
+ true
+
+
+
+ РедактируемыйТекстИзменениеТекстаРедактирования
+
+
+
+
+
+
+
+ ru
+ Страница форматированный текст
+
+
+
+
+ ru
+ Страница форматированный текст
+
+
+
+
+
+ ТекстMonaco
+ None
+
+ false
+
+
+
+ ФорматированныйТекстДокументСформирован
+
+
+
+
+
+
@@ -71,6 +131,30 @@
+
+
+
+ ru
+ Текст monaco
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ Конфигурация
+
+
+
+
@@ -109,5 +193,31 @@
+
+
+ xs:string
+ v8:Null
+
+ 10
+ Variable
+
+
+
+
+
+ xs:string
+ v8:Null
+
+ 0
+ Variable
+
+
+
+
+
+ v8ui:Color
+ v8:Null
+
+
\ No newline at end of file
diff --git "a/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\240\320\265\320\264\320\260\320\272\321\202\320\276\321\200\320\242\320\265\320\272\321\201\321\202\320\276\320\262\320\276\320\263\320\276\320\237\320\276\320\273\321\217/Ext/Form/Module.bsl" "b/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\240\320\265\320\264\320\260\320\272\321\202\320\276\321\200\320\242\320\265\320\272\321\201\321\202\320\276\320\262\320\276\320\263\320\276\320\237\320\276\320\273\321\217/Ext/Form/Module.bsl"
index 68f59bc..9604bf4 100644
--- "a/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\240\320\265\320\264\320\260\320\272\321\202\320\276\321\200\320\242\320\265\320\272\321\201\321\202\320\276\320\262\320\276\320\263\320\276\320\237\320\276\320\273\321\217/Ext/Form/Module.bsl"
+++ "b/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\240\320\265\320\264\320\260\320\272\321\202\320\276\321\200\320\242\320\265\320\272\321\201\321\202\320\276\320\262\320\276\320\263\320\276\320\237\320\276\320\273\321\217/Ext/Form/Module.bsl"
@@ -8,7 +8,49 @@
Заголовок = Параметры.ЗаголовокФормы;
КонецЕсли;
- РедактируемыйТекст = Параметры.Текст;
+ Если ЗначениеЗаполнено(Параметры.АдресMonaco) Тогда
+ Конфигурация = Новый Структура(
+ "АдресMonaco, ФорматТекста, Текст",
+ Параметры.АдресMonaco,
+ Параметры.ФорматТекста,
+ Параметры.Текст
+ );
+ Элементы.Основная.ТекущаяСтраница = Элементы.СтраницаФорматированныйТекст;
+ Иначе
+ РедактируемыйТекст = Параметры.Текст;
+ Если Параметры.ЦветРедактируемогоТекста <> Неопределено Тогда
+ Элементы.РедактируемыйТекст.ЦветТекста = Параметры.ЦветРедактируемогоТекста;
+ КонецЕсли;
+ Элементы.Основная.ТекущаяСтраница = Элементы.СтраницаРедактируемыйТекст;
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Асинх Процедура ПриОткрытии(Отказ)
+ Если Конфигурация <> Неопределено Тогда
+ ТекстMonaco = Конфигурация.АдресMonaco;
+ КонецЕсли;
+КонецПроцедуры
+#КонецОбласти
+
+#Область ОбработчикиСобытийПоляРедактируемогоТекста
+&НаКлиенте
+Процедура РедактируемыйТекстИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)
+ Элементы.РедактируемыйТекст.ЦветТекста = Новый Цвет;
+КонецПроцедуры
+#КонецОбласти
+
+#Область ОбработчикиСобытийПоляФорматированногоТекста
+&НаКлиенте
+Процедура ФорматированныйТекстДокументСформирован(Элемент)
+ View().setOption("autoResizeEditorLayout", Истина);
+ View().hideScrollX();
+ View().hideScrollY();
+ View().setReadOnly(Ложь);
+ View().eraseText();
+ УстановитьФорматТекста(Конфигурация.ФорматТекста);
+ View().setText(Конфигурация.Текст, Неопределено, Истина);
+ View().setReadOnly(Истина);
КонецПроцедуры
#КонецОбласти
@@ -18,3 +60,24 @@
Закрыть(РедактируемыйТекст);
КонецПроцедуры
#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+&НаКлиенте
+Функция View()
+ Возврат Элементы.ТекстMonaco.Документ.defaultView;
+КонецФункции
+
+&НаКлиенте
+Процедура УстановитьФорматТекста(Знач Формат)
+ ИзвестныеФорматы = Новый Соответствие;
+ Для Каждого Ф Из СтрРазделить("bsl,json,xml,html", ",") Цикл
+ ИзвестныеФорматы.Вставить(Ф, Ф);
+ КонецЦикла;
+ ИзвестныйФормат = ИзвестныеФорматы.Получить(Формат);
+ Если ИзвестныйФормат = Неопределено Тогда
+ ИзвестныйФормат = "text";
+ КонецЕсли;
+
+ View().setLanguageMode(ИзвестныйФормат);
+КонецПроцедуры
+#КонецОбласти
diff --git "a/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml" "b/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml"
index a047075..276edcc 100644
--- "a/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml"
+++ "b/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml"
@@ -14,6 +14,7 @@
ПриОткрытии
ПриСозданииНаСервере
+ ПриЗакрытии
@@ -242,6 +243,7 @@
false
false
false
+ false
false
@@ -584,100 +586,148 @@
-
- ТипАвторизации
+
ru
- Тип
+ Группа тип аутентификации
- 15
- false
- false
- true
- false
- false
- false
- false
- false
- false
- false
-
-
-
- 0
-
-
-
- ru
- Без авторизации
-
-
- Без авторизации
-
-
-
-
- 0
-
-
-
- ru
- Basic
-
-
- Basic
-
-
-
-
- 0
-
-
-
- ru
- NTLM
-
-
- NTLM
-
-
-
-
- 0
-
-
-
- ru
- Digest
-
-
- Digest
-
-
-
-
- 0
-
-
-
- ru
- Bearer
-
-
- Bearer
-
-
-
-
-
-
- ТипАвторизацииПриИзменении
-
-
-
- ПользовательАвторизации
+
+
+ ru
+ Группа тип аутентификации
+
+
+ AlwaysHorizontal
+ Usual
+ None
+ false
+ DontUse
+
+
+
+ ТипАутентификации
+
+
+ ru
+ Тип
+
+
+ 16
+ false
+ false
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+
+ 0
+
+
+
+ ru
+ Без аутентификации
+
+
+ Без аутентификации
+
+
+
+
+ 0
+
+
+
+ ru
+ Basic
+
+
+ Basic
+
+
+
+
+ 0
+
+
+
+ ru
+ NTLM
+
+
+ NTLM
+
+
+
+
+ 0
+
+
+
+ ru
+ Digest
+
+
+ Digest
+
+
+
+
+ 0
+
+
+
+ ru
+ Bearer
+
+
+ Bearer
+
+
+
+
+ 0
+
+
+
+ ru
+ AWS4-HMAC-SHA256
+
+
+ AWS4-HMAC-SHA256
+
+
+
+
+ 0
+
+
+
+ ru
+ Hawk
+
+
+ Hawk
+
+
+
+
+
+
+ ТипАутентификацииПриИзменении
+
+
+
+
+
+ ПользовательАутентификации
false
@@ -687,31 +737,31 @@
false
false
-
-
+
+
-
+
false
ru
- Группа пароль авторизации
+ Группа пароль аутентификации
ru
- Группа пароль авторизации
+ Группа пароль аутентификации
AlwaysHorizontal
Usual
None
false
-
+
-
- ПарольАвторизации
+
+ ПарольАутентификации
ru
@@ -721,43 +771,43 @@
false
false
true
-
-
+
+
-
+
UsualButton
Picture
- Form.Command.ПоказатьПарольАвторизации
+ Form.Command.ПоказатьПарольАутентификации
StdPicture.DataSearch
true
-
+
-
+
false
ru
- Группа токен авторизации
+ Группа токен аутентификации
ru
- Группа токен авторизации
+ Группа токен аутентификации
AlwaysHorizontal
Usual
None
false
-
+
-
- ТокенАвторизации
+
+ ТокенАутентификации
ru
@@ -767,21 +817,259 @@
false
false
true
-
-
+
+
+
+
+ UsualButton
+ Picture
+ Form.Command.ПоказатьТокенАутентификации
+
+ StdPicture.DataSearch
+ true
+
+
+
+
+
+
+ AWSКлючДоступа
+ false
+
+
+ ru
+ Ключ доступа
+
+
+ false
+ true
+ false
+
+
+
+
+ false
+
+
+ ru
+ Группа секретный ключ AWS
+
+
+
+
+ ru
+ Группа секретный ключ AWS
+
+
+ AlwaysHorizontal
+ Usual
+ None
+ false
+
+
+
+ AWSСекретныйКлюч
+
+
+ ru
+ Секретный ключ
+
+
+ false
+ true
+ false
+ true
+
+
+
+
+ UsualButton
+ Picture
+ Form.Command.ПоказатьСекретныйКлючAWS
+
+ StdPicture.DataSearch
+ true
+
+
+
+
+
+
+ AWSРегион
+ false
+
+
+ ru
+ Регион
+
+
+ false
+ true
+ false
+ true
+ false
+ true
+ false
+ false
+ false
+
+
+
+
+ AWSСервис
+ false
+
+
+ ru
+ Сервис
+
+
+ false
+ true
+ false
+
+
+ ru
+ например, s3
+
+
+
+
+
+
+ HawkИдентификатор
+ false
+
+
+ ru
+ Идентификатор
+
+
+ false
+ true
+ false
+
+
+
+
+ false
+
+
+ ru
+ Группа ключ hawk
+
+
+
+
+ ru
+ Группа ключ hawk
+
+
+ AlwaysHorizontal
+ Usual
+ None
+ false
+
+
+
+ HawkКлюч
+
+
+ ru
+ Ключ
+
+
+ false
+ true
+ false
+ true
+
+
-
+
UsualButton
Picture
- Form.Command.ПоказатьТокенАвторизации
+ Form.Command.ПоказатьКлючHawk
StdPicture.DataSearch
true
-
+
+
+ HawkДополнение
+ false
+
+
+ ru
+ ext
+
+
+ false
+ true
+ false
+
+
+ ru
+ нарпимер, some-app-extra-data
+
+
+
+
+
+
+ ru
+ Специфические данные клиента
+
+
+
+
+
+ HawkИдентификаторПриложения
+ false
+
+
+ ru
+ app
+
+
+ false
+ true
+ false
+
+
+
+
+ ru
+ Идентификатор приложения
+
+
+
+
+
+ HawkДелегирование
+ false
+
+
+ ru
+ dlg
+
+
+ false
+ true
+ false
+
+
+
+
+ ru
+ Делегированный идентификатор приложения
+
+
+
+
@@ -1717,10 +2005,10 @@
ru
- JSON
+ Просмотр
- JSON
+ HTML
@@ -1730,20 +2018,7 @@
ru
- HTML
-
-
- HTML
-
-
-
-
- 0
-
-
-
- ru
- Картинка
+ Картинка
Картинка
@@ -1794,41 +2069,172 @@
-
- ОтветТекст
- true
- None
- false
- false
-
-
-
-
-
-
-
-
- ru
- Формат тела ответа JSON
-
-
-
-
- ru
- Формат тела ответа JSON
-
-
-
-
-
- ОтветJSON
- true
- None
- false
- false
-
-
-
+
+ false
+
+
+ ru
+ Группа форматирование текста тела ответа
+
+
+
+
+ ru
+ Группа форматирование текста тела ответа
+
+
+ 2
+ false
+ false
+ AlwaysHorizontal
+ Center
+ Usual
+ None
+ false
+
+
+
+ ФорматироватьТекстТелаОтвета
+ Auto
+
+
+
+ ФорматироватьТекстТелаОтветаПриИзменении
+
+
+
+ ФорматТекстТелаОтвета
+
+
+ ru
+ как
+
+
+ Tumbler
+ true
+
+
+
+ 0
+
+
+
+ ru
+ JSON
+
+
+ JSON
+
+
+
+
+ 0
+
+
+
+ ru
+ XML
+
+
+ XML
+
+
+
+
+ 0
+
+
+
+ ru
+ HTML
+
+
+ HTML
+
+
+
+
+
+
+ ФорматТекстТелаОтветаПриИзменении
+
+
+
+
+
+
+
+ ru
+ Группа форматы текста тела ответа
+
+
+
+
+ ru
+ Группа форматы текста тела ответа
+
+
+ None
+
+
+
+
+
+ ru
+ Текст тела ответа как текст
+
+
+
+
+ ru
+ Текст тела ответа как текст
+
+
+
+
+
+ ОтветТекст
+ true
+ None
+ false
+ false
+
+
+
+
+
+
+
+
+ ru
+ Текст тела ответа форматированный
+
+
+
+
+ ru
+ Текст тела ответа форматированный
+
+
+
+
+
+ ОтветMonaco
+ None
+ false
+ false
+
+ false
+
+
+
+ ОтветMonacoДокументСформирован
+
+
+
+
+
+
@@ -1846,14 +2252,13 @@
-
+
ОтветHTML
- true
None
false
false
-
-
+
+
@@ -2132,6 +2537,22 @@
+
+ ОтображатьСекреты
+ Button
+ Auto
+
+
+
+
+ ru
+ Режим отображения секретов в результатах кодогенерации и экспорта в команду curl.
+
+Если опция отключена, отображение секретов регулируется индивидуально интерфейсными кнопками для каждого поля с секретом.
+
+
+
+
@@ -2142,7 +2563,7 @@
ru
- Группа файл тела ответа
+ Настройка сохранения тела ответа в файл
Usual
@@ -2169,9 +2590,13 @@
+
+ ТелоОтветаВФайлПриИзменении
+
ИмяФайлаТелаОтвета
+ false
ru
@@ -2188,7 +2613,6 @@
- ИмяФайлаТелаОтветаПриИзменении
ИмяФайлаТелаОтветаНачалоВыбора
@@ -2214,6 +2638,59 @@
+
+ АгентПользователя
+
+
+ ru
+ Пользовательское значение заголовка "User-Agent"
+
+
+ Button
+ false
+ true
+ false
+ false
+ false
+ true
+ false
+ false
+ false
+
+
+ ru
+ значение платформы по умолчанию
+
+
+
+
+
+
+ ru
+ Пользовательское значение заголовка "User-Agent"
+
+
+
+
+
+ Таймаут
+
+
+ ru
+ Таймаут соединения в секундах
+
+
+ Button
+ true
+
+
+ ru
+ ЧН=
+
+
+
+
+
@@ -2224,7 +2701,7 @@
ru
- Группа настройки использования сессии
+ Настройка использования сессии
Vertical
@@ -2293,6 +2770,19 @@
+
+ ПеренаправлениеКакGET
+
+
+ ru
+ Принудительно переключаться на метод GET для кодов перенаправления 301 и 302
+
+
+ Button
+ Auto
+
+
+
ПоддержкаCookie
@@ -2319,111 +2809,663 @@
-
+
ru
- Прокси
+ Повторное выполнение
ru
- Группа прокси
+ Повторять попытки выполнить HTTP-запрос после неуспешного результата.
+
+Неуспешным считается вызов исключения и ответ с кодом состояния 5хх или каким-либо из определённых пользователем.
+ Button
Vertical
Usual
- NormalSeparation
-
+
-
- ИспользоватьПрокси
+
+ СпособПовторногоВыполнения
ru
- Использовать
+ Способ
ru
- Использовать прокси-сервер для выполнения запроса
+ Способ расчёта паузы перед повторным выполнением
Button
- Auto
-
-
+ true
+ false
+ false
+ false
+ false
+ false
+ true
+ false
+
+
+
+ 0
+
+
+
+ ru
+ Разово
+
+
+ Разово
+
+
+
+
+ 0
+
+
+
+ ru
+ Фиксировано
+
+
+ Фиксировано
+
+
+
+
+ 0
+
+
+
+ ru
+ Линейно
+
+
+ Линейно
+
+
+
+
+ 0
+
+
+
+ ru
+ Экспоненциально
+
+
+ Экспоненциально
+
+
+
+
+
- ИспользоватьПроксиПриИзменении
+ СпособПовторногоВыполненияПриИзменении
-
-
- НеИспользоватьПроксиДляЛокальныхАдресов
+
+
false
ru
- Кроме локальных адресов
+ Группа параметры повторного выполнения
ru
- Если опция включена, то при запросе ресурсов с локальных адресов прокси не используется
+ Группа параметры повторного выполнения
- Button
- Auto
-
-
-
-
- СерверПрокси
- false
-
-
- ru
- Сервер
-
-
- true
-
-
-
-
- ПортПрокси
- false
-
-
- ru
- Порт
-
-
-
-
-
-
- ПользовательПрокси
- false
-
-
- ru
- Пользователь
-
-
- false
-
-
-
-
- false
-
-
- ru
- Группа пароль прокси
-
+ Vertical
+ Usual
+ None
+ false
+
+
+
+
+
+ ru
+ Группа параметры длительности паузы
+
+
+
+
+ ru
+ Группа параметры длительности паузы
+
+
+ AlwaysHorizontal
+ Usual
+ None
+ false
+
+
+
+ ДлительностьПаузыПовторногоВыполнения
+
+
+ ru
+ Длительность
+
+
+
+
+ ru
+ Длительность в секундах паузы после первой попытки выполнения HTTP-запроса
+
+
+ Button
+
+
+
+
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения
+
+
+ ru
+ в пределе до
+
+
+
+
+ ru
+ Максимальная длительность в секундах паузы между попытками в секундах (ограничение фреймворка 3600)
+
+
+ Button
+
+
+
+
+ КоэффициентУвеличенияПаузыПовторногоВыполнения
+
+
+ ru
+ Коэффициент
+
+
+
+
+ ru
+ Коэффициент увеличения паузы между попытками выполнить HTTP-запрос
+
+
+ Button
+
+
+
+
+ ПорогКоличестваПопытокПовторногоВыполнения
+
+
+ ru
+ Количество попыток
+
+
+
+
+ ru
+ Максимальное количество неуспешных попыток выполнить HTTP-запрос
+
+
+ Button
+ 1
+
+
+
+
+
+
+ КодыСостоянияОтветаПовторногоВыполнения
+
+
+ ru
+ Коды состояния ответа
+
+
+
+
+ ru
+ коды состояния ответа, при получении которых необходимо повторять попытки
+
+
+ Button
+ false
+ false
+ false
+ true
+ true
+ false
+ false
+ false
+ 999
+ 100
+ 599
+
+
+
+
+
+
+
+
+
+
+ ru
+ SSL сертификаты
+
+
+
+
+ ru
+ Группа сертификаты
+
+
+ Vertical
+
+
+
+ ИспользоватьСертификаты
+
+
+ ru
+ Использовать
+
+
+
+
+ ru
+ Использовать клиентский сертификат OpenSSL для выполнения запроса
+
+
+ Button
+ Auto
+
+
+
+ ИспользоватьСертификатыПриИзменении
+
+
+
+ false
+
+
+ ru
+ Группа клиентский сертификат
+
+
+
+
+ ru
+ Группа клиентский сертификат
+
+
+ true
+ false
+ AlwaysHorizontal
+ None
+ false
+
+
+
+ ИмяФайлаКлиентскогоСертификата
+
+
+ ru
+ Файл клиентского сертификата
+
+
+ Button
+ false
+ false
+ true
+ false
+ false
+ true
+ false
+ false
+ false
+ false
+ false
+
+
+
+
+ ru
+ Путь к файлу клиентского сертификата OpenSSL. Допустимо применение форматов PEM и PKCS#12.
+
+Если требуется передавать два файла - сертификат и его ключ - можно получить конкатенацию этих файлов и передать получившийся единый файл как сертификат. Воспользуйтесь кнопкой "Объединить сертификат и ключ"
+
+
+
+
+ ИмяФайлаКлиентскогоСертификатаНачалоВыбора
+
+
+
+ UsualButton
+ Picture
+ Form.Command.ОбъединитьСертификатИКлюч
+
+ StdPicture.DataCompositionNewNestedScheme
+ true
+
+
+
+
+
+
+ false
+
+
+ ru
+ Группа пароль клиентского сертификата
+
+
+
+
+ ru
+ Группа пароль клиентского сертификата
+
+
+ AlwaysHorizontal
+ None
+ false
+
+
+
+ ПарольКлиентскогоСертификата
+ false
+ false
+ true
+ false
+ true
+
+
+
+
+ UsualButton
+ Picture
+ Form.Command.ПоказатьПарольКлиентскогоСертификата
+
+ StdPicture.DataSearch
+ true
+
+
+
+
+
+
+ ИмяФайлаСертификатовУЦ
+ false
+
+
+ ru
+ Файл сертификатов УЦ
+
+
+
+
+ ru
+ Путь к файлу сертификатов удостоверяющих центров OpenSSL, загружаемые из системного хранилища сертификатов операционной системы. Допустимо применение форматов PEM и PKCS#12.
+
+
+ Button
+ false
+ false
+ true
+ false
+ false
+ true
+ false
+ false
+ false
+ false
+ false
+
+
+
+ ИмяФайлаСертификатовУЦНачалоВыбора
+
+
+
+ false
+
+
+ ru
+ Группа пароль файла сертификатов УЦ
+
+
+
+
+ ru
+ Группа пароль файла сертификатов УЦ
+
+
+ AlwaysHorizontal
+ None
+ false
+
+
+
+ ПарольФайлаСертификатовУЦ
+ false
+ false
+ true
+ false
+ true
+
+
+
+
+ UsualButton
+ Picture
+ Form.Command.ПоказатьПарольФайлаСертификатовУЦ
+
+ StdPicture.DataSearch
+ true
+
+
+
+
+
+
+
+
+
+
+ ru
+ Прокси
+
+
+
+
+ ru
+ Настройки прокси
+
+
+ Vertical
+ Usual
+ NormalSeparation
+
+
+
+ ИспользоватьПрокси
+
+
+ ru
+ Использовать
+
+
+
+
+ ru
+ Использовать прокси-сервер для выполнения запроса
+
+
+ Button
+ Auto
+
+
+
+ ИспользоватьПроксиПриИзменении
+
+
+
+ НеИспользоватьПроксиДляЛокальныхАдресов
+ false
+
+
+ ru
+ Кроме локальных адресов
+
+
+
+
+ ru
+ Если опция включена, то при запросе ресурсов с локальных адресов прокси не используется
+
+
+ Button
+ Auto
+
+
+
+
+ false
+
+
+ ru
+ Сервер прокси
+
+
+ AlwaysHorizontal
+ Usual
+ None
+ false
+
+
+
+ ПротоколПрокси
+
+
+ ru
+ Сервер
+
+
+
+
+ ru
+ Протокол прокси
+
+
+ false
+ false
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+
+ 0
+
+
+
+ ru
+ https
+
+
+ https
+
+
+
+
+ 0
+
+
+
+ ru
+ http
+
+
+ http
+
+
+
+
+
+
+
+ СерверПрокси
+
+
+ ru
+ Сервер
+
+
+ None
+
+
+ ru
+ Сервер прокси
+
+
+ false
+ false
+ false
+ true
+
+
+
+
+
+
+ ПортПрокси
+ false
+
+
+ ru
+ Порт
+
+
+
+
+
+
+ ПользовательПрокси
+ false
+
+
+ ru
+ Пользователь
+
+
+ false
+
+
+
+
+ false
+
+
+ ru
+ Группа пароль прокси
+
@@ -2484,6 +3526,43 @@
+
+
+
+ ru
+ Редактор Monaco
+
+
+
+
+ ru
+ Управление редактором Monaco
+
+
+ Vertical
+ Usual
+ NormalSeparation
+
+
+
+ UsualButton
+ Picture
+ Form.Command.ИзвлечьMonaco
+
+ StdPicture.Refresh
+ true
+
+
+
+
+ ru
+ Перезагрузить редактор Monaco
+
+
+
+
+
+
@@ -2734,55 +3813,220 @@
- cfg:DataProcessorObject.КонсольКлиентаHTTP
+ cfg:DataProcessorObject.КонсольКлиентаHTTP
+
+ true
+
+
+
+
+ ru
+ Идентификатор ресурса
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ Параметры запроса
+
+
+
+ v8:ValueTable
+
+
+ ПараметрыЗапроса.Значение
+
+
+
+
+
+ ru
+ Имя
+
+
+
+ xs:string
+
+ 100
+ Variable
+
+
+
+
+
+
+ ru
+ Значение
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ Активно
+
+
+
+ xs:boolean
+
+
+
+
+
+
+
+ ru
+ Ответ текст
+
+
+
+ fd:FormattedDocument
+
+
+
+
+
+ ru
+ Код состояния
+
+
+
+ xs:decimal
+
+ 3
+ 0
+ Nonnegative
+
+
+
+
+
+
+ ru
+ Заголовки ответа
+
+
+
+ v8:ValueTable
+
+
+
+
+
+ ru
+ Ключ
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ Значение
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+
+
+ ru
+ Значение заголовка ответа
+
+
+
+ xs:string
+
+ 0
+ Variable
+
- true
-
+
ru
- Идентификатор ресурса
+ Схема
xs:string
- 0
+ 8
Variable
-
+
ru
- Параметры запроса
+ Заголовки запроса
v8:ValueTable
-
- ПараметрыЗапроса.Значение
-
-
+
ru
- Имя
+ Активно
+
+
+
+ xs:boolean
+
+
+
+
+
+ ru
+ Ключ
xs:string
- 100
+ 0
Variable
-
+
ru
@@ -2797,7 +4041,110 @@
-
+
+
+
+
+
+ ru
+ Тип аутентификации
+
+
+
+ xs:string
+
+ 25
+ Variable
+
+
+
+
+
+
+ ru
+ Пользователь аутентификации
+
+
+
+ xs:string
+
+ 100
+ Variable
+
+
+
+
+
+
+ ru
+ Пароль аутентификации
+
+
+
+ xs:string
+
+ 255
+ Variable
+
+
+
+
+
+
+ ru
+ Тело запроса текст
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ Тип тела запроса
+
+
+
+ xs:string
+
+ 100
+ Variable
+
+
+
+
+
+
+ ru
+ Тип тела запроса как есть
+
+
+
+ xs:string
+
+ 10
+ Variable
+
+
+
+
+
+
+ ru
+ Тело запроса данные формы
+
+
+
+ v8:ValueTable
+
+
+
ru
@@ -2808,83 +4155,187 @@
xs:boolean
+
+
+
+ ru
+ Тип
+
+
+
+ xs:string
+
+ 10
+ Variable
+
+
+
+
+
+
+ ru
+ Ключ
+
+
+
+ xs:string
+
+ 1000
+ Variable
+
+
+
+
+
+
+ ru
+ Значение
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
-
+
+
+
+ ru
+ Тело запроса файл
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ Разделитель
+
+
+
+ xs:string
+
+ 1000
+ Variable
+
+
+
+
+
+
+ ru
+ Дополнительно
+
+
+
+
+
+
+
+ ru
+ Имя файла тела
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
ru
- Ответ текст
+ Использовать сессию
- fd:FormattedDocument
+ xs:boolean
-
+
ru
- Код состояния
+ Количество
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ Порог перенаправлений
xs:decimal
- 3
+ 2
0
Nonnegative
-
+
ru
- Заголовки ответа
+ Поддержка cookie
- v8:ValueTable
+ xs:boolean
-
-
-
-
- ru
- Ключ
-
-
-
- xs:string
-
- 0
- Variable
-
-
-
-
-
-
- ru
- Значение
-
-
-
- xs:string
-
- 0
- Variable
-
-
-
-
-
+
ru
- Значение заголовка ответа
+ Поддержка сжатого ответа
+
+
+
+ xs:boolean
+
+
+
+
+
+ ru
+ Тело ответа в файл
+
+
+
+ xs:boolean
+
+
+
+
+
+ ru
+ Имя файла тела ответа
@@ -2894,27 +4345,28 @@
Variable
+ ShowError
-
+
ru
- Схема
+ Токен аутентификации
xs:string
- 8
+ 255
Variable
-
+
ru
- Заголовки запроса
+ Тело запроса данные HTMLФормы
@@ -2942,7 +4394,7 @@
xs:string
- 0
+ 1000
Variable
@@ -2964,26 +4416,26 @@
-
+
ru
- Тип авторизации
+ Ответ картинка
xs:string
- 25
+ 0
Variable
-
+
ru
- Пользователь авторизации
+ Формат тела ответа
@@ -2994,26 +4446,26 @@
-
+
ru
- Пароль авторизации
+ Ответ HTML
xs:string
- 255
+ 0
Variable
-
+
ru
- Тело запроса текст
+ Ответ monaco
@@ -3024,11 +4476,43 @@
-
+
ru
- Тип тела запроса
+ Время выполнения
+
+
+
+ xs:decimal
+
+ 15
+ 2
+ Nonnegative
+
+
+
+
+
+
+ ru
+ Размер ответа
+
+
+
+ xs:decimal
+
+ 15
+ 2
+ Nonnegative
+
+
+
+
+
+
+ ru
+ Разделы консоли
@@ -3039,78 +4523,218 @@
-
+
ru
- Тип тела запроса как есть
+ Использовать прокси
+
+
+
+ xs:boolean
+
+
+
+
+
+ ru
+ Сервер прокси
xs:string
- 10
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ Порт прокси
+
+
+
+ xs:decimal
+
+ 5
+ 0
+ Nonnegative
+
+
+
+
+
+
+ ru
+ Пользователь прокси
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ Пароль прокси
+
+
+
+ xs:string
+
+ 0
Variable
-
+
+
+
+ ru
+ Использовать аутентификацию ОСПрокси
+
+
+
+ xs:boolean
+
+
+
+
+
+ ru
+ Не использовать прокси для локальных адресов
+
+
+
+ xs:boolean
+
+
+
+
+
+ ru
+ Выполнять на сервере
+
+
+
+ xs:boolean
+
+
+
ru
- Тело запроса данные формы
+ История
v8:ValueTable
-
+
ru
- Активно
+ Временная метка
- xs:boolean
+ xs:decimal
+
+ 15
+ 0
+ Nonnegative
+
-
+
ru
- Тип
+ Дата
+
+
+
+ xs:dateTime
+
+ DateTime
+
+
+
+
+
+
+ ru
+ Код состояния
+
+
+
+ xs:decimal
+
+ 3
+ 0
+ Nonnegative
+
+
+
+
+
+
+ ru
+ Схема
xs:string
- 10
+ 8
Variable
-
+
ru
- Ключ
+ Протокол
xs:string
- 1000
+ 5
Variable
-
+
ru
- Значение
+ Хост
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ URN
@@ -3121,142 +4745,170 @@
+
+
+
+ ru
+ Контекст выполнения
+
+
+
+ xs:string
+
+ 10
+ Variable
+
+
+
-
+
ru
- Тело запроса файл
+ Сохранять в историю
- xs:string
-
- 0
- Variable
-
+ xs:boolean
-
+
ru
- Разделитель
+ Файл monaco
xs:string
- 1000
+ 0
Variable
-
+
ru
- Дополнительно
+ Форматировать
-
+
+ xs:boolean
+
-
+
ru
- Имя файла тела
+ Формат тела ответа
xs:string
- 0
+ 100
Variable
-
+
ru
- Использовать сессию
+ Протокол прокси
- xs:boolean
+ xs:string
+
+ 5
+ Variable
+
-
+
ru
- Количество
+ Ключ доступа AWS
xs:string
- 0
+ 1000
Variable
-
+
ru
- Порог перенаправлений
+ Секретный ключ AWS
- xs:decimal
-
- 2
- 0
- Nonnegative
-
+ xs:string
+
+ 1000
+ Variable
+
-
+
ru
- Поддержка cookie
+ Регион AWS
- xs:boolean
+ xs:string
+
+ 100
+ Variable
+
-
+
ru
- Поддержка сжатого ответа
+ Сервис AWS
- xs:boolean
+ xs:string
+
+ 100
+ Variable
+
-
+
ru
- Тело ответа в файл
+ Идентификатор Hawk
- xs:boolean
+ xs:string
+
+ 0
+ Variable
+
-
+
ru
- Имя файла тела ответа
+ Ключ Hawk
@@ -3267,80 +4919,41 @@
-
+
ru
- Токен авторизации
+ Делегирование Hawk
xs:string
- 255
+ 0
Variable
-
+
ru
- Тело запроса данные HTMLФормы
+ Дополнительные данные Hawk
- v8:ValueTable
+ xs:string
+
+ 0
+ Variable
+
-
-
-
-
- ru
- Активно
-
-
-
- xs:boolean
-
-
-
-
-
- ru
- Ключ
-
-
-
- xs:string
-
- 1000
- Variable
-
-
-
-
-
-
- ru
- Значение
-
-
-
- xs:string
-
- 0
- Variable
-
-
-
-
-
+
ru
- Ответ картинка
+ Идентификатор приложения Hawk
@@ -3351,26 +4964,22 @@
-
+
ru
- Формат тела ответа
+ Перенаправление как GET
- xs:string
-
- 100
- Variable
-
+ xs:boolean
-
+
ru
- Ответ HTML
+ Агент пользователя
@@ -3381,111 +4990,129 @@
-
+
ru
- Ответ JSON
+ Способ повторного выполнения
- fd:FormattedDocument
+ xs:string
+
+ 100
+ Variable
+
-
+
ru
- Время выполнения
+ Длительность паузы повторного выполнения
xs:decimal
- 15
- 2
+ 4
+ 0
Nonnegative
-
+
ru
- Размер ответа
+ Коэффициент увеличения паузы повторного выполнения
xs:decimal
- 15
- 2
+ 4
+ 0
Nonnegative
-
+
ru
- Разделы консоли
+ Порог количества попыток повторного выполнения
-
- xs:string
-
- 100
- Variable
-
+
+ xs:decimal
+
+ 2
+ 0
+ Nonnegative
+
-
+
ru
- Использовать прокси
+ Максимальная длительность паузы повторного выполнения
- xs:boolean
+ xs:decimal
+
+ 4
+ 0
+ Nonnegative
+
-
+
ru
- Сервер прокси
+ Коды состояния ответа повторного выполнения
- xs:string
-
- 0
- Variable
-
+ v8:ValueListType
+
+ КодыСостоянияОтветаПовторногоВыполнения.Picture
+ КодыСостоянияОтветаПовторногоВыполнения.ValueType
+
+
+ xs:decimal
+
+ 10
+ 0
+ Any
+
+
-
+
ru
- Порт прокси
+ Таймаут
xs:decimal
- 5
+ 3
0
Nonnegative
-
+
ru
- Пользователь прокси
+ Имя файла клиентского сертификата
@@ -3495,12 +5122,13 @@
Variable
+ ShowError
-
+
ru
- Пароль прокси
+ Имя файла сертификатов УЦ
@@ -3511,178 +5139,52 @@
-
-
-
- ru
- Использовать аутентификацию ОСПрокси
-
-
-
- xs:boolean
-
-
-
+
ru
- Не использовать прокси для локальных адресов
+ Использовать сертификаты
xs:boolean
-
+
ru
- Выполнять на сервере
+ Пароль клиентского сертификата
- xs:boolean
+ xs:string
+
+ 0
+ Variable
+
-
+
ru
- История
+ Пароль файла сертификатов УЦ
- v8:ValueTable
+ xs:string
+
+ 0
+ Variable
+
-
-
-
-
- ru
- Временная метка
-
-
-
- xs:decimal
-
- 15
- 0
- Nonnegative
-
-
-
-
-
-
- ru
- Дата
-
-
-
- xs:dateTime
-
- DateTime
-
-
-
-
-
-
- ru
- Код состояния
-
-
-
- xs:decimal
-
- 3
- 0
- Nonnegative
-
-
-
-
-
-
- ru
- Схема
-
-
-
- xs:string
-
- 8
- Variable
-
-
-
-
-
-
- ru
- Протокол
-
-
-
- xs:string
-
- 5
- Variable
-
-
-
-
-
-
- ru
- Хост
-
-
-
- xs:string
-
- 0
- Variable
-
-
-
-
-
-
- ru
- URN
-
-
-
- xs:string
-
- 0
- Variable
-
-
-
-
-
-
- ru
- Контекст выполнения
-
-
-
- xs:string
-
- 10
- Variable
-
-
-
-
-
+
ru
- Сохранять в историю
+ Отображать секреты
@@ -3905,20 +5407,20 @@
F7
ВыполнитьЗапрос
-
+
ru
- Показать пароль авторизации
+ Показать пароль аутентификации
ru
- Показать пароль авторизации
+ Показать пароль аутентификации
- ПоказатьПарольАвторизации
+ ПоказатьПарольАутентификации
@@ -4121,20 +5623,110 @@
ПоказатьПарольПрокси
-
+
+
+
+ ru
+ Показать токен аутентификации
+
+
+
+
+ ru
+ Показать токен аутентификации
+
+
+ ПоказатьТокенАутентификации
+
+
+
+
+ ru
+ Перезагрузить редактор Monaco
+
+
+
+
+ ru
+ Извлечь monaco
+
+
+ ИзвлечьMonaco
+
+
+
+
+ ru
+ Показать секретный ключ
+
+
+
+
+ ru
+ Показать секретный ключ
+
+
+ ПоказатьСекретныйКлючAWS
+
+
+
+
+ ru
+ Показать ключ
+
+
+
+
+ ru
+ Показать ключ hawk
+
+
+ ПоказатьКлючHawk
+
+
+
+
+ ru
+ Объединить сертификат и ключ
+
+
+
+
+ ru
+ Объединить файлы сертификата и ключа в один
+
+
+ ОбъединитьСертификатИКлюч
+
+
+
+
+ ru
+ Показать пароль клиентского сертификата
+
+
+
+
+ ru
+ Показать пароль клиентского сертификата
+
+
+ ПоказатьПарольКлиентскогоСертификата
+
+
ru
- Показать токен авторизации
+ Показать пароль файла сертификатов УЦ
ru
- Показать токен авторизации
+ Показать пароль файла сертификатов УЦ
- ПоказатьТокенАвторизации
+ ПоказатьПарольФайлаСертификатовУЦ
diff --git "a/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" "b/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl"
index 075d211..2b5f73a 100644
--- "a/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl"
+++ "b/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl"
@@ -17,16 +17,30 @@
ИспользоватьСессию = Ложь;
ПоддержкаCookie = Ложь;
ПорогПеренаправлений = 10;
+ ПорогКоличестваПопытокПовторногоВыполнения = 9;
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения = 600;
- РазделыКонсоли = Элементы.РазделыКонсоли.СписокВыбора[0];
- Схема = Элементы.Схема.СписокВыбора[0];
- ТипАвторизации = Элементы.ТипАвторизации.СписокВыбора[0];
+ Для Каждого КЗ Из КлиентHTTPПовтИсп.РегионыAWS() Цикл
+ Элементы.РегионAWS.СписокВыбора.Добавить(КЗ.Значение);
+ КонецЦикла;
+
+ РазделыКонсоли = Элементы.РазделыКонсоли.СписокВыбора[0].Значение;
+ Схема = Элементы.Схема.СписокВыбора[0].Значение;
+ ТипАутентификации = Элементы.ТипАутентификации.СписокВыбора[0].Значение;
+ AWSРегион = Элементы.РегионAWS.СписокВыбора[0].Значение;
ТипТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора[0].Значение;
- ТипТелаЗапросаКакЕсть = Элементы.ТипТелаЗапросаКакЕсть.СписокВыбора[0];
- ФорматТелаОтвета = Элементы.ФорматТелаОтвета.СписокВыбора[0];
+ ТипТелаЗапросаКакЕсть = Элементы.ТипТелаЗапросаКакЕсть.СписокВыбора[0].Значение;
+ ФорматТелаОтвета = Элементы.ФорматТелаОтвета.СписокВыбора[0].Значение;
+ СпособПовторногоВыполнения = Элементы.СпособПовторногоВыполнения.СписокВыбора[0].Значение;
+ ПротоколПрокси = Элементы.ПротоколПрокси.СписокВыбора[0].Значение;
ИдентификаторРесурса = "https://ya.ru";
- Дополнительно = Новый Структура("Сессия, История", Новый Структура("Печенье", Новый Соответствие), Новый Соответствие);
+ Дополнительно = Новый Структура("ИдентификаторЭкземпляраКонсоли, Сессия, История, АдресМакетаMonaco, MonacoГотов, КаталогMonaco, ФайлКода1С");
+ Дополнительно.ИдентификаторЭкземпляраКонсоли = СтрЗаменить(XMLСтрока(Новый УникальныйИдентификатор()), "-", "");
+ Дополнительно.Сессия = НоваяСессия();
+ Дополнительно.История = Новый Соответствие;
+ Дополнительно.АдресМакетаMonaco = ПоместитьВоВременноеХранилище(ПолучитьМакет("MonacoEditor"), Новый УникальныйИдентификатор);
+ Дополнительно.MonacoГотов = Ложь;
КонецПроцедуры
&НаКлиенте
@@ -36,6 +50,13 @@
ОткрытьФорму("Обработка.КонсольКлиентаHTTP.Форма.ФормаМП");
Возврат;
#КонецЕсли
+
+ ИнициализироватьMonaco();
+КонецПроцедуры
+
+&НаКлиенте
+Асинх Процедура ПриЗакрытии(ЗавершениеРаботы)
+ Ждать УдалитьФайлыАсинх(Дополнительно.КаталогMonaco, СтрШаблон("%1*.*", Дополнительно.ИдентификаторЭкземпляраКонсоли));
КонецПроцедуры
#КонецОбласти
@@ -57,26 +78,48 @@
КонецПроцедуры
&НаКлиенте
-Процедура ТипАвторизацииПриИзменении(Элемент)
+Процедура ТипАутентификацииПриИзменении(Элемент)
+ ТипАутентификацииСписокВыбора = Элементы.ТипАутентификации.СписокВыбора;
ОтображатьПользовательПароль = (
- ТипАвторизации = Элементы.ТипАвторизации.СписокВыбора[1].Значение
- ИЛИ ТипАвторизации = Элементы.ТипАвторизации.СписокВыбора[2].Значение
- ИЛИ ТипАвторизации = Элементы.ТипАвторизации.СписокВыбора[3].Значение
+ ТипАутентификации = ТипАутентификацииСписокВыбора[1].Значение
+ ИЛИ ТипАутентификации = ТипАутентификацииСписокВыбора[2].Значение
+ ИЛИ ТипАутентификации = ТипАутентификацииСписокВыбора[3].Значение
);
- ОтображатьТокен = (ТипАвторизации = Элементы.ТипАвторизации.СписокВыбора[4].Значение);
+ ОтображатьТокен = (ТипАутентификации = ТипАутентификацииСписокВыбора[4].Значение);
+ ОтображатьAWS4 = (ТипАутентификации = ТипАутентификацииСписокВыбора[5].Значение);
+ ОтображатьHawk = (ТипАутентификации = ТипАутентификацииСписокВыбора[6].Значение);
- Элементы.ПоказатьПарольАвторизации.Пометка = Истина;
+ Элементы.ПоказатьПарольАутентификации.Пометка = Истина;
- ИзменитьРежимОтображенияПароля(Элементы.ПоказатьПарольАвторизации, Элементы.ПарольАвторизации);
+ ПоказатьПарольАутентификации(Неопределено);
- Элементы.ПользовательАвторизации.Видимость = ОтображатьПользовательПароль;
- Элементы.ГруппаПарольАвторизации.Видимость = ОтображатьПользовательПароль;
+ Элементы.ПользовательАутентификации.Видимость = ОтображатьПользовательПароль;
+ Элементы.ГруппаПарольАутентификации.Видимость = ОтображатьПользовательПароль;
- Элементы.ПоказатьТокенАвторизации.Пометка = Истина;
+ Элементы.ПоказатьТокенАутентификации.Пометка = Истина;
- ИзменитьРежимОтображенияПароля(Элементы.ПоказатьТокенАвторизации, Элементы.ТокенАвторизации);
+ ПоказатьТокенАутентификации(Неопределено);
- Элементы.ГруппаТокенАвторизации.Видимость = ОтображатьТокен;
+ Элементы.ГруппаТокенАутентификации.Видимость = ОтображатьТокен;
+
+ Элементы.ПоказатьСекретныйКлючAWS.Пометка = Истина;
+
+ ПоказатьСекретныйКлючAWS(Неопределено);
+
+ Элементы.КлючДоступаAWS.Видимость = ОтображатьAWS4;
+ Элементы.ГруппаСекретныйКлючAWS.Видимость = ОтображатьAWS4;
+ Элементы.РегионAWS.Видимость = ОтображатьAWS4;
+ Элементы.СервисAWS.Видимость = ОтображатьAWS4;
+
+ Элементы.ПоказатьКлючHawk.Пометка = Истина;
+
+ ПоказатьКлючHawk(Неопределено);
+
+ Элементы.ИдентификаторHawk.Видимость = ОтображатьHawk;
+ Элементы.ГруппаКлючHawk.Видимость = ОтображатьHawk;
+ Элементы.ДополнениеHawk.Видимость = ОтображатьHawk;
+ Элементы.ИдентификаторПриложенияHawk.Видимость = ОтображатьHawk;
+ Элементы.ДелегированиеHawk.Видимость = ОтображатьHawk;
КонецПроцедуры
&НаКлиенте
@@ -103,7 +146,7 @@
Процедура СгенерироватьКод(Элемент)
ОткрытьФорму(
"Обработка.КонсольКлиентаHTTP.Форма.РедакторТекстовогоПоля",
- Новый Структура("Текст", КодЗапросаКонсоли()),
+ ПараметрыОткрытияФормыКодогенерации(КодЗапросаКонсоли()),
ЭтотОбъект, , , , ,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца
);
@@ -136,22 +179,29 @@
СообщитьПользователю("Необходимо указать имя прокси-сервера", "СерверПрокси");
Возврат;
КонецЕсли;
+ Если ИспользоватьСертификаты И ПустаяСтрока(ИмяФайлаКлиентскогоСертификата) Тогда
+ Элементы.Основная.ТекущаяСтраница = Элементы.СтраницаНастройки;
+
+ СообщитьПользователю("Укажите путь к файлу клиентского сертификата", "ИмяФайлаКлиентскогоСертификата");
+ Возврат;
+ КонецЕсли;
+ Если ТелоОтветаВФайл И ПустаяСтрока(ИмяФайлаТелаОтвета) Тогда
+ Элементы.Основная.ТекущаяСтраница = Элементы.СтраницаНастройки;
+
+ СообщитьПользователю("Укажите путь к файлу ответа", "ИмяФайлаТелаОтвета");
+ Возврат;
+ КонецЕсли;
- ПЗ = МножествоПараметровЗапроса();
- ДП = ДополнительныеПараметрыЗапроса();
-
- ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
- Результат = Ждать РезультатВыполненногоЗапроса(ПЗ, ДП);
-
- ЗафиксироватьВремяВыполненияЗапроса(ВремяНачала);
- ОбработатьОтвет(Результат.Ответ);
+ Ответ = ?(
+ ВыполнятьНаСервере,
+ ВыполнитьЗапросНаСервере(),
+ Ждать ВыполнитьЗапросНаКлиенте()
+ );
- Если ИспользоватьСессию И ПоддержкаCookie Тогда
- КлиентHTTPКлиентСервер.СкопироватьПеченье(Дополнительно, Результат.ДополнительныеПараметры);
- КонецЕсли;
+ ОбработатьОтвет(Ответ);
Если СохранятьВИсторию Тогда
- ДобавитьВИсторию(Результат.Ответ);
+ ДобавитьВИсторию(Ответ);
КонецЕсли;
РазделыКонсоли = Элементы.РазделыКонсоли.СписокВыбора[1];
@@ -178,13 +228,23 @@
КонецПроцедуры
&НаКлиенте
-Процедура ПоказатьПарольАвторизации(Команда)
- ИзменитьРежимОтображенияПароля(Элементы.ПоказатьПарольАвторизации, Элементы.ПарольАвторизации);
+Процедура ПоказатьПарольАутентификации(Команда)
+ ИзменитьРежимОтображенияПароля(Элементы.ПоказатьПарольАутентификации, Элементы.ПарольАутентификации);
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПоказатьТокенАутентификации(Команда)
+ ИзменитьРежимОтображенияПароля(Элементы.ПоказатьТокенАутентификации, Элементы.ТокенАутентификации);
КонецПроцедуры
&НаКлиенте
-Процедура ПоказатьТокенАвторизации(Команда)
- ИзменитьРежимОтображенияПароля(Элементы.ПоказатьТокенАвторизации, Элементы.ТокенАвторизации);
+Процедура ПоказатьСекретныйКлючAWS(Команда)
+ ИзменитьРежимОтображенияПароля(Элементы.ПоказатьСекретныйКлючAWS, Элементы.СекретныйКлючAWS);
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПоказатьКлючHawk(Команда)
+ ИзменитьРежимОтображенияПароля(Элементы.ПоказатьКлючHawk, Элементы.КлючHawk);
КонецПроцедуры
&НаКлиенте
@@ -200,7 +260,7 @@
ОткрытьФорму(
"Обработка.КонсольКлиентаHTTP.Форма.РедакторТекстовогоПоля",
- Новый Структура("ЗаголовокФормы", "Команда curl"),
+ ПараметрыОткрытияФормыКомандыCurl(КомандаCurlЗапросаКонсоли()),
ЭтотОбъект, , , ,
Оповещение,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца
@@ -504,19 +564,54 @@
#Область ОТВЕТ
#Область ОбработчикиСобытийЭлементовШапкиФормы
+&НаКлиенте
+Процедура ОтветMonacoДокументСформирован(Элемент)
+ View().setOption("autoResizeEditorLayout", Истина);
+ View().wordWrap(true);
+ View().hideScrollX();
+ View().hideScrollY();
+ View().setReadOnly(Ложь);
+ View().eraseText();
+ УстановитьФорматТекста("text");
+ View().setReadOnly(Истина);
+КонецПроцедуры
+
&НаКлиенте
Процедура ФорматТелаОтветаПриИзменении(Элемент)
ФорматТелаОтветаСписокВыбора = Элементы.ФорматТелаОтвета.СписокВыбора;
Если ФорматТелаОтвета = ФорматТелаОтветаСписокВыбора[0].Значение Тогда // Текст
Элементы.ГруппаФорматыТелаОтвета.ТекущаяСтраница = Элементы.ФорматТелаОтветаТекст;
- ИначеЕсли ФорматТелаОтвета = ФорматТелаОтветаСписокВыбора[1].Значение Тогда // JSON
- Элементы.ГруппаФорматыТелаОтвета.ТекущаяСтраница = Элементы.ФорматТелаОтветаJSON;
- ИначеЕсли ФорматТелаОтвета = ФорматТелаОтветаСписокВыбора[2].Значение Тогда // HTML
+ ИначеЕсли ФорматТелаОтвета = ФорматТелаОтветаСписокВыбора[1].Значение Тогда // HTML
Элементы.ГруппаФорматыТелаОтвета.ТекущаяСтраница = Элементы.ФорматТелаОтветаHTML;
- ИначеЕсли ФорматТелаОтвета = ФорматТелаОтветаСписокВыбора[3].Значение Тогда // Картинка
+ ИначеЕсли ФорматТелаОтвета = ФорматТелаОтветаСписокВыбора[2].Значение Тогда // Картинка
Элементы.ГруппаФорматыТелаОтвета.ТекущаяСтраница = Элементы.ФорматТелаОтветаКартинка;
КонецЕсли;
КонецПроцедуры
+
+&НаКлиенте
+Процедура ФорматироватьТекстТелаОтветаПриИзменении(Элемент)
+ Элементы.ГруппаФорматыТекстаТелаОтвета.ТекущаяСтраница = ?(
+ ФорматироватьТекстТелаОтвета,
+ Элементы.ТекстТелаОтветаФорматированный,
+ Элементы.ТекстТелаОтветаКакТекст
+ );
+ Элементы.ФорматТекстТелаОтвета.Видимость = ФорматироватьТекстТелаОтвета;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ФорматТекстТелаОтветаПриИзменении(Элемент)
+ ФорматТекстТелаОтветаСписокВыбора = Элементы.ФорматТекстТелаОтвета.СписокВыбора;
+ Если ФорматТекстТелаОтвета = ФорматТекстТелаОтветаСписокВыбора[0].Значение Тогда // JSON
+ ФорматТекста = "json";
+ ИначеЕсли ФорматТекстТелаОтвета = ФорматТекстТелаОтветаСписокВыбора[1].Значение Тогда // XML
+ ФорматТекста = "xml";
+ ИначеЕсли ФорматТекстТелаОтвета = ФорматТекстТелаОтветаСписокВыбора[2].Значение Тогда // HTML
+ ФорматТекста = "html";
+ Иначе
+ ФорматТекста = "text";
+ КонецЕсли;
+ УстановитьФорматТекста(ФорматТекста);
+КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
@@ -543,6 +638,11 @@
ИзменитьКонтекстВыполненияЗапроса();
КонецПроцедуры
+&НаКлиенте
+Процедура ТелоОтветаВФайлПриИзменении(Элемент)
+ Элементы.ИмяФайлаТелаОтвета.Доступность = ТелоОтветаВФайл;
+КонецПроцедуры
+
&НаКлиенте
Процедура ИмяФайлаТелаОтветаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
Если ВыполнятьНаСервере Тогда
@@ -555,11 +655,6 @@
ПоказатьДиалогСохраненияФайла(Оповещение, "Выбор файла для сохранения");
КонецПроцедуры
-&НаКлиенте
-Процедура ИмяФайлаТелаОтветаПриИзменении(Элемент)
- ТелоОтветаВФайл = НЕ ПустаяСтрока(ИмяФайлаТелаОтвета);
-КонецПроцедуры
-
&НаКлиенте
Процедура ИспользоватьСессиюПриИзменении(Элемент)
Элементы.ГруппаНастройкиСессии.Доступность = ИспользоватьСессию;
@@ -572,9 +667,93 @@
Элементы.ОткрытьCookies.Доступность = (ИспользоватьСессию И ПоддержкаCookie);
КонецПроцедуры
+&НаКлиенте
+Процедура СпособПовторногоВыполненияПриИзменении(Элемент)
+ СпособыПовторногоВыполнения = Элементы.СпособПовторногоВыполнения.СписокВыбора;
+
+ Элементы.ГруппаПараметрыПовторногоВыполнения.Доступность = СпособПовторногоВыполнения <> СпособыПовторногоВыполнения[0].Значение; // Разово
+ Элементы.КоэффициентУвеличенияПаузыПовторногоВыполнения.Видимость = СпособПовторногоВыполнения <> СпособыПовторногоВыполнения[1].Значение; // Фиксировано
+
+ Если СпособПовторногоВыполнения = СпособыПовторногоВыполнения[2].Значение Тогда // Линейно
+ ДлительностьПаузыПовторногоВыполнения = ?(ДлительностьПаузыПовторногоВыполнения < 1, 1, ДлительностьПаузыПовторногоВыполнения);
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения = ?(МаксимальнаяДлительностьПаузыПовторногоВыполнения < 1, 1, МаксимальнаяДлительностьПаузыПовторногоВыполнения);
+
+ Элементы.ДлительностьПаузыПовторногоВыполнения.МинимальноеЗначение = 1;
+ Элементы.МаксимальнаяДлительностьПаузыПовторногоВыполнения.МинимальноеЗначение = 1;
+ Элементы.КоэффициентУвеличенияПаузыПовторногоВыполнения.МинимальноеЗначение = 0;
+ ИначеЕсли СпособПовторногоВыполнения = СпособыПовторногоВыполнения[3].Значение Тогда // Экспоненциально
+ ДлительностьПаузыПовторногоВыполнения = ?(ДлительностьПаузыПовторногоВыполнения < 1, 1, ДлительностьПаузыПовторногоВыполнения);
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения = ?(МаксимальнаяДлительностьПаузыПовторногоВыполнения < 1, 1, МаксимальнаяДлительностьПаузыПовторногоВыполнения);
+ КоэффициентУвеличенияПаузыПовторногоВыполнения = ?(КоэффициентУвеличенияПаузыПовторногоВыполнения < 1, 1, КоэффициентУвеличенияПаузыПовторногоВыполнения);
+
+ Элементы.ДлительностьПаузыПовторногоВыполнения.МинимальноеЗначение = 1;
+ Элементы.МаксимальнаяДлительностьПаузыПовторногоВыполнения.МинимальноеЗначение = 1;
+ Элементы.КоэффициентУвеличенияПаузыПовторногоВыполнения.МинимальноеЗначение = 1;
+ Иначе
+ Элементы.ДлительностьПаузыПовторногоВыполнения.МинимальноеЗначение = 0;
+ Элементы.МаксимальнаяДлительностьПаузыПовторногоВыполнения.МинимальноеЗначение = 0;
+ Элементы.КоэффициентУвеличенияПаузыПовторногоВыполнения.МинимальноеЗначение = 0;
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ИспользоватьСертификатыПриИзменении(Элемент)
+ Элементы.ГруппаКлиентскийСертификат.Доступность = ИспользоватьСертификаты;
+ Элементы.ГруппаПарольКлиентскогоСертификата.Доступность = ИспользоватьСертификаты;
+ Элементы.ИмяФайлаСертификатовУЦ.Доступность = ИспользоватьСертификаты;
+ Элементы.ГруппаПарольФайлаСертификатовУЦ.Доступность = ИспользоватьСертификаты;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ИмяФайлаКлиентскогоСертификатаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
+ Если ВыполнятьНаСервере Тогда
+ Возврат;
+ КонецЕсли;
+
+ СтандартнаяОбработка = Ложь;
+ Оповещение = Новый ОписаниеОповещения("ВыборФайлаКлиентсткогоСертификатаЗавершение", ЭтотОбъект);
+
+ ПоказатьДиалогВыбораФайла(Оповещение, "Выбор файла сертификата", "PEM (*.crt)|*.crt|PEM (*.pem)|*.pem|PEM (*.cer)|*.cer|PKCS#12 (*.p12)|*.p12|PKCS#12 (*.pfx)|*.pfx|Все файлы|*.*");
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ОбъединитьСертификатИКлюч(Команда)
+ Оповещение = Новый ОписаниеОповещения("ОбъединениеСертификатаИКлючаЗавершение", ЭтотОбъект);
+
+ ОткрытьФорму(
+ "Обработка.КонсольКлиентаHTTP.Форма.ФормаОбъединенияСертификатаИКлюча",
+ Новый Структура("Сертификат", ИмяФайлаКлиентскогоСертификата),
+ ЭтотОбъект, , , ,
+ Оповещение,
+ РежимОткрытияОкнаФормы.БлокироватьОкноВладельца
+ );
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПоказатьПарольКлиентскогоСертификата(Команда)
+ ИзменитьРежимОтображенияПароля(Элементы.ПоказатьПарольКлиентскогоСертификата, Элементы.ПарольКлиентскогоСертификата);
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ИмяФайлаСертификатовУЦНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
+ Если ВыполнятьНаСервере Тогда
+ Возврат;
+ КонецЕсли;
+
+ СтандартнаяОбработка = Ложь;
+ Оповещение = Новый ОписаниеОповещения("ВыборФайлаСертификатовУЦЗавершение", ЭтотОбъект);
+
+ ПоказатьДиалогВыбораФайла(Оповещение, "Выбор файла сертификата", "PEM (*.crt)|*.crt|PEM (*.pem)|*.pem|PEM (*.cer)|*.cer|PKCS#12 (*.p12)|*.p12|PKCS#12 (*.pfx)|*.pfx|Все файлы|*.*");
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПоказатьПарольФайлаСертификатовУЦ(Команда)
+ ИзменитьРежимОтображенияПароля(Элементы.ПоказатьПарольФайлаСертификатовУЦ, Элементы.ПарольФайлаСертификатовУЦ);
+КонецПроцедуры
+
&НаКлиенте
Процедура ИспользоватьПроксиПриИзменении(Элемент)
- Элементы.СерверПрокси.Доступность = ИспользоватьПрокси;
+ Элементы.ГруппаСерверПрокси.Доступность = ИспользоватьПрокси;
Элементы.ПортПрокси.Доступность = ИспользоватьПрокси;
Элементы.ПользовательПрокси.Доступность = ИспользоватьПрокси;
Элементы.ГруппаПарольПрокси.Доступность = ИспользоватьПрокси;
@@ -594,6 +773,20 @@
Процедура ПоказатьПарольПрокси(Команда)
ИзменитьРежимОтображенияПароля(Элементы.ПоказатьПарольПрокси, Элементы.ПарольПрокси);
КонецПроцедуры
+
+&НаКлиенте
+Асинх Процедура ИзвлечьMonaco(Команда)
+ ИмяКаталога = Ждать КаталогВременныхФайловАсинх();
+ КаталогИсходников = КаталогИсходниковMonaco(ИмяКаталога);
+ Ждать СоздатьКаталогАсинх(КаталогИсходников);
+ ФайлНаДиске = Новый Файл(КаталогИсходников + "index.html");
+ Ждать ИзвлечьИсходники(КаталогИсходников, Ложь);
+ Если НЕ Ждать ФайлНаДиске.СуществуетАсинх() Тогда
+ Дополнительно.MonacoГотов = Ложь;
+ ПредупреждениеАсинх("Не удалось инициализировать monaco editor");
+ Возврат;
+ КонецЕсли;
+КонецПроцедуры
#КонецОбласти
#КонецОбласти
@@ -620,68 +813,122 @@
ОбъектИстории = Дополнительно.История.Получить(Стр.ВременнаяМетка);
#Область Заполнение_конфигурации_Консоли
- ВыполнятьНаСервере = НЕ ОбъектИстории.ВыполнятьНаСервере;
- ТелоОтветаВФайл = ОбъектИстории.ТелоОтветаВФайл;
- ИмяФайлаТелаОтвета = ОбъектИстории.ИмяФайлаТелаОтвета;
- ПоддержкаСжатогоОтвета = ОбъектИстории.ПоддержкаСжатогоОтвета;
- ИспользоватьСессию = ОбъектИстории.ИспользоватьСессию;
- Дополнительно.Сессия = ОбъектИстории.Сессия;
- ПорогПеренаправлений = ОбъектИстории.ПорогПеренаправлений;
- ПоддержкаCookie = ОбъектИстории.ПоддержкаCookie;
- ИспользоватьПрокси = ОбъектИстории.ИспользоватьПрокси;
- НеИспользоватьПроксиДляЛокальныхАдресов = ОбъектИстории.НеИспользоватьПроксиДляЛокальныхАдресов;
- СерверПрокси = ОбъектИстории.СерверПрокси;
- ПортПрокси = ОбъектИстории.ПортПрокси;
- ПользовательПрокси = ОбъектИстории.ПользовательПрокси;
- ПарольПрокси = ОбъектИстории.ПарольПрокси;
- ИспользоватьАутентификациюОСПрокси = ОбъектИстории.ИспользоватьАутентификациюОСПрокси;
+ КодыСостояния = Новый Массив;
+
+ ОбъектИстории.Свойство("ВыполнятьНаСервере", ВыполнятьНаСервере);
+ ОбъектИстории.Свойство("ТелоОтветаВФайл", ТелоОтветаВФайл);
+ ОбъектИстории.Свойство("ИмяФайлаТелаОтвета", ИмяФайлаТелаОтвета);
+ ОбъектИстории.Свойство("ПоддержкаСжатогоОтвета", ПоддержкаСжатогоОтвета);
+ ОбъектИстории.Свойство("АгентПользователя", АгентПользователя);
+ ОбъектИстории.Свойство("Таймаут", Таймаут);
+ ОбъектИстории.Свойство("ИспользоватьСессию", ИспользоватьСессию);
+ ОбъектИстории.Свойство("Сессия", Дополнительно.Сессия);
+ ОбъектИстории.Свойство("ПорогПеренаправлений", ПорогПеренаправлений);
+ ОбъектИстории.Свойство("ПеренаправлениеКакGET", ПеренаправлениеКакGET);
+ ОбъектИстории.Свойство("ПоддержкаCookie", ПоддержкаCookie);
+ ОбъектИстории.Свойство("СпособПовторногоВыполнения", СпособПовторногоВыполнения);
+ ОбъектИстории.Свойство("ДлительностьПаузыПовторногоВыполнения", ДлительностьПаузыПовторногоВыполнения);
+ ОбъектИстории.Свойство("КоэффициентУвеличенияПаузыПовторногоВыполнения", КоэффициентУвеличенияПаузыПовторногоВыполнения);
+ ОбъектИстории.Свойство("ПорогКоличестваПопытокПовторногоВыполнения", ПорогКоличестваПопытокПовторногоВыполнения);
+ ОбъектИстории.Свойство("МаксимальнаяДлительностьПаузыПовторногоВыполнения", МаксимальнаяДлительностьПаузыПовторногоВыполнения);
+ ОбъектИстории.Свойство("МассивКодовСостоянияОтветаПовторногоВыполнения", КодыСостояния);
+ ОбъектИстории.Свойство("ИспользоватьСертификаты", ИспользоватьСертификаты);
+ ОбъектИстории.Свойство("ПарольКлиентскогоСертификата", ПарольКлиентскогоСертификата);
+ ОбъектИстории.Свойство("ИмяФайлаСертификатовУЦ", ИмяФайлаСертификатовУЦ);
+ ОбъектИстории.Свойство("ПарольФайлаСертификатовУЦ", ПарольФайлаСертификатовУЦ);
+ ОбъектИстории.Свойство("ИмяФайлаКлиентскогоСертификата", ИмяФайлаКлиентскогоСертификата);
+ ОбъектИстории.Свойство("ИспользоватьПрокси", ИспользоватьПрокси);
+ ОбъектИстории.Свойство("НеИспользоватьПроксиДляЛокальныхАдресов", НеИспользоватьПроксиДляЛокальныхАдресов);
+ ОбъектИстории.Свойство("ПротоколПрокси", ПротоколПрокси);
+ ОбъектИстории.Свойство("СерверПрокси", СерверПрокси);
+ ОбъектИстории.Свойство("ПортПрокси", ПортПрокси);
+ ОбъектИстории.Свойство("ПользовательПрокси", ПользовательПрокси);
+ ОбъектИстории.Свойство("ПарольПрокси", ПарольПрокси);
+ ОбъектИстории.Свойство("ИспользоватьАутентификациюОСПрокси", ИспользоватьАутентификациюОСПрокси);
+
+ ВыполнятьНаСервере = НЕ ВыполнятьНаСервере;
+
+ КодыСостоянияОтветаПовторногоВыполнения.Очистить();
+
+ Если Дополнительно.Сессия = Неопределено Тогда
+ Дополнительно.Сессия = НоваяСессия();
+ КонецЕсли;
+ Если НЕ ЗначениеЗаполнено(СпособПовторногоВыполнения) Тогда
+ СпособПовторногоВыполнения = Элементы.СпособПовторногоВыполнения.СписокВыбора[0];
+ КонецЕсли;
+ Если ЗначениеЗаполнено(КодыСостояния) Тогда
+ КодыСостоянияОтветаПовторногоВыполнения.ЗагрузитьЗначения(КодыСостояния);
+ КонецЕсли;
+ Если НЕ ЗначениеЗаполнено(ПротоколПрокси) Тогда
+ ПротоколПрокси = Элементы.ПротоколПрокси.СписокВыбора[0];
+ КонецЕсли;
ИзменитьКонтекстВыполненияЗапроса();
+ ТелоОтветаВФайлПриИзменении(Неопределено);
ИспользоватьСессиюПриИзменении(Неопределено);
+ СпособПовторногоВыполненияПриИзменении(Неопределено);
+ ИспользоватьСертификатыПриИзменении(Неопределено);
ИспользоватьПроксиПриИзменении(Неопределено);
#КонецОбласти
#Область Заполнение_запроса
- ИдентификаторРесурса = ОбъектИстории.URI;
+ ОбъектИстории.Свойство("URI", ИдентификаторРесурса);
ИдентификаторРесурсаПриИзменении(Неопределено);
- Схема = ОбъектИстории.Схема;
+ ОбъектИстории.Свойство("Схема", Схема);
ЗаголовкиЗапроса.Очистить();
- Для Каждого ЗаголовокЗапроса Из ОбъектИстории.ЗаголовкиЗапроса Цикл
+ ЗаголовкиИзИстории = Неопределено;
+ ОбъектИстории.Свойство("ЗаголовкиЗапроса", ЗаголовкиИзИстории);
+ Для Каждого ЗаголовокЗапроса Из ?(ЗаголовкиИзИстории = Неопределено, Новый Массив, ЗаголовкиИзИстории) Цикл
ЗаполнитьЗначенияСвойств(ЗаголовкиЗапроса.Добавить(), ЗаголовокЗапроса);
КонецЦикла;
- ТипАвторизации = ОбъектИстории.ТипАвторизации;
- ПользовательАвторизации = ОбъектИстории.ПользовательАвторизации;
- ПарольАвторизации = ОбъектИстории.ПарольАвторизации;
- ТокенАвторизации = ОбъектИстории.ТокенАвторизации;
-
- ТипАвторизацииПриИзменении(Неопределено);
-
- ТипТелаЗапроса = ОбъектИстории.ТипТелаЗапроса;
- ТелоЗапросаТекст = ОбъектИстории.ТелоЗапросаТекст;
- ТелоЗапросаФайл = ОбъектИстории.ТелоЗапросаФайл;
- Разделитель = ОбъектИстории.Разделитель;
+ ОбъектИстории.Свойство("ТипАутентификации", ТипАутентификации);
+ ОбъектИстории.Свойство("ПользовательАутентификации", ПользовательАутентификации);
+ ОбъектИстории.Свойство("ПарольАутентификации", ПарольАутентификации);
+ ОбъектИстории.Свойство("ТокенАутентификации", ТокенАутентификации);
+ ОбъектИстории.Свойство("AWSКлючДоступа", AWSКлючДоступа);
+ ОбъектИстории.Свойство("AWSСекретныйКлюч", AWSСекретныйКлюч);
+ ОбъектИстории.Свойство("AWSРегион", AWSРегион);
+ ОбъектИстории.Свойство("AWSСервис", AWSСервис);
+ ОбъектИстории.Свойство("HawkИдентификатор", HawkИдентификатор);
+ ОбъектИстории.Свойство("HawkКлюч", HawkКлюч);
+ ОбъектИстории.Свойство("HawkДополнение", HawkДополнение);
+ ОбъектИстории.Свойство("HawkИдентификаторПриложения", HawkИдентификаторПриложения);
+ ОбъектИстории.Свойство("HawkДелегирование", HawkДелегирование);
+
+ ТипАутентификацииПриИзменении(Неопределено);
+
+ ОбъектИстории.Свойство("ТипТелаЗапроса", ТипТелаЗапроса);
+ ОбъектИстории.Свойство("ТелоЗапросаТекст", ТелоЗапросаТекст);
+ ОбъектИстории.Свойство("ТелоЗапросаФайл", ТелоЗапросаФайл);
+ ОбъектИстории.Свойство("Разделитель", Разделитель);
ТипТелаЗапросаПриИзменении(Неопределено);
ТелоЗапросаДанныеФормы.Очистить();
- Для Каждого ЭлементФормы Из ОбъектИстории.ТелоФорма Цикл
+ ТелоФормаИзИстории = Неопределено;
+ ОбъектИстории.Свойство("ТелоФорма", ТелоФормаИзИстории);
+ Для Каждого ЭлементФормы Из ?(ТелоФормаИзИстории = Неопределено, Новый Массив, ТелоФормаИзИстории) Цикл
ЗаполнитьЗначенияСвойств(ТелоЗапросаДанныеФормы.Добавить(), ЭлементФормы);
КонецЦикла;
ТелоЗапросаДанныеHTMLФормы.Очистить();
- Для Каждого ЭлементФормы Из ОбъектИстории.ТелоHTMLФорма Цикл
+ ТелоHTMLФормаИзИстории = Неопределено;
+ ОбъектИстории.Свойство("ТелоHTMLФорма", ТелоHTMLФормаИзИстории);
+ Для Каждого ЭлементФормы Из ?(ТелоHTMLФормаИзИстории = Неопределено, Новый Массив, ТелоHTMLФормаИзИстории) Цикл
ЗаполнитьЗначенияСвойств(ТелоЗапросаДанныеHTMLФормы.Добавить(), ЭлементФормы);
КонецЦикла;
#КонецОбласти
#Область Заполнение_ответа
- ВремяВыполнения = ОбъектИстории.ВремяВыполнения;
+ ОбъектИстории.Свойство("ВремяВыполнения", ВремяВыполнения);
- ОбработатьОтвет(ОбъектИстории.Ответ);
+ Если ОбъектИстории.Свойство("Ответ") Тогда
+ ОбработатьОтвет(ОбъектИстории.Ответ);
+ КонецЕсли;
#КонецОбласти
РазделыКонсоли = Элементы.РазделыКонсоли.СписокВыбора[0].Значение;
@@ -716,20 +963,37 @@
#Область СлужебныеПроцедурыИФункции
&НаКлиенте
-Асинх Функция РезультатВыполненногоЗапроса(ПараметрыЗапроса, ДополнительныеПараметры)
- фРезультат = Новый Структура("Ответ, ДополнительныеПараметры");
+Асинх Функция ВыполнитьЗапросНаКлиенте()
+ ПЗ = МножествоПараметровЗапросаНаКлиенте();
+ ДП = ДополнительныеПараметрыЗапросаНаКлиенте();
+
+ Возврат Ждать РезультатВыполненногоЗапросаНаКлиенте(ПЗ, ДП);
+КонецФункции
+
+&НаСервере
+Функция ВыполнитьЗапросНаСервере()
+ ПЗ = МножествоПараметровЗапросаНаСервере();
+ ДП = ДополнительныеПараметрыЗапросаНаСервере();
+
+ Возврат РезультатВыполненногоЗапросаНаСервере(ПЗ, ДП);
+КонецФункции
+
+&НаКлиенте
+Асинх Функция РезультатВыполненногоЗапросаНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
+ Перем фРезультат;
+ ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
Схемы = Элементы.Схема.СписокВыбора;
Если Схема = Схемы[0].Значение Тогда // GET
- фРезультат.Ответ = ?(
- ВыполнятьНаСервере,
- ПолучитьНаСервере(ИдентификаторРесурса, ПараметрыЗапроса, ДополнительныеПараметры),
- Ждать ПолучитьНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
+ фРезультат = Ждать КлиентHTTPКлиентСервер.Получить(
+ ИдентификаторРесурса,
+ ПараметрыЗапроса,
+ ДополнительныеПараметры
);
ИначеЕсли Схема = Схемы[1].Значение Тогда // POST
- фРезультат.Ответ = Ждать ОтветВыполненногоЗапросаPOST(ПараметрыЗапроса, ДополнительныеПараметры);
+ фРезультат = Ждать ОтветВыполненногоЗапросаPOSTНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры);
ИначеЕсли Схема = Схемы[2].Значение Тогда // PUT
- фРезультат.Ответ = Ждать ОтветВыполненногоЗапросаPUT(ПараметрыЗапроса, ДополнительныеПараметры);
+ фРезультат = Ждать ОтветВыполненногоЗапросаPUTНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры);
ИначеЕсли Схема = Схемы[3].Значение Тогда // DELETE
ТипыТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора;
ТелоЗапроса = ?(
@@ -737,291 +1001,318 @@
ТелоЗапросаТекст,
""
);
- фРезультат.Ответ = ?(
- ВыполнятьНаСервере,
- УдалитьНаСервере(ИдентификаторРесурса, ТелоЗапроса, ПараметрыЗапроса, ДополнительныеПараметры),
- Ждать УдалитьНаКлиенте(ТелоЗапроса, ПараметрыЗапроса, ДополнительныеПараметры)
+ фРезультат = Ждать КлиентHTTPКлиентСервер.Удалить(
+ ИдентификаторРесурса,
+ ТелоЗапроса,
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
ИначеЕсли Схема = Схемы[4].Значение Тогда // HEAD
- фРезультат.Ответ = ?(
- ВыполнятьНаСервере,
- ПолучитьЗаголовкиНаСервере(ИдентификаторРесурса, ПараметрыЗапроса, ДополнительныеПараметры),
- Ждать ПолучитьЗаголовкиНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
+ фРезультат = Ждать КлиентHTTPКлиентСервер.ПолучитьЗаголовки(
+ ИдентификаторРесурса,
+ ПараметрыЗапроса,
+ ДополнительныеПараметры
);
ИначеЕсли Схема = Схемы[5].Значение Тогда // PATCH
- фРезультат.Ответ = Ждать ОтветВыполненногоЗапросаPATCH(ПараметрыЗапроса, ДополнительныеПараметры);
+ фРезультат = Ждать ОтветВыполненногоЗапросаPATCHНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры);
Иначе
ВызватьИсключение "Неизвестная схема запроса";
КонецЕсли;
- фРезультат.ДополнительныеПараметры = ДополнительныеПараметры;
+ ВремяВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах() - ВремяНачала;
+
+ Если ИспользоватьСессию И ПоддержкаCookie Тогда
+ КлиентHTTPКлиентСервер.СкопироватьПеченье(Дополнительно, ДополнительныеПараметры);
+ КонецЕсли;
Возврат фРезультат;
КонецФункции
-&НаКлиенте
-Асинх Функция ОтветВыполненногоЗапросаPOST(ПараметрыЗапроса, ДополнительныеПараметры)
+&НаСервере
+Функция РезультатВыполненногоЗапросаНаСервере(ПараметрыЗапроса, ДополнительныеПараметры)
Перем фРезультат;
+ ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
+ Схемы = Элементы.Схема.СписокВыбора;
+ Если Схема = Схемы[0].Значение Тогда // GET
+ фРезультат = КлиентHTTPКлиентСервер.Получить(
+ ИдентификаторРесурса,
+ ПараметрыЗапроса,
+ ДополнительныеПараметры
+ );
+ ИначеЕсли Схема = Схемы[1].Значение Тогда // POST
+ фРезультат = ОтветВыполненногоЗапросаPOSTНаСервере(ПараметрыЗапроса, ДополнительныеПараметры);
+ ИначеЕсли Схема = Схемы[2].Значение Тогда // PUT
+ фРезультат = ОтветВыполненногоЗапросаPUTНаСервере(ПараметрыЗапроса, ДополнительныеПараметры);
+ ИначеЕсли Схема = Схемы[3].Значение Тогда // DELETE
+ ТипыТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора;
+ ТелоЗапроса = ?(
+ ТипТелаЗапроса = ТипыТелаЗапроса[3].Значение, // raw
+ ТелоЗапросаТекст,
+ ""
+ );
+ фРезультат = КлиентHTTPКлиентСервер.Удалить(
+ ИдентификаторРесурса,
+ ТелоЗапроса,
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
+ );
+ ИначеЕсли Схема = Схемы[4].Значение Тогда // HEAD
+ фРезультат = КлиентHTTPКлиентСервер.ПолучитьЗаголовки(
+ ИдентификаторРесурса,
+ ПараметрыЗапроса,
+ ДополнительныеПараметры
+ );
+ ИначеЕсли Схема = Схемы[5].Значение Тогда // PATCH
+ фРезультат = ОтветВыполненногоЗапросаPATCHНаСервере(ПараметрыЗапроса, ДополнительныеПараметры);
+ Иначе
+ ВызватьИсключение "Неизвестная схема запроса";
+ КонецЕсли;
+
+ ВремяВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах() - ВремяНачала;
+
+ Если ИспользоватьСессию И ПоддержкаCookie Тогда
+ КлиентHTTPКлиентСервер.СкопироватьПеченье(Дополнительно, ДополнительныеПараметры);
+ КонецЕсли;
+
+ Возврат фРезультат;
+КонецФункции
+
+&НаКлиенте
+Асинх Функция ОтветВыполненногоЗапросаPOSTНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
ТипыТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора;
Если ТипТелаЗапроса = ТипыТелаЗапроса[0].Значение Тогда // none
- фРезультат = ?(
- ВыполнятьНаСервере,
- ОтправитьТекстНаСервере(ИдентификаторРесурса, "", ПараметрыЗапроса, ДополнительныеПараметры),
- Ждать ОтправитьТекстНаКлиенте("", ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат Ждать КлиентHTTPКлиентСервер.ОтправитьТекст(
+ ИдентификаторРесурса,
+ "",
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[1].Значение Тогда // form-data
- фРезультат = ?(
- ВыполнятьНаСервере,
- ОтправитьДанныеФормыНаСервере(ПараметрыЗапроса, ДополнительныеПараметры),
- Ждать ОтправитьДанныеФормыНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат Ждать КлиентHTTPКлиентСервер.ОтправитьДанныеФормы(
+ ИдентификаторРесурса,
+ Ждать ДанныеФормыТелаЗапросаНаКлиенте(),
+ ПараметрыОтправкиДанныхФормыНаКлиенте(ДополнительныеПараметры),
+ ПараметрыЗапроса
);
ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[2].Значение Тогда // x-www-form-urlencoded
- фРезультат = ?(
- ВыполнятьНаСервере,
- ОтправитьДанныеHTMLФормыНаСервере(ИдентификаторРесурса, ДанныеHTMLФормыТелаЗапроса(), ПараметрыЗапроса, ДополнительныеПараметры),
- Ждать ОтправитьДанныеHTMLФормыНаКлиенте(ДанныеHTMLФормыТелаЗапроса(), ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат Ждать КлиентHTTPКлиентСервер.ОтправитьДанныеHTMLФормы(
+ ИдентификаторРесурса,
+ ДанныеHTMLФормыТелаЗапросаНаКлиенте(),
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[3].Значение Тогда // raw
- фРезультат = ?(
- ВыполнятьНаСервере,
- ОтправитьТекстНаСервере(ИдентификаторРесурса, ТелоЗапросаТекст, ПараметрыЗапроса, ДополнительныеПараметры),
- Ждать ОтправитьТекстНаКлиенте(ТелоЗапросаТекст, ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат Ждать КлиентHTTPКлиентСервер.ОтправитьТекст(
+ ИдентификаторРесурса,
+ ТелоЗапросаТекст,
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[4].Значение Тогда // binary
- фРезультат = ?(
- ВыполнятьНаСервере,
- ОтправитьФайлНаСервере(ИдентификаторРесурса, ТелоЗапросаФайл, ПараметрыЗапроса, ДополнительныеПараметры),
- Ждать ОтправитьФайлНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат Ждать КлиентHTTPКлиентСервер.ОтправитьФайл(
+ ИдентификаторРесурса,
+ Новый Файл(ТелоЗапросаФайл),
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
Иначе
ВызватьИсключение СтрШаблон("Тип тела запроса %1 не поддерживается для %2", ТипТелаЗапроса, Схема);
КонецЕсли;
-
- Возврат фРезультат;
КонецФункции
-&НаКлиенте
-Асинх Функция ОтветВыполненногоЗапросаPUT(ПараметрыЗапроса, ДополнительныеПараметры)
- Перем фРезультат;
-
+&НаСервере
+Функция ОтветВыполненногоЗапросаPOSTНаСервере(ПараметрыЗапроса, ДополнительныеПараметры)
ТипыТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора;
Если ТипТелаЗапроса = ТипыТелаЗапроса[0].Значение Тогда // none
- фРезультат = ?(
- ВыполнятьНаСервере,
- ЗаписатьТекстНаСервере(ИдентификаторРесурса, "", ПараметрыЗапроса, ДополнительныеПараметры),
- Ждать ЗаписатьТекстНаКлиенте("", ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат КлиентHTTPКлиентСервер.ОтправитьТекст(
+ ИдентификаторРесурса,
+ "",
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
+ );
+ ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[1].Значение Тогда // form-data
+ Возврат КлиентHTTPКлиентСервер.ОтправитьДанныеФормы(
+ ИдентификаторРесурса,
+ ДанныеФормыТелаЗапросаНаСервере(),
+ ПараметрыОтправкиДанныхФормыНаСервере(ДополнительныеПараметры, Разделитель),
+ ПараметрыЗапроса
+ );
+ ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[2].Значение Тогда // x-www-form-urlencoded
+ Возврат КлиентHTTPКлиентСервер.ОтправитьДанныеHTMLФормы(
+ ИдентификаторРесурса,
+ ДанныеHTMLФормыТелаЗапросаНаСервере(),
+ ПараметрыЗапроса,
+ ДополнительныеПараметры
);
ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[3].Значение Тогда // raw
- фРезультат = ?(
- ВыполнятьНаСервере,
- ЗаписатьТекстНаСервере(ИдентификаторРесурса, ТелоЗапросаТекст, ПараметрыЗапроса, ДополнительныеПараметры),
- Ждать ЗаписатьТекстНаКлиенте(ТелоЗапросаТекст, ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат КлиентHTTPКлиентСервер.ОтправитьТекст(
+ ИдентификаторРесурса,
+ ТелоЗапросаТекст,
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[4].Значение Тогда // binary
- фРезультат = ?(
- ВыполнятьНаСервере,
- ЗаписатьФайлНаСервере(ИдентификаторРесурса, ТелоЗапросаФайл, ПараметрыЗапроса, ДополнительныеПараметры),
- Ждать ЗаписатьФайлНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат КлиентHTTPКлиентСервер.ОтправитьФайл(
+ ИдентификаторРесурса,
+ Новый Файл(ТелоЗапросаФайл),
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
Иначе
ВызватьИсключение СтрШаблон("Тип тела запроса %1 не поддерживается для %2", ТипТелаЗапроса, Схема);
КонецЕсли;
-
- Возврат фРезультат;
КонецФункции
&НаКлиенте
-Асинх Функция ОтветВыполненногоЗапросаPATCH(ПараметрыЗапроса, ДополнительныеПараметры)
- Перем фРезультат;
-
+Асинх Функция ОтветВыполненногоЗапросаPUTНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
ТипыТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора;
Если ТипТелаЗапроса = ТипыТелаЗапроса[0].Значение Тогда // none
- фРезультат = ?(
- ВыполнятьНаСервере,
- ИзменитьТекстНаСервере(ИдентификаторРесурса, "", ПараметрыЗапроса, ДополнительныеПараметры),
- Ждать ИзменитьТекстНаКлиенте("", ПараметрыЗапроса, ДополнительныеПараметры)
- );
+ Возврат Ждать КлиентHTTPКлиентСервер.ЗаписатьТекст(ИдентификаторРесурса, "", ДополнительныеПараметры, ПараметрыЗапроса);
ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[3].Значение Тогда // raw
- фРезультат = ?(
- ВыполнятьНаСервере,
- ИзменитьТекстНаСервере(ИдентификаторРесурса, ТелоЗапросаТекст, ПараметрыЗапроса, ДополнительныеПараметры),
- Ждать ИзменитьТекстНаКлиенте(ТелоЗапросаТекст, ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат Ждать КлиентHTTPКлиентСервер.ЗаписатьТекст(
+ ИдентификаторРесурса,
+ ТелоЗапросаТекст,
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[4].Значение Тогда // binary
- фРезультат = ?(
- ВыполнятьНаСервере,
- ИзменитьФайлНаСервере(ИдентификаторРесурса, ТелоЗапросаФайл, ПараметрыЗапроса, ДополнительныеПараметры),
- Ждать ИзменитьФайлНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат Ждать КлиентHTTPКлиентСервер.ЗаписатьФайл(
+ ИдентификаторРесурса,
+ Новый Файл(ТелоЗапросаФайл),
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
Иначе
ВызватьИсключение СтрШаблон("Тип тела запроса %1 не поддерживается для %2", ТипТелаЗапроса, Схема);
КонецЕсли;
-
- Возврат фРезультат;
КонецФункции
-&НаКлиенте
-Асинх Функция ПолучитьНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат Ждать КлиентHTTPКлиентСервер.Получить(ИдентификаторРесурса, ПараметрыЗапроса, ДополнительныеПараметры);
-КонецФункции
-
-&НаСервереБезКонтекста
-Функция ПолучитьНаСервере(Знач URI, Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.Получить(URI, ПараметрыЗапроса, ДополнительныеПараметры);
+&НаСервере
+Функция ОтветВыполненногоЗапросаPUTНаСервере(ПараметрыЗапроса, ДополнительныеПараметры)
+ ТипыТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора;
+ Если ТипТелаЗапроса = ТипыТелаЗапроса[0].Значение Тогда // none
+ Возврат КлиентHTTPКлиентСервер.ЗаписатьТекст(ИдентификаторРесурса, "", ДополнительныеПараметры, ПараметрыЗапроса);
+ ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[3].Значение Тогда // raw
+ Возврат КлиентHTTPКлиентСервер.ЗаписатьТекст(
+ ИдентификаторРесурса,
+ ТелоЗапросаТекст,
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
+ );
+ ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[4].Значение Тогда // binary
+ Возврат КлиентHTTPКлиентСервер.ЗаписатьФайл(
+ ИдентификаторРесурса,
+ Новый Файл(ТелоЗапросаФайл),
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
+ );
+ Иначе
+ ВызватьИсключение СтрШаблон("Тип тела запроса %1 не поддерживается для %2", ТипТелаЗапроса, Схема);
+ КонецЕсли;
КонецФункции
&НаКлиенте
-Асинх Функция ПолучитьЗаголовкиНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат Ждать КлиентHTTPКлиентСервер.ПолучитьЗаголовки(ИдентификаторРесурса, ПараметрыЗапроса, ДополнительныеПараметры);
+Асинх Функция ОтветВыполненногоЗапросаPATCHНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
+ ТипыТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора;
+ Если ТипТелаЗапроса = ТипыТелаЗапроса[0].Значение Тогда // none
+ Возврат Ждать КлиентHTTPКлиентСервер.ИзменитьТекст(
+ ИдентификаторРесурса,
+ "",
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
+ );
+ ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[3].Значение Тогда // raw
+ Возврат Ждать КлиентHTTPКлиентСервер.ИзменитьТекст(
+ ИдентификаторРесурса,
+ ТелоЗапросаТекст,
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
+ );
+ ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[4].Значение Тогда // binary
+ Возврат Ждать КлиентHTTPКлиентСервер.ИзменитьФайл(
+ ИдентификаторРесурса,
+ Новый Файл(ТелоЗапросаФайл),
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
+ );
+ Иначе
+ ВызватьИсключение СтрШаблон("Тип тела запроса %1 не поддерживается для %2", ТипТелаЗапроса, Схема);
+ КонецЕсли;
КонецФункции
-&НаСервереБезКонтекста
-Функция ПолучитьЗаголовкиНаСервере(Знач URI, Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.ПолучитьЗаголовки(URI, ПараметрыЗапроса, ДополнительныеПараметры);
+&НаСервере
+Функция ОтветВыполненногоЗапросаPATCHНаСервере(ПараметрыЗапроса, ДополнительныеПараметры)
+ ТипыТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора;
+ Если ТипТелаЗапроса = ТипыТелаЗапроса[0].Значение Тогда // none
+ Возврат КлиентHTTPКлиентСервер.ИзменитьТекст(
+ ИдентификаторРесурса,
+ "",
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
+ );
+ ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[3].Значение Тогда // raw
+ Возврат КлиентHTTPКлиентСервер.ИзменитьТекст(
+ ИдентификаторРесурса,
+ ТелоЗапросаТекст,
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
+ );
+ ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[4].Значение Тогда // binary
+ Возврат КлиентHTTPКлиентСервер.ИзменитьФайл(
+ ИдентификаторРесурса,
+ Новый Файл(ТелоЗапросаФайл),
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
+ );
+ Иначе
+ ВызватьИсключение СтрШаблон("Тип тела запроса %1 не поддерживается для %2", ТипТелаЗапроса, Схема);
+ КонецЕсли;
КонецФункции
&НаКлиенте
-Асинх Функция ОтправитьТекстНаКлиенте(Данные, ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат Ждать КлиентHTTPКлиентСервер.ОтправитьТекст(ИдентификаторРесурса, Данные, ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаСервереБезКонтекста
-Функция ОтправитьТекстНаСервере(Знач URI, Знач Данные, Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.ОтправитьТекст(URI, Данные, ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаКлиенте
-Асинх Функция ОтправитьДанныеФормыНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат Ждать КлиентHTTPКлиентСервер.ОтправитьДанныеФормы(
- ИдентификаторРесурса,
- Ждать ДанныеФормыТелаЗапроса(),
- ПараметрыОтправкиДанныхФормыНаКлиенте(ДополнительныеПараметры),
- ПараметрыЗапроса
- );
-КонецФункции
-
-&НаСервере
-Функция ОтправитьДанныеФормыНаСервере(Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.ОтправитьДанныеФормы(
- ИдентификаторРесурса,
- ДанныеФормыТелаЗапросаНаСервере(),
- ПараметрыОтправкиДанныхФормыНаСервере(ДополнительныеПараметры, Разделитель),
- ПараметрыЗапроса
- );
-КонецФункции
-
-&НаКлиенте
-Асинх Функция ОтправитьДанныеHTMLФормыНаКлиенте(Данные, ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат Ждать КлиентHTTPКлиентСервер.ОтправитьДанныеHTMLФормы(ИдентификаторРесурса, Данные, ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаСервереБезКонтекста
-Функция ОтправитьДанныеHTMLФормыНаСервере(Знач URI, Знач Данные, Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.ОтправитьДанныеHTMLФормы(URI, Данные, ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаКлиенте
-Асинх Функция ОтправитьФайлНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат Ждать КлиентHTTPКлиентСервер.ОтправитьФайл(ИдентификаторРесурса, Новый Файл(ТелоЗапросаФайл), ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаСервереБезКонтекста
-Функция ОтправитьФайлНаСервере(Знач URI, Знач Данные, Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.ОтправитьФайл(URI, Новый Файл(Данные), ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаКлиенте
-Асинх Функция ЗаписатьТекстНаКлиенте(Данные, ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат Ждать КлиентHTTPКлиентСервер.ЗаписатьТекст(ИдентификаторРесурса, Данные, ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаСервереБезКонтекста
-Функция ЗаписатьТекстНаСервере(Знач URI, Знач Данные, Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.ЗаписатьТекст(URI, Данные, ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаКлиенте
-Асинх Функция ЗаписатьФайлНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат Ждать КлиентHTTPКлиентСервер.ЗаписатьФайл(ИдентификаторРесурса, Новый Файл(ТелоЗапросаФайл), ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаСервереБезКонтекста
-Функция ЗаписатьФайлНаСервере(Знач URI, Знач Данные, Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.ЗаписатьФайл(URI, Новый Файл(Данные), ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаКлиенте
-Асинх Функция ИзменитьТекстНаКлиенте(Данные, ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат Ждать КлиентHTTPКлиентСервер.ИзменитьТекст(ИдентификаторРесурса, Данные, ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаСервереБезКонтекста
-Функция ИзменитьТекстНаСервере(Знач URI, Знач Данные, Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.ИзменитьТекст(URI, Данные, ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаКлиенте
-Асинх Функция ИзменитьФайлНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат Ждать КлиентHTTPКлиентСервер.ИзменитьФайл(ИдентификаторРесурса, Новый Файл(ТелоЗапросаФайл), ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаСервереБезКонтекста
-Функция ИзменитьФайлНаСервере(Знач URI, Знач Данные, Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.ИзменитьФайл(URI, Новый Файл(Данные), ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаКлиенте
-Асинх Функция УдалитьНаКлиенте(ТелоЗапроса, ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат Ждать КлиентHTTPКлиентСервер.Удалить(ИдентификаторРесурса, ТелоЗапроса, ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаСервереБезКонтекста
-Функция УдалитьНаСервере(Знач URI, Знач ТелоЗапроса, Знач ПараметрыЗапроса, ДополнительныеПараметры)
- Возврат КлиентHTTPКлиентСервер.Удалить(URI, ТелоЗапроса, ДополнительныеПараметры, ПараметрыЗапроса);
-КонецФункции
-
-&НаКлиенте
-Процедура ОбработатьОтвет(Знач Ответ)
- ФроматированиеВремениВыполненияЗапроса();
- ОтобразитьКодСостоянияСервера(Ответ.КодСостояния);
-
- ДанныеТелаОтвета = Ответ.Тело;
- ТипMIMEОтвета = КлиентHTTPКлиентСервер.ТипMIMEИзЗаголовков(Ответ.Заголовки);
-
- ОтобразитьРазмерТелаОтвета();
-
- ЗаголовкиОтвета.Очистить();
- Для Каждого КЗ Из Ответ.Заголовки Цикл
- ЗаполнитьЗначенияСвойств(ЗаголовкиОтвета.Добавить(), КЗ);
- КонецЦикла;
- ЗаголовкиОтвета.Сортировать("Ключ");
-
- ИмяФайлаТела = Ответ.ИмяФайлаТела;
- КодировкаТелаОтвета = КлиентHTTPКлиентСервер.КодировкаИзЗаголовков(Ответ.Заголовки);
-
- ОтветHTML = "";
- ТелоОтветаЭтоТекст = (КлиентHTTPПовтИсп.ТипыMIMEТекстовыхДанных().Получить(ТипMIMEОтвета) <> Неопределено);
- Если ТелоОтветаВФайл Тогда
- ТекстТелаОтвета = "файл";
- ИначеЕсли ТелоОтветаЭтоТекст Тогда
- ТекстТелаОтвета = ПолучитьСтрокуИзДвоичныхДанных(
- ДанныеТелаОтвета,
- ?(КодировкаТелаОтвета = Неопределено, КлиентHTTPПовтИсп.КодировкаПоУмолчанию(), КодировкаТелаОтвета)
- );
-
- ОтветHTML = ТекстТелаОтвета;
- Иначе
- ТекстТелаОтвета = "двоичные данные";
- КонецЕсли;
-
- ОтветТекст.УстановитьФорматированнуюСтроку(Новый ФорматированнаяСтрока(ТекстТелаОтвета));
-
- ВывестиТелоОтветаJSON(ТекстТелаОтвета);
- ОтобразитьКартинкуТелаОтвета(ТипMIMEОтвета);
-
- Элементы.ОтветHTML.Документ.Body.InnerHTML = ОтветHTML;
-КонецПроцедуры
+Процедура ОбработатьОтвет(Знач Ответ)
+ ФроматированиеВремениВыполненияЗапроса();
+ ОтобразитьКодСостоянияСервера(Ответ.КодСостояния);
+
+ ДанныеТелаОтвета = Ответ.Тело;
+ ТипMIMEОтвета = КлиентHTTPКлиентСервер.ТипMIMEИзЗаголовков(Ответ.Заголовки);
+
+ ОтобразитьРазмерТелаОтвета();
+
+ ЗаголовкиОтвета.Очистить();
+ Для Каждого КЗ Из Ответ.Заголовки Цикл
+ ЗаполнитьЗначенияСвойств(ЗаголовкиОтвета.Добавить(), КЗ);
+ КонецЦикла;
+ ЗаголовкиОтвета.Сортировать("Ключ");
+
+ ИмяФайлаТела = Ответ.ИмяФайлаТела;
+ ФорматироватьТекстТелаОтвета = Ложь;
+ ОтветHTML = "";
+ ТелоОтветаЭтоТекст = (КлиентHTTPПовтИсп.ТипыMIMEТекстовыхДанных().Получить(ТипMIMEОтвета) <> Неопределено);
+ Если ТелоОтветаВФайл Тогда
+ УстановитьТекстОтвета("файл");
+ ИначеЕсли ТелоОтветаЭтоТекст Тогда
+ ОтобразитьТекстОтвета(Ответ.Тело, Ответ.Заголовки);
+
+ ФорматТелаОтвета = Элементы.ФорматТелаОтвета.СписокВыбора[0]; // Текст
+ ИначеЕсли ДанныеТелаОтвета.Размер() = 0 Тогда
+ УстановитьТекстОтвета("");
+ Иначе
+ УстановитьТекстОтвета("двоичные данные");
+ КонецЕсли;
+
+ Элементы.ГруппаФорматированиеТекстаТелаОтвета.Видимость = ТелоОтветаЭтоТекст;
+
+ ФорматироватьТекстТелаОтветаПриИзменении(Неопределено);
+
+ ОтобразитьКартинкуТелаОтвета(ТипMIMEОтвета);
+
+ Элементы.ОтветHTML.Документ.Body.InnerHTML = ОтветHTML;
+
+ ФорматТелаОтветаПриИзменении(Неопределено);
+ ПроверитьОтветHawk(Ответ);
+КонецПроцедуры
&НаКлиенте
Процедура ОтобразитьКодСостоянияСервера(Знач КодСостоянияСервера)
@@ -1041,8 +1332,8 @@
КонецПроцедуры
&НаКлиенте
-Процедура ЗафиксироватьВремяВыполненияЗапроса(Знач ВремяНачала)
- ВремяВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах() - ВремяНачала;
+Процедура УстановитьТекстОтвета(Знач Текст)
+ ОтветТекст.УстановитьФорматированнуюСтроку(Новый ФорматированнаяСтрока(Текст));
КонецПроцедуры
&НаКлиенте
@@ -1083,30 +1374,35 @@
КонецПроцедуры
&НаКлиенте
-Процедура ВывестиТелоОтветаJSON(Знач Текст)
- Перем ОбъектJSON;
-
- Чтение = Новый ЧтениеJSON;
- Чтение.УстановитьСтроку(Текст);
-
- Попытка
- ОбъектJSON = ПрочитатьJSON(Чтение, Истина);
- Исключение
- Текст = Неопределено;
- КонецПопытки;
-
- Чтение.Закрыть();
+Процедура ОтобразитьТекстОтвета(Знач Данные, Знач Заголовки)
+ ТипMIME = КлиентHTTPКлиентСервер.ТипMIMEИзЗаголовков(Заголовки);
+ Кодировка = КлиентHTTPКлиентСервер.КодировкаИзЗаголовков(Заголовки);
+ ТекстТелаОтвета = ПолучитьСтрокуИзДвоичныхДанных(
+ Данные,
+ ?(Кодировка = Неопределено, КлиентHTTPПовтИсп.КодировкаПоУмолчанию(), Кодировка)
+ );
- Если Текст = Неопределено Тогда
- Текст = "не удалось прочитать как JSON";
+ Если ТипMIME = КлиентHTTPПовтИсп.ТипMIMEJSON() Тогда
+ ФорматироватьТекстТелаОтвета = Истина;
+ ФорматТекстТелаОтвета = Элементы.ФорматТекстТелаОтвета.СписокВыбора[0];
+ ИначеЕсли ТипMIME = КлиентHTTPПовтИсп.ТипMIMEApplicationXML() ИЛИ ТипMIME = КлиентHTTPПовтИсп.ТипMIMETextXML() Тогда
+ ФорматироватьТекстТелаОтвета = Истина;
+ ФорматТекстТелаОтвета = Элементы.ФорматТекстТелаОтвета.СписокВыбора[1];
+ ИначеЕсли ТипMIME = КлиентHTTPПовтИсп.ТипMIMEHTML() Тогда
+ ФорматироватьТекстТелаОтвета = Истина;
+ ФорматТекстТелаОтвета = Элементы.ФорматТекстТелаОтвета.СписокВыбора[2];
Иначе
- Запись = Новый ЗаписьJSON;
- Запись.УстановитьСтроку(Новый ПараметрыЗаписиJSON(, " ", Истина));
- ЗаписатьJSON(Запись, ОбъектJSON);
- Текст = Запись.Закрыть();
+ ФорматироватьТекстТелаОтвета = Ложь;
КонецЕсли;
- ОтветJSON.УстановитьФорматированнуюСтроку(Новый ФорматированнаяСтрока(Текст));
+ Если ФорматироватьТекстТелаОтвета Тогда
+ ФорматТекстТелаОтветаПриИзменении(Неопределено);
+ КонецЕсли;
+
+ УстановитьТекстMonaco(ТекстТелаОтвета);
+ УстановитьТекстОтвета(ТекстТелаОтвета);
+
+ ОтветHTML = ТекстТелаОтвета;
КонецПроцедуры
&НаКлиенте
@@ -1119,9 +1415,34 @@
Возврат;
КонецЕсли;
+ ФорматТелаОтвета = Элементы.ФорматТелаОтвета.СписокВыбора[2]; // Картинка
+
ПопробоватьОтобразитьКартинку(Неопределено);
КонецПроцедуры
+&НаКлиенте
+Процедура ПроверитьОтветHawk(Знач Ответ)
+ Если ТипАутентификации <> Элементы.ТипАутентификации.СписокВыбора[6].Значение Тогда // Hawk
+ Возврат;
+ КонецЕсли;
+ Если Цел(Ответ.КодСостояния / 100) <> 2 Тогда // 2хх
+ Возврат;
+ КонецЕсли;
+ Если КлиентHTTPКлиентСервер.ЗначениеЗаголовка("Server-Authorization", Ответ.Заголовки) = Неопределено Тогда
+ СообщитьПользователю("В ответе отсутствует заголовок верефикации 'Server-Authorization'");
+ КонецЕсли;
+
+ ОписаниеОшибки = "";
+ Если НЕ КлиентHTTPКлиентСервер.ОтветСЗаголовкомHawkКорректен(Ответ, "Server-Authorization", ОписаниеОшибки) Тогда
+ СообщитьПользователю(ОписаниеОшибки);
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиентеНаСервереБезКонтекста
+Функция НоваяСессия()
+ Возврат Новый Структура("Печенье", Новый Соответствие);
+КонецФункции
+
&НаКлиенте
Процедура ДобавитьВИсторию(Знач Ответ)
ТекущийМомент = ТекущаяУниверсальнаяДатаВМиллисекундах();
@@ -1170,6 +1491,7 @@
ОбъектОтвета.Вставить("Тело", Ответ.Тело);
ОбъектОтвета.Вставить("Заголовки", Ответ.Заголовки);
ОбъектОтвета.Вставить("ИмяФайлаТела", Ответ.ИмяФайлаТела);
+ ОбъектОтвета.Вставить("КонтекстВыполнения", Ответ.КонтекстВыполнения);
ОбъектИстории = Новый Структура;
ОбъектИстории.Вставить("Дата", ТекущаяДата());
@@ -1180,10 +1502,19 @@
ОбъектИстории.Вставить("URN", URN);
ОбъектИстории.Вставить("ВремяВыполнения", ВремяВыполнения);
ОбъектИстории.Вставить("Ответ", ОбъектОтвета);
- ОбъектИстории.Вставить("ТипАвторизации", ТипАвторизации);
- ОбъектИстории.Вставить("ПользовательАвторизации", ПользовательАвторизации);
- ОбъектИстории.Вставить("ПарольАвторизации", ПарольАвторизации);
- ОбъектИстории.Вставить("ТокенАвторизации", ТокенАвторизации);
+ ОбъектИстории.Вставить("ТипАутентификации", ТипАутентификации);
+ ОбъектИстории.Вставить("ПользовательАутентификации", ПользовательАутентификации);
+ ОбъектИстории.Вставить("ПарольАутентификации", ПарольАутентификации);
+ ОбъектИстории.Вставить("ТокенАутентификации", ТокенАутентификации);
+ ОбъектИстории.Вставить("AWSКлючДоступа", AWSКлючДоступа);
+ ОбъектИстории.Вставить("AWSСекретныйКлюч", AWSСекретныйКлюч);
+ ОбъектИстории.Вставить("AWSРегион", AWSРегион);
+ ОбъектИстории.Вставить("AWSСервис", AWSСервис);
+ ОбъектИстории.Вставить("HawkИдентификатор", HawkИдентификатор);
+ ОбъектИстории.Вставить("HawkКлюч", HawkКлюч);
+ ОбъектИстории.Вставить("HawkДополнение", HawkДополнение);
+ ОбъектИстории.Вставить("HawkИдентификаторПриложения", HawkИдентификаторПриложения);
+ ОбъектИстории.Вставить("HawkДелегирование", HawkДелегирование);
ОбъектИстории.Вставить("ЗаголовкиЗапроса", Заголовки);
ОбъектИстории.Вставить("ТипТелаЗапроса", ТипТелаЗапроса);
ОбъектИстории.Вставить("Разделитель", Разделитель);
@@ -1195,12 +1526,27 @@
ОбъектИстории.Вставить("ТелоОтветаВФайл", ТелоОтветаВФайл);
ОбъектИстории.Вставить("ИмяФайлаТелаОтвета", ИмяФайлаТелаОтвета);
ОбъектИстории.Вставить("ПоддержкаСжатогоОтвета", ПоддержкаСжатогоОтвета);
+ ОбъектИстории.Вставить("АгентПользователя", АгентПользователя);
+ ОбъектИстории.Вставить("Таймаут", Таймаут);
ОбъектИстории.Вставить("ИспользоватьСессию", ИспользоватьСессию);
ОбъектИстории.Вставить("Сессия", Дополнительно.Сессия);
ОбъектИстории.Вставить("ПорогПеренаправлений", ПорогПеренаправлений);
+ ОбъектИстории.Вставить("ПеренаправлениеКакGET", ПеренаправлениеКакGET);
ОбъектИстории.Вставить("ПоддержкаCookie", ПоддержкаCookie);
+ ОбъектИстории.Вставить("СпособПовторногоВыполнения", СпособПовторногоВыполнения);
+ ОбъектИстории.Вставить("ДлительностьПаузыПовторногоВыполнения", ДлительностьПаузыПовторногоВыполнения);
+ ОбъектИстории.Вставить("КоэффициентУвеличенияПаузыПовторногоВыполнения", КоэффициентУвеличенияПаузыПовторногоВыполнения);
+ ОбъектИстории.Вставить("ПорогКоличестваПопытокПовторногоВыполнения", ПорогКоличестваПопытокПовторногоВыполнения);
+ ОбъектИстории.Вставить("МаксимальнаяДлительностьПаузыПовторногоВыполнения", МаксимальнаяДлительностьПаузыПовторногоВыполнения);
+ ОбъектИстории.Вставить("МассивКодовСостоянияОтветаПовторногоВыполнения", КодыСостоянияОтветаПовторногоВыполнения.ВыгрузитьЗначения());
+ ОбъектИстории.Вставить("ИспользоватьСертификаты", ИспользоватьСертификаты);
+ ОбъектИстории.Вставить("ИмяФайлаКлиентскогоСертификата", ИмяФайлаКлиентскогоСертификата);
+ ОбъектИстории.Вставить("ПарольКлиентскогоСертификата", ПарольКлиентскогоСертификата);
+ ОбъектИстории.Вставить("ИмяФайлаСертификатовУЦ", ИмяФайлаСертификатовУЦ);
+ ОбъектИстории.Вставить("ПарольФайлаСертификатовУЦ", ПарольФайлаСертификатовУЦ);
ОбъектИстории.Вставить("ИспользоватьПрокси", ИспользоватьПрокси);
ОбъектИстории.Вставить("НеИспользоватьПроксиДляЛокальныхАдресов", НеИспользоватьПроксиДляЛокальныхАдресов);
+ ОбъектИстории.Вставить("ПротоколПрокси", ПротоколПрокси);
ОбъектИстории.Вставить("СерверПрокси", СерверПрокси);
ОбъектИстории.Вставить("ПортПрокси", ПортПрокси);
ОбъектИстории.Вставить("ПользовательПрокси", ПользовательПрокси);
@@ -1230,14 +1576,24 @@
Функция ПараметрыИдентификатораСПорядком(Знач ИдентификаторРесурса, Знач ПозицияНачала)
фРезультат = Новый Структура("Параметры, Порядок", Новый Соответствие, Новый Массив);
- ПараметрыСтрока = ?(
- ПозицияНачала = 0,
- "",
- Сред(ИдентификаторРесурса, ПозицияНачала + 1)
+ Если ПозицияНачала = 0 Тогда
+ Возврат фРезультат;
+ КонецЕсли;
+
+ ПозицияОкончания = СтрНайти(ИдентификаторРесурса, "#", , ПозицияНачала);
+ ПараметрыСтрока = Сред(
+ ИдентификаторРесурса,
+ ПозицияНачала + 1,
+ ?(
+ ПозицияОкончания = 0,
+ СтрДлина(ИдентификаторРесурса),
+ ПозицияОкончания - 1
+ ) - ПозицияНачала
);
- ПараметрыИдентификатора = СтрРазделить(ПараметрыСтрока, "&", Ложь);
- Для Каждого Параметр Из ПараметрыИдентификатора Цикл
+ ПараметрыИдентификатора = Новый Массив;
+ МножествоСтрок = Новый Соответствие;
+ Для Каждого Параметр Из СтрРазделить(ПараметрыСтрока, "&", Ложь) Цикл
ПозицияРазделителя = СтрНайти(Параметр, "=");
Если ПозицияРазделителя = 0 Тогда
ПозицияРазделителя = СтрДлина(Параметр) + 1;
@@ -1250,6 +1606,16 @@
ЗначениеПараметра = Прав(Параметр, СтрДлина(Параметр) - ПозицияРазделителя);
+ ПараметрыИдентификатора.Добавить(Новый Структура("Ключ, Значение", ИмяПараметра, ЗначениеПараметра));
+ МножествоСтрок.Вставить(ИмяПараметра);
+ МножествоСтрок.Вставить(ЗначениеПараметра);
+ КонецЦикла;
+
+ МножествоСтрок = РаскодированныеСтрокиURLвURL(МножествоСтрок);
+
+ Для Каждого Параметр Из ПараметрыИдентификатора Цикл
+ ИмяПараметра = МножествоСтрок.Получить(Параметр.Ключ);
+ ЗначениеПараметра = МножествоСтрок.Получить(Параметр.Значение);
ЗначенияПараметра = фРезультат.Параметры.Получить(ИмяПараметра);
Если ЗначенияПараметра = Неопределено Тогда
ЗначенияПараметра = Новый Соответствие;
@@ -1318,7 +1684,7 @@
Стр.Ключ = ЗначениеПараметра.Ключ;
Стр.Значение = ЗначениеПараметра.Значение;
Стр.Активно = Истина;
- КонецЦикла;
+ КонецЦикла;
КонецПроцедуры
&НаКлиенте
@@ -1332,12 +1698,14 @@
ВызватьИсключение "Не удалось разобрать URI";
КонецЕсли;
- ПозицияНачалаСтрокиПараметров = СтрНайти(ИдентификаторРесурса, "?", , ПозицияНачалаПоиска);
+ ПозицияСимволаПараметров = СтрНайти(ИдентификаторРесурса, "?", , ПозицияНачалаПоиска);
+ ПозицияСимволаФрагмента = СтрНайти(ИдентификаторРесурса, "#", , ?(ПозицияСимволаПараметров = 0, 1, ПозицияСимволаПараметров));
+ ПозицияОкончания = ?(ПозицияСимволаПараметров = 0, ПозицияСимволаФрагмента, ПозицияСимволаПараметров);
НовыйИдентификатор = ?(
- ПозицияНачалаСтрокиПараметров = 0,
+ ПозицияОкончания = 0,
ИдентификаторРесурса,
- Лев(ИдентификаторРесурса, ПозицияНачалаСтрокиПараметров - 1)
+ Лев(ИдентификаторРесурса, ПозицияОкончания - 1)
);
ПараметрыИдентификатора = Новый Массив;
@@ -1353,11 +1721,31 @@
ПараметрыИдентификатора.Добавить(Новый Структура("Ключ, Значение", Стр.Ключ, ЗначениеПараметра));
КонецЦикла;
- ИдентификаторРесурса = НовыйИдентификатор + КлиентHTTPКлиентСервер.ПараметрыЗапросаСтрокой(ПараметрыИдентификатора);
+ ИдентификаторРесурса = СтрШаблон(
+ "%1%2%3",
+ НовыйИдентификатор,
+ КлиентHTTPКлиентСервер.ПараметрыЗапросаСтрокой(ПараметрыИдентификатора),
+ ?(ПозицияСимволаФрагмента = 0, "", Сред(ИдентификаторРесурса, ПозицияСимволаФрагмента))
+ );
КонецПроцедуры
&НаКлиенте
-Функция МножествоПараметровЗапроса()
+Функция МножествоПараметровЗапросаНаКлиенте()
+ фРезультат = КлиентHTTPКлиентСервер.НовыеПараметрыЗапроса();
+
+ Для Каждого Стр Из ПараметрыЗапроса Цикл
+ Если НЕ Стр.Активно Тогда
+ Продолжить;
+ КонецЕсли;
+
+ КлиентHTTPКлиентСервер.ДобавитьПараметр(фРезультат, Стр.Ключ, Стр.Значение);
+ КонецЦикла;
+
+ Возврат фРезультат;
+КонецФункции
+
+&НаСервере
+Функция МножествоПараметровЗапросаНаСервере()
фРезультат = КлиентHTTPКлиентСервер.НовыеПараметрыЗапроса();
Для Каждого Стр Из ПараметрыЗапроса Цикл
@@ -1372,20 +1760,40 @@
КонецФункции
&НаКлиенте
-Функция ДополнительныеПараметрыЗапроса()
+Функция ДополнительныеПараметрыЗапросаНаКлиенте()
фРезультат = КлиентHTTPКлиентСервер.НовыеДополнительныеПараметры();
- УстановитьЗаголовкиЗапроса(фРезультат);
-
- ТипАвторизацииСписокВыбора = Элементы.ТипАвторизации.СписокВыбора;
- Если ТипАвторизации = ТипАвторизацииСписокВыбора[1].Значение Тогда // Basic
- КлиентHTTPКлиентСервер.УстановитьBasicАвторизацию(фРезультат, ПользовательАвторизации, ПарольАвторизации);
- ИначеЕсли ТипАвторизации = ТипАвторизацииСписокВыбора[2].Значение Тогда // NTLM
- КлиентHTTPКлиентСервер.УстановитьNTLMАвторизацию(фРезультат, ПользовательАвторизации, ПарольАвторизации);
- ИначеЕсли ТипАвторизации = ТипАвторизацииСписокВыбора[3].Значение Тогда // Digest
- КлиентHTTPКлиентСервер.УстановитьDigestАвторизацию(фРезультат, ПользовательАвторизации, ПарольАвторизации);
- ИначеЕсли ТипАвторизации = ТипАвторизацииСписокВыбора[4].Значение Тогда // Bearer
- КлиентHTTPКлиентСервер.УстановитьBearerАвторизацию(фРезультат, ТокенАвторизации);
+ УстановитьЗаголовкиЗапросаНаКлиенте(фРезультат);
+
+ ТипАутентификацииСписокВыбора = Элементы.ТипАутентификации.СписокВыбора;
+ Если ТипАутентификации = ТипАутентификацииСписокВыбора[1].Значение Тогда // Basic
+ КлиентHTTPКлиентСервер.УстановитьBasicАвторизацию(фРезультат, ПользовательАутентификации, ПарольАутентификации);
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[2].Значение Тогда // NTLM
+ КлиентHTTPКлиентСервер.УстановитьNTLMАвторизацию(фРезультат, ПользовательАутентификации, ПарольАутентификации);
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[3].Значение Тогда // Digest
+ КлиентHTTPКлиентСервер.УстановитьDigestАвторизацию(фРезультат, ПользовательАутентификации, ПарольАутентификации);
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[4].Значение Тогда // Bearer
+ КлиентHTTPКлиентСервер.УстановитьBearerАвторизацию(фРезультат, ТокенАутентификации);
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[5].Значение Тогда // AWS4-HMAC-SHA256
+ КлиентHTTPКлиентСервер.УстановитьAWS4Авторизацию(фРезультат, AWSКлючДоступа, AWSСекретныйКлюч, AWSРегион, AWSСервис);
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[6].Значение Тогда // Hawk
+ КлиентHTTPКлиентСервер.УстановитьHawkАвторизацию(фРезультат, HawkИдентификатор, HawkКлюч, HawkДополнение, HawkИдентификаторПриложения, HawkДелегирование);
+ КонецЕсли;
+
+ Если ИспользоватьСертификаты Тогда
+ КлиентHTTPКлиентСервер.ИспользоватьФайлСертификатаКлиента(
+ фРезультат,
+ Новый Файл(ИмяФайлаКлиентскогоСертификата),
+ ПарольКлиентскогоСертификата
+ );
+
+ Если НЕ ПустаяСтрока(ИмяФайлаСертификатовУЦ) Тогда
+ КлиентHTTPКлиентСервер.ИспользоватьФайлСертификатовУдостоверяющихЦентров(
+ фРезультат,
+ Новый Файл(ИмяФайлаСертификатовУЦ),
+ ПарольФайлаСертификатовУЦ
+ );
+ КонецЕсли;
КонецЕсли;
Если ИспользоватьПрокси Тогда
@@ -1397,38 +1805,193 @@
ПарольПрокси,
ИспользоватьАутентификациюОСПрокси,
,
- НеИспользоватьПроксиДляЛокальныхАдресов
+ НеИспользоватьПроксиДляЛокальныхАдресов,
+ ПротоколПрокси
);
КонецЕсли;
Если ИспользоватьСессию Тогда
КлиентHTTPКлиентСервер
.ИспользоватьСессию(фРезультат)
- .УстановитьПорогПеренаправлений(фРезультат, ПорогПеренаправлений);
+ .УстановитьПорогПеренаправлений(фРезультат, ПорогПеренаправлений)
+ .ПеренаправленияКакGET(фРезультат, ПеренаправлениеКакGET);
Если ПоддержкаCookie Тогда
КлиентHTTPКлиентСервер.СкопироватьПеченье(фРезультат, Дополнительно);
КонецЕсли;
КонецЕсли;
+ Если Таймаут > 0 Тогда
+ КлиентHTTPКлиентСервер.УстановитьТаймаут(фРезультат, Таймаут);
+ КонецЕсли;
+
Если ПоддержкаСжатогоОтвета Тогда
КлиентHTTPКлиентСервер.УстановитьСжатиеОтветаGZIP(фРезультат);
КонецЕсли;
+ Если НЕ ПустаяСтрока(АгентПользователя) Тогда
+ КлиентHTTPКлиентСервер.УстановитьАгентаПользователя(фРезультат, АгентПользователя);
+ КонецЕсли;
+
Если ТелоОтветаВФайл Тогда
- Если ПустаяСтрока(ИмяФайлаТелаОтвета) Тогда
- Элементы.Основная.ТекущаяСтраница = Элементы.СтраницаНастройки;
- ВызватьИсключение "Укажите путь к файлу ответа";
+ КлиентHTTPКлиентСервер.УстановитьИмяВыходногоФайла(фРезультат, ИмяФайлаТелаОтвета);
+ КонецЕсли;
+
+ СпособыПовторногоВыполнения = Элементы.СпособПовторногоВыполнения.СписокВыбора;
+ Если СпособПовторногоВыполнения = СпособыПовторногоВыполнения[1].Значение Тогда // Фиксировано
+ КлиентHTTPКлиентСервер.ФиксированоОтложенныеВыполнения(
+ фРезультат,
+ ДлительностьПаузыПовторногоВыполнения,
+ ПорогКоличестваПопытокПовторногоВыполнения,
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения,
+ КодыСостоянияОтветаПовторногоВыполнения.ВыгрузитьЗначения()
+ );
+ ИначеЕсли СпособПовторногоВыполнения = СпособыПовторногоВыполнения[2].Значение Тогда // Линейно
+ КлиентHTTPКлиентСервер.ЛинейноОтложенныеВыполнения(
+ фРезультат,
+ ДлительностьПаузыПовторногоВыполнения,
+ КоэффициентУвеличенияПаузыПовторногоВыполнения,
+ ПорогКоличестваПопытокПовторногоВыполнения,
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения,
+ КодыСостоянияОтветаПовторногоВыполнения.ВыгрузитьЗначения()
+ );
+ ИначеЕсли СпособПовторногоВыполнения = СпособыПовторногоВыполнения[3].Значение Тогда // Экспоненциально
+ КлиентHTTPКлиентСервер.ЭкспоненциальноОтложенныеВыполнения(
+ фРезультат,
+ ДлительностьПаузыПовторногоВыполнения,
+ КоэффициентУвеличенияПаузыПовторногоВыполнения,
+ ПорогКоличестваПопытокПовторногоВыполнения,
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения,
+ КодыСостоянияОтветаПовторногоВыполнения.ВыгрузитьЗначения()
+ );
+ КонецЕсли;
+
+ Возврат фРезультат;
+КонецФункции
+
+&НаСервере
+Функция ДополнительныеПараметрыЗапросаНаСервере()
+ фРезультат = КлиентHTTPКлиентСервер.НовыеДополнительныеПараметры();
+
+ УстановитьЗаголовкиЗапросаНаСервере(фРезультат);
+
+ ТипАутентификацииСписокВыбора = Элементы.ТипАутентификации.СписокВыбора;
+ Если ТипАутентификации = ТипАутентификацииСписокВыбора[1].Значение Тогда // Basic
+ КлиентHTTPКлиентСервер.УстановитьBasicАвторизацию(фРезультат, ПользовательАутентификации, ПарольАутентификации);
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[2].Значение Тогда // NTLM
+ КлиентHTTPКлиентСервер.УстановитьNTLMАвторизацию(фРезультат, ПользовательАутентификации, ПарольАутентификации);
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[3].Значение Тогда // Digest
+ КлиентHTTPКлиентСервер.УстановитьDigestАвторизацию(фРезультат, ПользовательАутентификации, ПарольАутентификации);
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[4].Значение Тогда // Bearer
+ КлиентHTTPКлиентСервер.УстановитьBearerАвторизацию(фРезультат, ТокенАутентификации);
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[5].Значение Тогда // AWS4-HMAC-SHA256
+ КлиентHTTPКлиентСервер.УстановитьAWS4Авторизацию(фРезультат, AWSКлючДоступа, AWSСекретныйКлюч, AWSРегион, AWSСервис);
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[6].Значение Тогда // Hawk
+ КлиентHTTPКлиентСервер.УстановитьHawkАвторизацию(фРезультат, HawkИдентификатор, HawkКлюч, HawkДополнение, HawkИдентификаторПриложения, HawkДелегирование);
+ КонецЕсли;
+
+ Если ИспользоватьСертификаты Тогда
+ КлиентHTTPКлиентСервер.ИспользоватьФайлСертификатаКлиента(
+ фРезультат,
+ Новый Файл(ИмяФайлаКлиентскогоСертификата),
+ ПарольКлиентскогоСертификата
+ );
+
+ Если НЕ ПустаяСтрока(ИмяФайлаСертификатовУЦ) Тогда
+ КлиентHTTPКлиентСервер.ИспользоватьФайлСертификатовУдостоверяющихЦентров(
+ фРезультат,
+ Новый Файл(ИмяФайлаСертификатовУЦ),
+ ПарольФайлаСертификатовУЦ
+ );
КонецЕсли;
+ КонецЕсли;
+
+ Если ИспользоватьПрокси Тогда
+ КлиентHTTPКлиентСервер.ИспользоватьПрокси(
+ фРезультат,
+ СерверПрокси,
+ ПортПрокси,
+ ПользовательПрокси,
+ ПарольПрокси,
+ ИспользоватьАутентификациюОСПрокси,
+ ,
+ НеИспользоватьПроксиДляЛокальныхАдресов,
+ ПротоколПрокси
+ );
+ КонецЕсли;
+
+ Если ИспользоватьСессию Тогда
+ КлиентHTTPКлиентСервер
+ .ИспользоватьСессию(фРезультат)
+ .УстановитьПорогПеренаправлений(фРезультат, ПорогПеренаправлений)
+ .ПеренаправленияКакGET(фРезультат, ПеренаправлениеКакGET);
+ Если ПоддержкаCookie Тогда
+ КлиентHTTPКлиентСервер.СкопироватьПеченье(фРезультат, Дополнительно);
+ КонецЕсли;
+ КонецЕсли;
+
+ Если Таймаут > 0 Тогда
+ КлиентHTTPКлиентСервер.УстановитьТаймаут(фРезультат, Таймаут);
+ КонецЕсли;
+
+ Если ПоддержкаСжатогоОтвета Тогда
+ КлиентHTTPКлиентСервер.УстановитьСжатиеОтветаGZIP(фРезультат);
+ КонецЕсли;
+
+ Если НЕ ПустаяСтрока(АгентПользователя) Тогда
+ КлиентHTTPКлиентСервер.УстановитьАгентаПользователя(фРезультат, АгентПользователя);
+ КонецЕсли;
+
+ Если ТелоОтветаВФайл Тогда
КлиентHTTPКлиентСервер.УстановитьИмяВыходногоФайла(фРезультат, ИмяФайлаТелаОтвета);
КонецЕсли;
+ СпособыПовторногоВыполнения = Элементы.СпособПовторногоВыполнения.СписокВыбора;
+ Если СпособПовторногоВыполнения = СпособыПовторногоВыполнения[1].Значение Тогда // Фиксировано
+ КлиентHTTPКлиентСервер.ФиксированоОтложенныеВыполнения(
+ фРезультат,
+ ДлительностьПаузыПовторногоВыполнения,
+ ПорогКоличестваПопытокПовторногоВыполнения,
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения,
+ КодыСостоянияОтветаПовторногоВыполнения.ВыгрузитьЗначения()
+ );
+ ИначеЕсли СпособПовторногоВыполнения = СпособыПовторногоВыполнения[2].Значение Тогда // Линейно
+ КлиентHTTPКлиентСервер.ЛинейноОтложенныеВыполнения(
+ фРезультат,
+ ДлительностьПаузыПовторногоВыполнения,
+ КоэффициентУвеличенияПаузыПовторногоВыполнения,
+ ПорогКоличестваПопытокПовторногоВыполнения,
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения,
+ КодыСостоянияОтветаПовторногоВыполнения.ВыгрузитьЗначения()
+ );
+ ИначеЕсли СпособПовторногоВыполнения = СпособыПовторногоВыполнения[3].Значение Тогда // Экспоненциально
+ КлиентHTTPКлиентСервер.ЭкспоненциальноОтложенныеВыполнения(
+ фРезультат,
+ ДлительностьПаузыПовторногоВыполнения,
+ КоэффициентУвеличенияПаузыПовторногоВыполнения,
+ ПорогКоличестваПопытокПовторногоВыполнения,
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения,
+ КодыСостоянияОтветаПовторногоВыполнения.ВыгрузитьЗначения()
+ );
+ КонецЕсли;
+
Возврат фРезультат;
КонецФункции
&НаКлиенте
-Процедура УстановитьЗаголовкиЗапроса(Знач ДополнительныеПараметры)
+Процедура УстановитьЗаголовкиЗапросаНаКлиенте(Знач ДополнительныеПараметры)
+ Для Каждого Стр Из ЗаголовкиЗапроса Цикл
+ Если НЕ Стр.Активно Тогда
+ Продолжить;
+ КонецЕсли;
+
+ КлиентHTTPКлиентСервер.УстановитьЗаголовок(ДополнительныеПараметры, Стр.Ключ, Стр.Значение);
+ КонецЦикла;
+КонецПроцедуры
+
+&НаСервере
+Процедура УстановитьЗаголовкиЗапросаНаСервере(Знач ДополнительныеПараметры)
Для Каждого Стр Из ЗаголовкиЗапроса Цикл
Если НЕ Стр.Активно Тогда
Продолжить;
@@ -1439,7 +2002,7 @@
КонецПроцедуры
&НаКлиенте
-Асинх Функция ДанныеФормыТелаЗапроса()
+Асинх Функция ДанныеФормыТелаЗапросаНаКлиенте()
фРезультат = КлиентHTTPКлиентСервер.НовыеПоляФормы();
ТипыДанныхФормы = Элементы.ТелоЗапросаДанныеФормы.ПодчиненныеЭлементы.ДанныеФормыТип.СписокВыбора;
@@ -1508,7 +2071,22 @@
КонецФункции
&НаКлиенте
-Функция ДанныеHTMLФормыТелаЗапроса()
+Функция ДанныеHTMLФормыТелаЗапросаНаКлиенте()
+ фРезультат = КлиентHTTPКлиентСервер.НовыеПоляФормы();
+
+ Для Каждого Стр Из ТелоЗапросаДанныеHTMLФормы Цикл
+ Если НЕ Стр.Активно Тогда
+ Продолжить;
+ КонецЕсли;
+
+ КлиентHTTPКлиентСервер.ДобавитьПолеHTMLФормы(фРезультат, Стр.Ключ, Стр.Значение);
+ КонецЦикла;
+
+ Возврат фРезультат;
+КонецФункции
+
+&НаСервере
+Функция ДанныеHTMLФормыТелаЗапросаНаСервере()
фРезультат = КлиентHTTPКлиентСервер.НовыеПоляФормы();
Для Каждого Стр Из ТелоЗапросаДанныеHTMLФормы Цикл
@@ -1611,6 +2189,16 @@
Элементы.ВремяВыполнения.Формат = СтрШаблон("ЧДЦ=%1; ЧС=%2; ЧН='0 мс'; ЧГ=; ЧФ='Ч %3'", Точность, Сдвиг, Единицы);
КонецПроцедуры
+&НаКлиенте
+Функция ОтображениеСекрета(Знач Текст, Знач ЭлементФормы, Знач СкрыватьПустуюСтроку = Истина)
+ Возврат ?(
+ НЕ СкрыватьПустуюСтроку И Текст = "",
+ "",
+ ?(НЕ ОтображатьСекреты И ЭлементФормы.РежимПароля, "***", Текст)
+ );
+КонецФункции
+
+#Область Кодогенерация
&НаКлиенте
Процедура ДобавитьВКодЗапросаИдентификаторРесурса(Построитель)
ПозицияПараметровЗапроса = СтрНайти(ИдентификаторРесурса, "?");
@@ -1625,43 +2213,105 @@
&НаКлиенте
Процедура ДобавитьВКодЗапросаИспользованиеПрокси(Построитель, ЕстьДополнительныеПараметры)
- Если ИспользоватьПрокси Тогда
- Хвост = ?(НеИспользоватьПроксиДляЛокальныхАдресов, "", ", , Ложь");
- Хвост = ?(
- ИспользоватьАутентификациюОСПрокси,
- ?(ПустаяСтрока(Хвост), "", ", "),
- ", Ложь"
- ) + Хвост;
- Хвост = ?(
- ПустаяСтрока(ПарольПрокси),
- ?(ПустаяСтрока(Хвост), "", ", "),
- ", """ + КавычкиВТексте1С(ПарольПрокси) + """"
- ) + Хвост;
- Хвост = ?(
- ПустаяСтрока(ПользовательПрокси),
- ?(ПустаяСтрока(Хвост), "", ", "),
- ", """ + КавычкиВТексте1С(ПользовательПрокси) + """"
- ) + Хвост;
-
- Построитель.Добавить(СтрШаблон(
- " .ИспользоватьПрокси(ДополнительныеПараметры, ""%1"", %2%3)",
- СерверПрокси,
- XMLСтрока(ПортПрокси),
- Хвост
- ));
-
- ЕстьДополнительныеПараметры = Истина;
+ Если НЕ ИспользоватьПрокси Тогда
+ Возврат;
КонецЕсли;
+
+ Хвост = ?(НеИспользоватьПроксиДляЛокальныхАдресов, "", ", , Ложь");
+ Хвост = ?(
+ ИспользоватьАутентификациюОСПрокси,
+ ?(ПустаяСтрока(Хвост), "", ", "),
+ ", Ложь"
+ ) + Хвост;
+ Хвост = ?(
+ ПустаяСтрока(ПарольПрокси),
+ ?(ПустаяСтрока(Хвост), "", ", "),
+ ", """ + КавычкиВТексте1С(ОтображениеСекрета(ПарольПрокси, Элементы.ПарольПрокси)) + """"
+ ) + Хвост;
+ Хвост = ?(
+ ПустаяСтрока(ПользовательПрокси),
+ ?(ПустаяСтрока(Хвост), "", ", "),
+ ", """ + КавычкиВТексте1С(ПользовательПрокси) + """"
+ ) + Хвост;
+
+ Построитель.Добавить(СтрШаблон(
+ " .ИспользоватьПрокси(ДополнительныеПараметры, ""%1"", %2%3)",
+ СерверПрокси,
+ XMLСтрока(ПортПрокси),
+ Хвост
+ ));
+
+ ЕстьДополнительныеПараметры = Истина;
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьВКодЗапросаИспользованиеСессии(Построитель, ЕстьДополнительныеПараметры)
- Если ИспользоватьСессию Тогда
- Построитель.Добавить(" .ИспользоватьСессию(ДополнительныеПараметры)");
- Построитель.Добавить(СтрШаблон(" .УстановитьПорогПеренаправлений(ДополнительныеПараметры, %1)", XMLСтрока(ПорогПеренаправлений)));
-
- ЕстьДополнительныеПараметры = Истина;
+ Если НЕ ИспользоватьСессию Тогда
+ Возврат;
+ КонецЕсли;
+
+ Построитель.Добавить(" .ИспользоватьСессию(ДополнительныеПараметры)");
+
+ Если ПорогПеренаправлений <> 10 Тогда
+ Построитель.Добавить(СтрШаблон(" .УстановитьПорогПеренаправлений(ДополнительныеПараметры, %1)", ПорогПеренаправлений));
+ КонецЕсли;
+
+ Если ПеренаправлениеКакGET Тогда
+ Построитель.Добавить(" .ПеренаправленияКакGET(ДополнительныеПараметры)");
КонецЕсли;
+
+ ЕстьДополнительныеПараметры = Истина;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ДобавитьВКодЗапросаПовторноеВыполнение(Построитель, КодыСостояния, ЕстьДополнительныеПараметры)
+ СпособыПовторногоВыполнения = Элементы.СпособПовторногоВыполнения.СписокВыбора;
+ Если СпособПовторногоВыполнения = СпособыПовторногоВыполнения[0].Значение Тогда // Разово
+ Возврат;
+ КонецЕсли;
+
+ КодыСостояния = КодыСостоянияОтветаПовторногоВыполнения.ВыгрузитьЗначения();
+
+ ЧастиСтроки = Новый Массив;
+ ОкончанияСтроки = Новый Массив;
+ Если СпособПовторногоВыполнения = СпособыПовторногоВыполнения[1].Значение Тогда // Фиксировано
+ ЧастиСтроки.Добавить(" .ФиксированоОтложенныеВыполнения(ДополнительныеПараметры");
+
+ ОкончанияСтроки.Добавить(?(ДлительностьПаузыПовторногоВыполнения = 1, "", XMLСтрока(ДлительностьПаузыПовторногоВыполнения)));
+ ОкончанияСтроки.Добавить(?(ПорогКоличестваПопытокПовторногоВыполнения = 9, "", XMLСтрока(ПорогКоличестваПопытокПовторногоВыполнения)));
+ ОкончанияСтроки.Добавить(?(МаксимальнаяДлительностьПаузыПовторногоВыполнения = 600, "", XMLСтрока(МаксимальнаяДлительностьПаузыПовторногоВыполнения)));
+ ОкончанияСтроки.Добавить(?(КодыСостояния.Количество() = 0, "", "КодыСостоянияПовторногоВыполнения"));
+ ИначеЕсли СпособПовторногоВыполнения = СпособыПовторногоВыполнения[2].Значение Тогда // Линейно
+ ЧастиСтроки.Добавить(" .ЛинейноОтложенныеВыполнения(ДополнительныеПараметры");
+
+ ОкончанияСтроки.Добавить(?(ДлительностьПаузыПовторногоВыполнения = 1, "", XMLСтрока(ДлительностьПаузыПовторногоВыполнения)));
+ ОкончанияСтроки.Добавить(?(КоэффициентУвеличенияПаузыПовторногоВыполнения = 1, "", XMLСтрока(КоэффициентУвеличенияПаузыПовторногоВыполнения)));
+ ОкончанияСтроки.Добавить(?(ПорогКоличестваПопытокПовторногоВыполнения = 9, "", XMLСтрока(ПорогКоличестваПопытокПовторногоВыполнения)));
+ ОкончанияСтроки.Добавить(?(МаксимальнаяДлительностьПаузыПовторногоВыполнения = 600, "", XMLСтрока(МаксимальнаяДлительностьПаузыПовторногоВыполнения)));
+ ОкончанияСтроки.Добавить(?(КодыСостояния.Количество() = 0, "", "КодыСостоянияПовторногоВыполнения"));
+ ИначеЕсли СпособПовторногоВыполнения = СпособыПовторногоВыполнения[3].Значение Тогда // Экспоненциально
+ ЧастиСтроки.Добавить(" .ЭкспоненциальноОтложенныеВыполнения(ДополнительныеПараметры");
+
+ ОкончанияСтроки.Добавить(?(ДлительностьПаузыПовторногоВыполнения = 1, "", XMLСтрока(ДлительностьПаузыПовторногоВыполнения)));
+ ОкончанияСтроки.Добавить(?(КоэффициентУвеличенияПаузыПовторногоВыполнения = 2, "", XMLСтрока(КоэффициентУвеличенияПаузыПовторногоВыполнения)));
+ ОкончанияСтроки.Добавить(?(ПорогКоличестваПопытокПовторногоВыполнения = 9, "", XMLСтрока(ПорогКоличестваПопытокПовторногоВыполнения)));
+ ОкончанияСтроки.Добавить(?(МаксимальнаяДлительностьПаузыПовторногоВыполнения = 3600, "", XMLСтрока(МаксимальнаяДлительностьПаузыПовторногоВыполнения)));
+ ОкончанияСтроки.Добавить(?(КодыСостояния.Количество() = 0, "", "КодыСостоянияПовторногоВыполнения"));
+ КонецЕсли;
+
+ ВсегоЧастейОкончания = ОкончанияСтроки.Количество();
+ Для _ = 1 По ВсегоЧастейОкончания Цикл
+ Если ОкончанияСтроки[ОкончанияСтроки.ВГраница()] <> "" Тогда
+ Прервать;
+ КонецЕсли;
+
+ ОкончанияСтроки.Удалить(ОкончанияСтроки.ВГраница());
+ КонецЦикла;
+
+ ЧастиСтроки.Добавить(СтрСоединить(ОкончанияСтроки, ", "));
+ Построитель.Добавить(СтрСоединить(ЧастиСтроки, ", ") + ")");
+
+ ЕстьДополнительныеПараметры = Истина;
КонецПроцедуры
&НаКлиенте
@@ -1673,8 +2323,8 @@
Построитель.Добавить(СтрШаблон(
" .ДобавитьПараметр(ПараметрыЗапроса, ""%1"", ""%2"")",
- СтрЗаменить(Стр.Ключ, """", """"""),
- СтрЗаменить(Стр.Значение, """", """""")
+ КавычкиВТексте1С(Стр.Ключ),
+ КавычкиВТексте1С(Стр.Значение)
));
ЕстьПараметрыЗапроса = Истина;
@@ -1683,74 +2333,193 @@
&НаКлиенте
Процедура ДобавитьВКодЗапросаЗаголовки(Построитель, ЕстьДополнительныеПараметры)
+ КлючАгент = НРег(КлиентHTTPПовтИсп.ЗаголовокАгентПользователя());
+ ЗначениеАгент = АгентПользователя;
+
Для Каждого Стр Из ЗаголовкиЗапроса Цикл
Если НЕ Стр.Активно Тогда
Продолжить;
КонецЕсли;
- Построитель.Добавить(СтрШаблон(" .УстановитьЗаголовок(ДополнительныеПараметры, ""%1"", ""%2"")", Стр.Ключ, СтрЗаменить(Стр.Значение, """", """""")));
+ Если НРег(Стр.Ключ) = КлючАгент Тогда
+ ЗначениеАгент = Стр.Значение;
+ Иначе
+ Построитель.Добавить(СтрШаблон(" .УстановитьЗаголовок(ДополнительныеПараметры, ""%1"", ""%2"")", Стр.Ключ, КавычкиВТексте1С(Стр.Значение)));
+ КонецЕсли;
ЕстьДополнительныеПараметры = Истина;
КонецЦикла;
+
+ Если НЕ ПустаяСтрока(ЗначениеАгент) Тогда
+ Построитель.Добавить(СтрШаблон(" .УстановитьАгентаПользователя(ДополнительныеПараметры, ""%1"")", ЗначениеАгент));
+
+ ЕстьДополнительныеПараметры = Истина;
+ КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьВКодЗапросаСжатиеОтвета(Построитель, ЕстьДополнительныеПараметры)
- Если ПоддержкаСжатогоОтвета Тогда
- Построитель.Добавить(" .УстановитьСжатиеОтветаGZIP(ДополнительныеПараметры)");
-
- ЕстьДополнительныеПараметры = Истина;
+ Если НЕ ПоддержкаСжатогоОтвета Тогда
+ Возврат;
+ КонецЕсли;
+
+ Построитель.Добавить(" .УстановитьСжатиеОтветаGZIP(ДополнительныеПараметры)");
+
+ ЕстьДополнительныеПараметры = Истина;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ДобавитьВКодЗапросаТаймаут(Построитель, ЕстьДополнительныеПараметры)
+ Если Таймаут = 0 Тогда
+ Возврат;
КонецЕсли;
+
+ Построитель.Добавить(СтрШаблон(" .УстановитьТаймаут(ДополнительныеПараметры, %1)", XMLСтрока(Таймаут)));
+
+ ЕстьДополнительныеПараметры = Истина;
КонецПроцедуры
&НаКлиенте
-Процедура ДобавитьВКодЗапросаАвторизацию(Построитель, ЕстьДополнительныеПараметры)
- ТипАвторизацииСписокВыбора = Элементы.ТипАвторизации.СписокВыбора;
- Если ТипАвторизации = ТипАвторизацииСписокВыбора[1].Значение Тогда // Basic
+Процедура ДобавитьВКодЗапросаСертификаты(Построитель, ЕстьФайлКлиентскогоСертификата, ЕстьФайлСертификатовУЦ, ЕстьДополнительныеПараметры)
+ Если НЕ ИспользоватьСертификаты ИЛИ ПустаяСтрока(ИмяФайлаКлиентскогоСертификата) Тогда
+ Возврат;
+ КонецЕсли;
+
+ ЕстьДополнительныеПараметры = Истина;
+ ЕстьФайлКлиентскогоСертификата = Истина;
+
+ ЧастиСтроки = Новый Массив;
+ ЧастиСтроки.Добавить(
+ " .ИспользоватьФайлСертификатаКлиента(ДополнительныеПараметры, ФайлКлиентскогоСертификата"
+ );
+
+ Если ПарольКлиентскогоСертификата <> "" Тогда
+ ЧастиСтроки.Добавить(СтрШаблон(
+ """%1""",
+ КавычкиВТексте1С(ОтображениеСекрета(ПарольКлиентскогоСертификата, Элементы.ПарольКлиентскогоСертификата))
+ ));
+ КонецЕсли;
+ Построитель.Добавить(СтрСоединить(ЧастиСтроки, ", ") + ")");
+
+ Если ПустаяСтрока(ИмяФайлаСертификатовУЦ) Тогда
+ Возврат;
+ КонецЕсли;
+
+ ЕстьФайлСертификатовУЦ = Истина;
+
+ ЧастиСтроки = Новый Массив;
+ ЧастиСтроки.Добавить(
+ " .ИспользоватьФайлСертификатовУдостоверяющихЦентров(ДополнительныеПараметры, ФайлСертификатовУЦ"
+ );
+
+ Если ПарольФайлаСертификатовУЦ <> "" Тогда
+ ЧастиСтроки.Добавить(СтрШаблон(
+ """%1""",
+ КавычкиВТексте1С(ОтображениеСекрета(ПарольФайлаСертификатовУЦ, Элементы.ПарольФайлаСертификатовУЦ))
+ ));
+ КонецЕсли;
+ Построитель.Добавить(СтрСоединить(ЧастиСтроки, ", ") + ")");
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ДобавитьВКодЗапросаАутентификацию(Построитель, ЕстьДополнительныеПараметры)
+ ТипАутентификацииСписокВыбора = Элементы.ТипАутентификации.СписокВыбора;
+ Если ТипАутентификации = ТипАутентификацииСписокВыбора[1].Значение Тогда // Basic
Построитель.Добавить(СтрШаблон(
" .УстановитьBasicАвторизацию(ДополнительныеПараметры, ""%1"", ""%2"")",
- ПользовательАвторизации,
- ПарольАвторизации
+ ПользовательАутентификации,
+ КавычкиВТексте1С(ОтображениеСекрета(ПарольАутентификации, Элементы.ПарольАутентификации))
));
ЕстьДополнительныеПараметры = Истина;
- ИначеЕсли ТипАвторизации = ТипАвторизацииСписокВыбора[2].Значение Тогда // NTLM
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[2].Значение Тогда // NTLM
Построитель.Добавить(СтрШаблон(
" .УстановитьNTLMАвторизацию(ДополнительныеПараметры, ""%1"", ""%2"")",
- ПользовательАвторизации,
- ПарольАвторизации
+ ПользовательАутентификации,
+ КавычкиВТексте1С(ОтображениеСекрета(ПарольАутентификации, Элементы.ПарольАутентификации))
));
ЕстьДополнительныеПараметры = Истина;
- ИначеЕсли ТипАвторизации = ТипАвторизацииСписокВыбора[3].Значение Тогда // Digest
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[3].Значение Тогда // Digest
Построитель.Добавить(СтрШаблон(
" .УстановитьDigestАвторизацию(ДополнительныеПараметры, ""%1"", ""%2"")",
- ПользовательАвторизации,
- ПарольАвторизации
+ ПользовательАутентификации,
+ КавычкиВТексте1С(ОтображениеСекрета(ПарольАутентификации, Элементы.ПарольАутентификации))
));
ЕстьДополнительныеПараметры = Истина;
- ИначеЕсли ТипАвторизации = ТипАвторизацииСписокВыбора[4].Значение Тогда // Bearer
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[4].Значение Тогда // Bearer
Построитель.Добавить(СтрШаблон(
" .УстановитьBearerАвторизацию(ДополнительныеПараметры, ""%1"")",
- ТокенАвторизации
+ ОтображениеСекрета(ТокенАутентификации, Элементы.ТокенАутентификации)
+ ));
+
+ ЕстьДополнительныеПараметры = Истина;
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[5].Значение Тогда // AWS4-HMAC-SHA256
+ ЧастиСтроки = Новый Массив;
+ ЧастиСтроки.Добавить(СтрШаблон(
+ " .УстановитьAWS4Авторизацию(ДополнительныеПараметры, ""%1"", ""%2""",
+ AWSКлючДоступа,
+ КавычкиВТексте1С(ОтображениеСекрета(AWSСекретныйКлюч, Элементы.СекретныйКлючAWS))
+ ));
+ Если НЕ ПустаяСтрока(AWSРегион) Тогда
+ ЧастиСтроки.Добавить(СтрШаблон(", ""%1""", AWSРегион));
+ КонецЕсли;
+ Если НЕ ПустаяСтрока(AWSСервис) Тогда
+ ЧастиСтроки.Добавить(?(
+ ПустаяСтрока(AWSРегион),
+ СтрШаблон(", , ""%1""", AWSСервис),
+ СтрШаблон(", ""%1""", AWSСервис)
+ ));
+ КонецЕсли;
+ ЧастиСтроки.Добавить(")");
+
+ Построитель.Добавить(СтрСоединить(ЧастиСтроки, ""));
+
+ ЕстьДополнительныеПараметры = Истина;
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[6].Значение Тогда // Hawk
+ ЧастиСтроки = Новый Массив;
+ ЧастиСтроки.Добавить(СтрШаблон(
+ " .УстановитьHawkАвторизацию(ДополнительныеПараметры, ""%1"", ""%2""",
+ HawkИдентификатор,
+ КавычкиВТексте1С(ОтображениеСекрета(HawkКлюч, Элементы.КлючHawk))
));
+ ОкончанияСтроки = Новый Массив;
+ ОкончанияСтроки.Добавить(СокрЛП(HawkДополнение));
+ ОкончанияСтроки.Добавить(СокрЛП(HawkИдентификаторПриложения));
+ ОкончанияСтроки.Добавить(СокрЛП(HawkДелегирование));
+ Для я = 0 По 2 Цикл
+ Если ОкончанияСтроки[ОкончанияСтроки.ВГраница()] <> "" Тогда
+ Прервать;
+ КонецЕсли;
+
+ ОкончанияСтроки.Удалить(ОкончанияСтроки.ВГраница());
+ КонецЦикла;
+
+ Для Каждого Окончание Из ОкончанияСтроки Цикл
+ ЧастиСтроки.Добавить(?(Окончание = "", "", СтрШаблон("""%1""", СокрЛП(Окончание))));
+ КонецЦикла;
+
+ Построитель.Добавить(СтрСоединить(ЧастиСтроки, ", ") + ")");
+
ЕстьДополнительныеПараметры = Истина;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьВКодЗапросаФайлТелаОтвета(Построитель, ЕстьДополнительныеПараметры, ТребуетсяИмяФайлаТелаОтвета)
- Если ТелоОтветаВФайл Тогда
- ЕстьДополнительныеПараметры = Истина;
- ТребуетсяИмяФайлаТелаОтвета = ПустаяСтрока(ИмяФайлаТелаОтвета);
-
- Построитель.Добавить(СтрШаблон(
- " .УстановитьИмяВыходногоФайла(ДополнительныеПараметры, %1)",
- ?(ТребуетсяИмяФайлаТелаОтвета, "ИмяФайлаТелаОтвета", СтрШаблон("""%1""", ИмяФайлаТелаОтвета))
- ));
+ Если НЕ ТелоОтветаВФайл Тогда
+ Возврат;
КонецЕсли;
+
+ ЕстьДополнительныеПараметры = Истина;
+ ТребуетсяИмяФайлаТелаОтвета = ПустаяСтрока(ИмяФайлаТелаОтвета);
+
+ Построитель.Добавить(СтрШаблон(
+ " .УстановитьИмяВыходногоФайла(ДополнительныеПараметры, %1)",
+ ?(ТребуетсяИмяФайлаТелаОтвета, "ИмяФайлаТелаОтвета", СтрШаблон("""%1""", ИмяФайлаТелаОтвета))
+ ));
КонецПроцедуры
&НаКлиенте
@@ -2087,114 +2856,579 @@
КонецПроцедуры
&НаКлиенте
-Процедура ДобавитьВКодЗапросаИнициализациюПолейФормы(Построитель, ТекстПолейФормы, ФайлыПолейФормы)
- Смещение = 0;
- Для Каждого ФайлПоляФормы Из ФайлыПолейФормы Цикл
- Построитель.Вставить(
- 1 + Смещение,
- СтрШаблон("%1 = Новый Файл(""%2"");", ФайлПоляФормы.ИмяПеременной, ФайлПоляФормы.Путь)
- );
-
- Смещение = Смещение + 1;
- КонецЦикла;
- Если Смещение > 0 Тогда
- Построитель.Вставить(1 + Смещение, "");
+Процедура ДобавитьВКодЗапросаИнициализациюПолейФормы(Построитель, ТекстПолейФормы, ФайлыПолейФормы)
+ Смещение = 0;
+ Для Каждого ФайлПоляФормы Из ФайлыПолейФормы Цикл
+ Построитель.Вставить(
+ 1 + Смещение,
+ СтрШаблон("%1 = Новый Файл(""%2"");", ФайлПоляФормы.ИмяПеременной, ФайлПоляФормы.Путь)
+ );
+
+ Смещение = Смещение + 1;
+ КонецЦикла;
+ Если Смещение > 0 Тогда
+ Построитель.Вставить(1 + Смещение, "");
+ КонецЕсли;
+
+ Смещение = 0;
+ Для Каждого ТекстПоляФормы Из ТекстПолейФормы Цикл
+ Построитель.Вставить(
+ 1 + Смещение,
+ ИнициализацияТекстовойПеременной(ТекстПоляФормы.ИмяПеременной, ТекстПоляФормы.ЗначениеПеременной)
+ );
+
+ Смещение = Смещение + 1;
+ КонецЦикла;
+ Если Смещение > 0 Тогда
+ Построитель.Вставить(1 + Смещение, "");
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ДобавитьВКодЗапросаИнициализациюПовторногоВыполнения(Построитель, Знач КодыСостояния)
+ Если КодыСостояния.Количество() = 0 Тогда
+ Возврат;
+ КонецЕсли;
+
+ КонстантыКодовСостояния = Новый Соответствие;
+ КонстантыКодовСостояния.Вставить(200, "КлиентHTTPПовтИсп.КодСостоянияУспешно()");
+ КонстантыКодовСостояния.Вставить(201, "КлиентHTTPПовтИсп.КодСостоянияСоздано()");
+ КонстантыКодовСостояния.Вставить(204, "КлиентHTTPПовтИсп.КодСостоянияУспешноБезСодержимого()");
+ КонстантыКодовСостояния.Вставить(301, "КлиентHTTPПовтИсп.КодСостоянияПеремещен()");
+ КонстантыКодовСостояния.Вставить(302, "КлиентHTTPПовтИсп.КодСостоянияНайден()");
+ КонстантыКодовСостояния.Вставить(303, "КлиентHTTPПовтИсп.КодСостоянияПросмотрДругихРесурсов()");
+ КонстантыКодовСостояния.Вставить(307, "КлиентHTTPПовтИсп.КодСостоянияВременноеПеренаправление()");
+ КонстантыКодовСостояния.Вставить(308, "КлиентHTTPПовтИсп.КодСостоянияПеренаправление()");
+ КонстантыКодовСостояния.Вставить(400, "КлиентHTTPПовтИсп.КодСостоянияПлохойЗапрос()");
+ КонстантыКодовСостояния.Вставить(401, "КлиентHTTPПовтИсп.КодСостоянияНеАвторизовано()");
+ КонстантыКодовСостояния.Вставить(403, "КлиентHTTPПовтИсп.КодСостоянияЗапрещено()");
+ КонстантыКодовСостояния.Вставить(404, "КлиентHTTPПовтИсп.КодСостоянияНеНайден()");
+ КонстантыКодовСостояния.Вставить(405, "КлиентHTTPПовтИсп.КодСостоянияМетодНеРазрешен()");
+ КонстантыКодовСостояния.Вставить(408, "КлиентHTTPПовтИсп.КодСостоянияТаймаутНаКлиенте()");
+ КонстантыКодовСостояния.Вставить(410, "КлиентHTTPПовтИсп.КодСостоянияУдалено()");
+ КонстантыКодовСостояния.Вставить(413, "КлиентHTTPПовтИсп.КодСостоянияПревышенЛимитТела()");
+ КонстантыКодовСостояния.Вставить(418, "КлиентHTTPПовтИсп.КодСостоянияЧайник()");
+ КонстантыКодовСостояния.Вставить(429, "КлиентHTTPПовтИсп.КодСостоянияСлишкомМногоЗапросов()");
+ КонстантыКодовСостояния.Вставить(500, "КлиентHTTPПовтИсп.КодСостоянияВнутренняяОшибкаСервера()");
+ КонстантыКодовСостояния.Вставить(501, "КлиентHTTPПовтИсп.КодСостоянияНеВыполнено()");
+ КонстантыКодовСостояния.Вставить(502, "КлиентHTTPПовтИсп.КодСостоянияПлохойШлюз()");
+ КонстантыКодовСостояния.Вставить(503, "КлиентHTTPПовтИсп.КодСостоянияСервисНедоступен()");
+ КонстантыКодовСостояния.Вставить(504, "КлиентHTTPПовтИсп.КодСостоянияТаймаутНаСервере()");
+
+ ЧастиСтроки = Новый Массив;
+ ЧастиСтроки.Добавить("КодыСостоянияПовторногоВыполнения = Новый Массив;");
+
+ Для Каждого Код Из КодыСостояния Цикл
+ Константа = КонстантыКодовСостояния.Получить(Код);
+ ЧастиСтроки.Добавить(СтрШаблон("КодыСостоянияПовторногоВыполнения.Добавить(%1);", ?(Константа = Неопределено, XMLСтрока(Код), Константа)));
+ КонецЦикла;
+
+ Построитель.Вставить(1, "");
+ Построитель.Вставить(1, СтрСоединить(ЧастиСтроки, Символы.ПС));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ДобавитьВКодЗапросаИнициализациюКонфигурации(Построитель, Знач ЕстьПараметрыЗапроса, Знач ЕстьДополнительныеПараметры, Знач ТребуетсяИмяФайлаТелаОтвета, Знач ЕстьТекстТелаЗапроса, Знач ЕстьПоляФормы, Знач ЕстьФайлКлиентскогоСертификата, Знач ЕстьФайлСертификатовУЦ)
+ Если ЕстьФайлСертификатовУЦ Тогда
+ Построитель.Вставить(1, СтрШаблон("ФайлСертификатовУЦ = Новый Файл(""%1"");", ИмяФайлаСертификатовУЦ));
+ КонецЕсли;
+
+ Если ЕстьФайлКлиентскогоСертификата Тогда
+ Построитель.Вставить(1, СтрШаблон("ФайлКлиентскогоСертификата = Новый Файл(""%1"");", ИмяФайлаКлиентскогоСертификата));
+ КонецЕсли;
+
+ Если ЕстьПоляФормы Тогда
+ Построитель.Вставить(1, "ПоляФормы = КлиентHTTPКлиентСервер.НовыеПоляФормы();");
+ КонецЕсли;
+
+ Если ЕстьТекстТелаЗапроса Тогда
+ Построитель.Вставить(1, ИнициализацияТекстовойПеременной("ТелоЗапросаТекст", ТелоЗапросаТекст));
+ КонецЕсли;
+
+ Если ЕстьДополнительныеПараметры Тогда
+ Построитель.Вставить(1, "ДополнительныеПараметры = КлиентHTTPКлиентСервер.НовыеДополнительныеПараметры();");
+ КонецЕсли;
+
+ Если ЕстьПараметрыЗапроса Тогда
+ Построитель.Вставить(1, "ПараметрыЗапроса = КлиентHTTPКлиентСервер.НовыеПараметрыЗапроса();");
+ КонецЕсли;
+
+ Если ТребуетсяИмяФайлаТелаОтвета Тогда
+ Построитель.Вставить(1, "ИмяФайлаТелаОтвета = ПолучитьИмяВременногоФайла(""dat"");");
+ КонецЕсли;
+
+ Построитель.Вставить(
+ 1 + ТребуетсяИмяФайлаТелаОтвета + ЕстьПараметрыЗапроса + ЕстьДополнительныеПараметры + ЕстьПоляФормы + ЕстьТекстТелаЗапроса + ЕстьФайлКлиентскогоСертификата + ЕстьФайлСертификатовУЦ,
+ ""
+ );
+КонецПроцедуры
+
+&НаКлиенте
+Функция КодЗапросаКонсоли()
+ ЧастиКода = Новый Массив;
+ ЧастиСтрокиКода = Новый Массив;
+
+ ЕстьФайлКлиентскогоСертификата = Ложь;
+ ЕстьФайлСертификатовУЦ = Ложь;
+ ЕстьДополнительныеПараметры = Ложь;
+ ЕстьПараметрыЗапроса = Ложь;
+ ЕстьПоляФормы = Ложь;
+ ЕстьТекстТелаЗапроса = Ложь;
+ ТребуетсяИмяФайлаТелаОтвета = Ложь;
+ ТекстПолейФормы = Новый Массив;
+ ФайлыПолейФормы = Новый Массив;
+ КодыСостоянияПовторногоВыполнения = Новый Массив;
+
+ ДобавитьВКодЗапросаИдентификаторРесурса(ЧастиКода);
+
+ // Начало текучего интерфейса
+ ЧастиКода.Добавить(СтрШаблон("Ответ = %1КлиентHTTPКлиентСервер", ?(ВыполнятьНаСервере, "", "Ждать ")));
+
+ ДобавитьВКодЗапросаТаймаут(ЧастиКода, ЕстьДополнительныеПараметры);
+ ДобавитьВКодЗапросаИспользованиеПрокси(ЧастиКода, ЕстьДополнительныеПараметры);
+ ДобавитьВКодЗапросаИспользованиеСессии(ЧастиКода, ЕстьДополнительныеПараметры);
+ ДобавитьВКодЗапросаПовторноеВыполнение(ЧастиКода, КодыСостоянияПовторногоВыполнения, ЕстьДополнительныеПараметры);
+ ДобавитьВКодЗапросаПараметры(ЧастиКода, ЕстьПараметрыЗапроса);
+ ДобавитьВКодЗапросаЗаголовки(ЧастиКода, ЕстьДополнительныеПараметры);
+ ДобавитьВКодЗапросаСжатиеОтвета(ЧастиКода, ЕстьДополнительныеПараметры);
+ ДобавитьВКодЗапросаСертификаты(ЧастиКода, ЕстьФайлКлиентскогоСертификата, ЕстьФайлСертификатовУЦ, ЕстьДополнительныеПараметры);
+ ДобавитьВКодЗапросаАутентификацию(ЧастиКода, ЕстьДополнительныеПараметры);
+ ДобавитьВКодЗапросаФайлТелаОтвета(ЧастиКода, ЕстьДополнительныеПараметры, ТребуетсяИмяФайлаТелаОтвета);
+ ДобавитьВКодЗапросаМетод(ЧастиКода, ЕстьТекстТелаЗапроса, ЕстьПоляФормы, ТекстПолейФормы, ФайлыПолейФормы, ЕстьПараметрыЗапроса, ЕстьДополнительныеПараметры);
+ ДобавитьВКодЗапросаИнициализациюПолейФормы(ЧастиКода, ТекстПолейФормы, ФайлыПолейФормы);
+ ДобавитьВКодЗапросаИнициализациюПовторногоВыполнения(ЧастиКода, КодыСостоянияПовторногоВыполнения);
+ ДобавитьВКодЗапросаИнициализациюКонфигурации(ЧастиКода, ЕстьПараметрыЗапроса, ЕстьДополнительныеПараметры, ТребуетсяИмяФайлаТелаОтвета, ЕстьТекстТелаЗапроса, ЕстьПоляФормы, ЕстьФайлКлиентскогоСертификата, ЕстьФайлСертификатовУЦ);
+
+ Возврат СтрСоединить(ЧастиКода, Символы.ПС);
+КонецФункции
+
+&НаКлиенте
+Функция ИнициализацияТекстовойПеременной(Знач ИмяПеременной, Знач ЗначениеПеременной)
+ Возврат СтрШаблон(
+ "%1 = %2""%3"";",
+ ИмяПеременной,
+ ?(
+ СтрНайти(ЗначениеПеременной, Символы.ПС) > 0,
+ "
+ | ",
+ ""
+ ),
+ СтрЗаменить(КавычкиВТексте1С(ЗначениеПеременной), Символы.ПС, Символы.ПС + " |")
+ );
+КонецФункции
+
+&НаКлиенте
+Функция КавычкиВТексте1С(Знач Текст)
+ Возврат СтрЗаменить(Текст, """", """""");
+КонецФункции
+#КонецОбласти
+
+#Область ГенерацияКомандыCurl
+&НаКлиенте
+Функция ЭкранированиеАпострофаUnix(Знач Текст)
+ Возврат СтрЗаменить(Текст, "'", "'\''")
+КонецФункции
+
+&НаКлиенте
+Функция ЭкранированиеСимволовЗначенияПоляФормы(Знач Текст, Знач ЭкранироватьОбратныйСлеш)
+ Возврат СтрЗаменить(
+ ЭкранированиеАпострофаUnix(
+ ?(
+ ЭкранироватьОбратныйСлеш,
+ СтрЗаменить(Текст, "\", "\\"),
+ Текст
+ )
+ ), """", "\"""
+ );
+КонецФункции
+
+&НаКлиенте
+Процедура ЗаполнитьПовторноеВыполнениеCurlКоманды(ЧастиКоманды)
+ Способы = Элементы.СпособПовторногоВыполнения.СписокВыбора;
+ Если СпособПовторногоВыполнения <> Способы[1].Значение И СпособПовторногоВыполнения <> Способы[3].Значение Тогда // не Фиксировано и не Экспоненциально
+ Возврат;
+ КонецЕсли;
+
+ ЧастиКоманды.Добавить("--retry");
+ ЧастиКоманды.Добавить(XMLСтрока(ПорогКоличестваПопытокПовторногоВыполнения));
+
+ Если СпособПовторногоВыполнения = Способы[1].Значение Тогда // Фиксировано
+ ЧастиКоманды.Добавить("--retry-delay");
+ ЧастиКоманды.Добавить(XMLСтрока(ДлительностьПаузыПовторногоВыполнения));
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьКлиентскийСертификатCurlКоманды(ЧастиКоманды)
+ Если НЕ ИспользоватьСертификаты ИЛИ ПустаяСтрока(ИмяФайлаКлиентскогоСертификата) Тогда
+ Возврат;
+ КонецЕсли;
+
+ Если НЕ ПустаяСтрока(ИмяФайлаСертификатовУЦ) Тогда
+ ЧастиКоманды.Добавить("--cacert");
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", ЭкранированиеАпострофаUnix(СокрЛП(ИмяФайлаСертификатовУЦ))));
+ КонецЕсли;
+
+ ФайлКС = Новый Файл(ИмяФайлаКлиентскогоСертификата);
+ РасширениеКС = НРег(ФайлКС.Расширение);
+ Если РасширениеКС = ".p12" ИЛИ РасширениеКС = ".pfx" Тогда
+ ЧастиКоманды.Добавить("--cert-type P12");
+ КонецЕсли;
+
+ ЧастиСертификата = Новый Массив;
+
+ ЧастиКоманды.Добавить("--cert");
+ ЧастиСертификата.Добавить(СокрЛП(ИмяФайлаКлиентскогоСертификата));
+
+ Пароль = ОтображениеСекрета(ПарольКлиентскогоСертификата, Элементы.ПарольКлиентскогоСертификата, Ложь);
+ Если Пароль <> "" Тогда
+ ЧастиСертификата.Добавить(Пароль);
+ КонецЕсли;
+
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", ЭкранированиеАпострофаUnix(СтрСоединить(ЧастиСертификата, ":"))));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьПользователяИПарольCurlКоманды(ЧастиКоманды)
+ Если НЕ ЗначениеЗаполнено(ПользовательАутентификации) Тогда
+ Возврат;
+ КонецЕсли;
+
+ ЧастиАутентификации = Новый Массив;
+
+ ЧастиКоманды.Добавить("-u");
+ ЧастиАутентификации.Добавить(ПользовательАутентификации);
+ ЧастиАутентификации.Добавить(ОтображениеСекрета(ПарольАутентификации, Элементы.ПарольАутентификации));
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", ЭкранированиеАпострофаUnix(СтрСоединить(ЧастиАутентификации, ":"))));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьAWS4CurlКоманды(ЧастиКоманды)
+ ЧастиАутентификации = Новый Массив;
+
+ ЧастиКоманды.Добавить("-u");
+ ЧастиАутентификации.Добавить(AWSКлючДоступа);
+ ЧастиАутентификации.Добавить(ОтображениеСекрета(AWSСекретныйКлюч, Элементы.СекретныйКлючAWS));
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", ЭкранированиеАпострофаUnix(СтрСоединить(ЧастиАутентификации, ":"))));
+
+ ЧастиКоманды.Добавить("--aws-sigv4");
+ ЧастиАутентификации.Очистить();
+ ЧастиАутентификации.Добавить("aws:amz");
+ Если НЕ ПустаяСтрока(AWSРегион) Тогда
+ ЧастиАутентификации.Добавить(AWSРегион);
+ Если НЕ ПустаяСтрока(AWSСервис) Тогда
+ ЧастиАутентификации.Добавить(AWSСервис);
+ КонецЕсли;
+ КонецЕсли;
+
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", ЭкранированиеАпострофаUnix(СтрСоединить(ЧастиАутентификации, ":"))));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьАутентификациюCurlКоманды(ЧастиКоманды)
+ Если ТипАутентификации = Элементы.ТипАутентификации.СписокВыбора[0].Значение Тогда
+ ИначеЕсли ТипАутентификации = Элементы.ТипАутентификации.СписокВыбора[1].Значение Тогда // Basic
+ ЗаполнитьПользователяИПарольCurlКоманды(ЧастиКоманды);
+ ЧастиКоманды.Добавить("--basic");
+ ИначеЕсли ТипАутентификации = Элементы.ТипАутентификации.СписокВыбора[2].Значение Тогда // NTLM
+ ЗаполнитьПользователяИПарольCurlКоманды(ЧастиКоманды);
+ ЧастиКоманды.Добавить("--ntlm");
+ ИначеЕсли ТипАутентификации = Элементы.ТипАутентификации.СписокВыбора[3].Значение Тогда // Digest
+ ЗаполнитьПользователяИПарольCurlКоманды(ЧастиКоманды);
+ ЧастиКоманды.Добавить("--digest");
+ ИначеЕсли ТипАутентификации = Элементы.ТипАутентификации.СписокВыбора[4].Значение Тогда // Bearer
+ ЧастиКоманды.Добавить("--oauth2-bearer");
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", ЭкранированиеАпострофаUnix(ОтображениеСекрета(ТокенАутентификации, Элементы.ТокенАутентификации))));
+ ИначеЕсли ТипАутентификации = Элементы.ТипАутентификации.СписокВыбора[5].Значение Тогда // AWS4-HMAC-SHA256
+ ЗаполнитьAWS4CurlКоманды(ЧастиКоманды);
+ Иначе
+ СообщитьПользователю(СтрШаблон("Для типа аутентификации %1 нет отображения в команде curl", ТипАутентификации));
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьПолеФормыCurlКоманды(ЧастиКоманды, Знач Поле)
+ ТипMIME = "";
+ ИмяФайла = "";
+ ЭкранироватьОбратныйСлеш = Истина;
+ ТипыДанныхФормыФайл = Элементы.ТелоЗапросаДанныеФормы.ПодчиненныеЭлементы.ДанныеФормыТип.СписокВыбора[1].Значение;
+
+ ЧастиПоляФормы = Новый Массив;
+ ЧастиПоляФормы.Добавить(ЭкранированиеАпострофаUnix(Поле.Ключ));
+ ЧастиПоляФормы.Добавить("=");
+ Если Поле.Тип = ТипыДанныхФормыФайл Тогда
+ ЧастиПоляФормы.Добавить("@");
+
+ ФайлПоля = Новый Файл(Поле.Значение);
+ ИмяФайла = ФайлПоля.Имя;
+ ТипMIME = КлиентHTTPСлужебный.ТипMIMEРасширенияФайла(ФайлПоля.Расширение);
+ ЭкранироватьОбратныйСлеш = ?(ВыполнятьНаСервере, РазделительПутиСервера(), ПолучитьРазделительПутиКлиента()) <> "\";
+ КонецЕсли;
+
+ ЧастиПоляФормы.Добавить("""");
+ ЧастиПоляФормы.Добавить(ЭкранированиеСимволовЗначенияПоляФормы(Поле.Значение, ЭкранироватьОбратныйСлеш));
+
+ Если НЕ ПустаяСтрока(ИмяФайла) Тогда
+ ЧастиПоляФормы.Добавить(";filename=");
+ ЧастиПоляФормы.Добавить(ИмяФайла);
+ КонецЕсли;
+ Если НЕ ПустаяСтрока(ТипMIME) Тогда
+ ЧастиПоляФормы.Добавить(";type=");
+ ЧастиПоляФормы.Добавить(ТипMIME);
+ КонецЕсли;
+
+ ЧастиПоляФормы.Добавить("""");
+
+ ЧастиКоманды.Добавить("-F");
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", СтрСоединить(ЧастиПоляФормы, "")));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьДанныеФормыCurlКоманды(ЧастиКоманды, ОтобразитьPOST)
+ Если ТелоЗапросаДанныеФормы.Количество() = 0 Тогда
+ ОтобразитьPOST = Истина;
+ Возврат;
+ КонецЕсли;
+
+ Для Каждого Стр Из ТелоЗапросаДанныеФормы Цикл
+ ЗаполнитьПолеФормыCurlКоманды(ЧастиКоманды, Стр);
+ КонецЦикла;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьДанныеHTMLФормыCurlКоманды(ЧастиКоманды, ОтобразитьPOST)
+ Если ТелоЗапросаДанныеHTMLФормы.Количество() = 0 Тогда
+ ОтобразитьPOST = Истина;
+ Возврат;
+ КонецЕсли;
+
+ ПоляФормы = Новый Массив;
+ Для Каждого Стр Из ТелоЗапросаДанныеHTMLФормы Цикл
+ ЧастиКоманды.Добавить("--data-urlencode");
+ ЧастиКоманды.Добавить(СтрШаблон("'%1=%2'", КодированныйТекстВURL(Стр.Ключ), ЭкранированиеАпострофаUnix(Стр.Значение)));
+ КонецЦикла;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьТекстовыеДанныеCurlКоманды(ЧастиКоманды, ОтобразитьPOST)
+ Если ПустаяСтрока(ТелоЗапросаТекст) Тогда
+ ОтобразитьPOST = Истина;
+ Возврат;
+ КонецЕсли;
+
+ ЧастиКоманды.Добавить("--data-raw");
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", ЭкранированиеАпострофаUnix(ТелоЗапросаТекст)));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьДанныеФайлаCurlКоманды(ЧастиКоманды, ОтобразитьPOST, ПредопределенныеЗаголовки)
+ Если ПустаяСтрока(ТелоЗапросаФайл) Тогда
+ ОтобразитьPOST = Истина;
+ Возврат;
+ КонецЕсли;
+
+ ЧастиКоманды.Добавить("--data-binary");
+ ЧастиКоманды.Добавить(СтрШаблон("@""%1""", ЭкранированиеАпострофаUnix(ТелоЗапросаФайл)));
+
+ ФайлТела = Новый Файл(ТелоЗапросаФайл);
+ ТипMIME = КлиентHTTPСлужебный.ТипMIMEРасширенияФайла(ФайлТела.Расширение);
+
+ ПредопределенныеЗаголовки.Добавить(Новый Структура("Ключ, Значение", "Content-Type", ТипMIME));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьТелоЗапросаCurlКоманды(ЧастиКоманды, ОтобразитьPOST, ПредопределенныеЗаголовки)
+ Если ТипТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора[1].Значение Тогда // multipart/form-data
+ ЗаполнитьДанныеФормыCurlКоманды(ЧастиКоманды, ОтобразитьPOST);
+ ИначеЕсли ТипТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора[2].Значение Тогда // application/x-www-form-urlencoded
+ ЗаполнитьДанныеHTMLФормыCurlКоманды(ЧастиКоманды, ОтобразитьPOST);
+ ИначеЕсли ТипТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора[3].Значение Тогда // Текст
+ ЗаполнитьТекстовыеДанныеCurlКоманды(ЧастиКоманды, ОтобразитьPOST);
+ ИначеЕсли ТипТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора[4].Значение Тогда // Файл
+ ЗаполнитьДанныеФайлаCurlКоманды(ЧастиКоманды, ОтобразитьPOST, ПредопределенныеЗаголовки);
+ Иначе
+ ОтобразитьPOST = Истина;
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьФайлОтветаCurlКоманды(ЧастиКоманды)
+ Если НЕ (ТелоОтветаВФайл И ЗначениеЗаполнено(ИмяФайлаТелаОтвета)) Тогда
+ Возврат;
КонецЕсли;
- Смещение = 0;
- Для Каждого ТекстПоляФормы Из ТекстПолейФормы Цикл
- Построитель.Вставить(
- 1 + Смещение,
- ИнициализацияТекстовойПеременной(ТекстПоляФормы.ИмяПеременной, ТекстПоляФормы.ЗначениеПеременной)
- );
-
- Смещение = Смещение + 1;
- КонецЦикла;
- Если Смещение > 0 Тогда
- Построитель.Вставить(1 + Смещение, "");
- КонецЕсли;
+ ЧастиКоманды.Добавить("-o");
+ ЧастиКоманды.Добавить(СтрШаблон("""%1""", ИмяФайлаТелаОтвета));
КонецПроцедуры
&НаКлиенте
-Процедура ДобавитьВКодЗапросаИнициализациюКонфигурации(Построитель, Знач ЕстьПараметрыЗапроса, Знач ЕстьДополнительныеПараметры, Знач ТребуетсяИмяФайлаТелаОтвета, Знач ЕстьТекстТелаЗапроса, Знач ЕстьПоляФормы)
- Если ЕстьПоляФормы Тогда
- Построитель.Вставить(1, "ПоляФормы = КлиентHTTPКлиентСервер.НовыеПоляФормы();");
+Процедура ЗаполнитьТаймаутCurlКоманды(ЧастиКоманды)
+ Если Таймаут = 0 Тогда
+ Возврат;
КонецЕсли;
- Если ЕстьТекстТелаЗапроса Тогда
- Построитель.Вставить(1, ИнициализацияТекстовойПеременной("ТелоЗапросаТекст", ТелоЗапросаТекст));
+ ЧастиКоманды.Добавить("--connect-timeout");
+ ЧастиКоманды.Добавить(XMLСтрока(Таймаут));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьПроксиCurlКоманды(ЧастиКоманды)
+ Если НЕ (ИспользоватьПрокси И ЗначениеЗаполнено(СерверПрокси)) Тогда
+ Возврат;
КонецЕсли;
- Если ЕстьДополнительныеПараметры Тогда
- Построитель.Вставить(1, "ДополнительныеПараметры = КлиентHTTPКлиентСервер.НовыеДополнительныеПараметры();");
- КонецЕсли;
+ ЧастиПрокси = Новый Массив;
- Если ЕстьПараметрыЗапроса Тогда
- Построитель.Вставить(1, "ПараметрыЗапроса = КлиентHTTPКлиентСервер.НовыеПараметрыЗапроса();");
+ Если ЗначениеЗаполнено(ПользовательПрокси) Тогда
+ ЧастиПрокси.Добавить(ПользовательПрокси);
+ ЧастиПрокси.Добавить(ОтображениеСекрета(ПарольПрокси, Элементы.ПарольПрокси));
+
+ ЧастиКоманды.Добавить(?(ИспользоватьАутентификациюОСПрокси, "--proxy-ntlm", "--proxy-basic"));
+ ЧастиКоманды.Добавить("--proxy-user");
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", СтрЗаменить(СтрСоединить(ЧастиПрокси, ":"), "'", "'\''")));
КонецЕсли;
- Если ТребуетсяИмяФайлаТелаОтвета Тогда
- Построитель.Вставить(1, "ИмяФайлаТелаОтвета = ПолучитьИмяВременногоФайла(""dat"");");
+ ЧастиПрокси.Очистить();
+ ЧастиПрокси.Добавить(ПротоколПрокси);
+ ЧастиПрокси.Добавить("://");
+ ЧастиПрокси.Добавить(СерверПрокси);
+
+ Если ЗначениеЗаполнено(ПортПрокси) Тогда
+ ЧастиПрокси.Добавить(":");
+ ЧастиПрокси.Добавить(ПортПрокси);
КонецЕсли;
- Построитель.Вставить(
- 1 + ТребуетсяИмяФайлаТелаОтвета + ЕстьПараметрыЗапроса + ЕстьДополнительныеПараметры + ЕстьПоляФормы + ЕстьТекстТелаЗапроса,
- ""
- );
+ ЧастиКоманды.Добавить("-x");
+ ЧастиКоманды.Добавить(СтрСоединить(ЧастиПрокси, ""));
КонецПроцедуры
&НаКлиенте
-Функция КодЗапросаКонсоли()
- ЧастиКода = Новый Массив;
- ЧастиСтрокиКода = Новый Массив;
-
- ЕстьДополнительныеПараметры = Ложь;
- ЕстьПараметрыЗапроса = Ложь;
- ЕстьПоляФормы = Ложь;
- ЕстьТекстТелаЗапроса = Ложь;
- ТребуетсяИмяФайлаТелаОтвета = Ложь;
- ТекстПолейФормы = Новый Массив;
- ФайлыПолейФормы = Новый Массив;
+Процедура ЗаполнитьСессиюCurlКоманды(ЧастиКоманды, ЧастиСложнойОпции)
+ Если НЕ ИспользоватьСессию Тогда
+ Возврат;
+ КонецЕсли;
- ДобавитьВКодЗапросаИдентификаторРесурса(ЧастиКода);
+ Если ЗначениеЗаполнено(ПорогПеренаправлений) Тогда
+ ЧастиКоманды.Добавить("--max-redirs");
+ ЧастиКоманды.Добавить(ПорогПеренаправлений);
+ КонецЕсли;
- // Начало текучего интерфейса
- ЧастиКода.Добавить("Ответ = КлиентHTTPКлиентСервер");
+ ЧастиСложнойОпции.Добавить("L");
- ДобавитьВКодЗапросаИспользованиеПрокси(ЧастиКода, ЕстьДополнительныеПараметры);
- ДобавитьВКодЗапросаИспользованиеСессии(ЧастиКода, ЕстьДополнительныеПараметры);
- ДобавитьВКодЗапросаПараметры(ЧастиКода, ЕстьПараметрыЗапроса);
- ДобавитьВКодЗапросаЗаголовки(ЧастиКода, ЕстьДополнительныеПараметры);
- ДобавитьВКодЗапросаСжатиеОтвета(ЧастиКода, ЕстьДополнительныеПараметры);
- ДобавитьВКодЗапросаАвторизацию(ЧастиКода, ЕстьДополнительныеПараметры);
- ДобавитьВКодЗапросаФайлТелаОтвета(ЧастиКода, ЕстьДополнительныеПараметры, ТребуетсяИмяФайлаТелаОтвета);
- ДобавитьВКодЗапросаМетод(ЧастиКода, ЕстьТекстТелаЗапроса, ЕстьПоляФормы, ТекстПолейФормы, ФайлыПолейФормы, ЕстьПараметрыЗапроса, ЕстьДополнительныеПараметры);
- ДобавитьВКодЗапросаИнициализациюПолейФормы(ЧастиКода, ТекстПолейФормы, ФайлыПолейФормы);
- ДобавитьВКодЗапросаИнициализациюКонфигурации(ЧастиКода, ЕстьПараметрыЗапроса, ЕстьДополнительныеПараметры, ТребуетсяИмяФайлаТелаОтвета, ЕстьТекстТелаЗапроса, ЕстьПоляФормы);
+ Если ПоддержкаCookie Тогда
+ ЗначениеCookie = КлиентHTTPКлиентСервер.ЗначениеЗаголовкаCookieРесурса(ИдентификаторРесурса, Дополнительно);
+ Если ЗначениеЗаполнено(ЗначениеCookie) Тогда
+ ЧастиКоманды.Добавить("-b");
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", ЭкранированиеАпострофаUnix(ЗначениеCookie)));
+ КонецЕсли;
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьСжатиеCurlКоманды(ЧастиКоманды)
+ Если ПоддержкаСжатогоОтвета Тогда
+ ЧастиКоманды.Добавить("--compressed");
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьЗаголовкиCurlКоманды(ЧастиКоманды, Знач ПредопределенныеЗаголовки)
+ Для Каждого Стр Из ПредопределенныеЗаголовки Цикл
+ ЧастиКоманды.Добавить("-H");
+ ЧастиКоманды.Добавить(
+ СтрШаблон("'%1: %2'", ЭкранированиеАпострофаUnix(Стр.Ключ), ЭкранированиеАпострофаUnix(Стр.Значение))
+ );
+ КонецЦикла;
- Возврат СтрСоединить(ЧастиКода, Символы.ПС);
-КонецФункции
+ Для Каждого Стр Из ЗаголовкиЗапроса Цикл
+ Если НЕ Стр.Активно Тогда
+ Продолжить;
+ КонецЕсли;
+
+ ЧастиКоманды.Добавить("-H");
+ ЧастиКоманды.Добавить(
+ СтрШаблон("'%1: %2'", ЭкранированиеАпострофаUnix(Стр.Ключ), ЭкранированиеАпострофаUnix(Стр.Значение))
+ );
+ КонецЦикла;
+КонецПроцедуры
&НаКлиенте
-Функция ИнициализацияТекстовойПеременной(Знач ИмяПеременной, Знач ЗначениеПеременной)
- Возврат СтрШаблон(
- "%1 = %2""%3"";",
- ИмяПеременной,
- ?(
- СтрНайти(ЗначениеПеременной, Символы.ПС) > 0,
- "
- | ",
- ""
- ),
- СтрЗаменить(КавычкиВТексте1С(ЗначениеПеременной), Символы.ПС, Символы.ПС + " |")
- );
-КонецФункции
+Процедура ЗаполнитьСхемуЗапросаCurlКоманды(ЧастиКоманды, ЧастиСложнойОпции, Знач ОтобразитьPOST)
+ СхемаСписокВыбора = Элементы.Схема.СписокВыбора;
+ Если Схема = СхемаСписокВыбора[0].Значение И НЕ ОтобразитьPOST Тогда // GET
+ ЧастиКоманды.Добавить(СтрШаблон("-X %1", Схема));
+ ИначеЕсли Схема = СхемаСписокВыбора[1].Значение И ОтобразитьPOST Тогда // POST
+ ЧастиКоманды.Добавить(СтрШаблон("-X %1", Схема));
+ ИначеЕсли Схема = СхемаСписокВыбора[4].Значение Тогда // HEAD
+ ЧастиСложнойОпции.Добавить("I");
+ ИначеЕсли Схема = СхемаСписокВыбора[2].Значение // PUT
+ ИЛИ Схема = СхемаСписокВыбора[3].Значение // DELETE
+ ИЛИ Схема = СхемаСписокВыбора[5].Значение // PATCH
+ Тогда
+ ЧастиКоманды.Добавить(СтрШаблон("-X %1", Схема));
+ КонецЕсли;
+КонецПроцедуры
&НаКлиенте
-Функция КавычкиВТексте1С(Знач Текст)
- Возврат СтрЗаменить(Текст, """", """""");
+Процедура ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, Знач РазделКоманды)
+ Для Каждого Часть Из РазделКоманды Цикл
+ ЧастиКоманды.Добавить(Часть);
+ КонецЦикла;
+КонецПроцедуры
+
+&НаКлиенте
+Функция КомандаCurlЗапросаКонсоли()
+ ЧастиСложнойОпции = Новый Массив;
+ ПредопределенныеЗаголовки = Новый Массив;
+ ОтобразитьPOST = Ложь;
+
+ РазделыКоманды = Новый Структура(
+ "ПовторноеВыполнение, Аутентификация, КлиентскийСертификат, Тело, Таймаут, СохранениеОтветаВФайл, Прокси, Сессия, Сжатие, Заголовки, Схема",
+ );
+ Для Каждого КЗ Из РазделыКоманды Цикл
+ РазделыКоманды[КЗ.Ключ] = Новый Массив;
+ КонецЦикла;
+
+ ЗаполнитьПовторноеВыполнениеCurlКоманды(РазделыКоманды.ПовторноеВыполнение);
+ ЗаполнитьАутентификациюCurlКоманды(РазделыКоманды.Аутентификация);
+ ЗаполнитьКлиентскийСертификатCurlКоманды(РазделыКоманды.КлиентскийСертификат);
+ ЗаполнитьТелоЗапросаCurlКоманды(РазделыКоманды.Тело, ОтобразитьPOST, ПредопределенныеЗаголовки);
+ ЗаполнитьФайлОтветаCurlКоманды(РазделыКоманды.СохранениеОтветаВФайл);
+ ЗаполнитьТаймаутCurlКоманды(РазделыКоманды.Таймаут);
+ ЗаполнитьПроксиCurlКоманды(РазделыКоманды.Прокси);
+ ЗаполнитьСессиюCurlКоманды(РазделыКоманды.Сессия, ЧастиСложнойОпции);
+ ЗаполнитьСжатиеCurlКоманды(РазделыКоманды.Сжатие);
+ ЗаполнитьЗаголовкиCurlКоманды(РазделыКоманды.Заголовки, ПредопределенныеЗаголовки);
+ ЗаполнитьСхемуЗапросаCurlКоманды(РазделыКоманды.Схема, ЧастиСложнойОпции, ОтобразитьPOST);
+
+ ЧастиКоманды = Новый Массив;
+ ЧастиКоманды.Добавить("curl");
+
+ Если ЧастиСложнойОпции.Количество() > 0 Тогда
+ ЧастиСложнойОпции.Вставить(0, "-");
+ ЧастиКоманды.Добавить(СтрСоединить(ЧастиСложнойОпции, ""));
+ КонецЕсли;
+
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Схема);
+
+ ЧастиКоманды.Добавить(КодированныйURIВURL(ИдентификаторРесурса));
+
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Аутентификация);
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.КлиентскийСертификат);
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Заголовки);
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Тело);
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Прокси);
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Таймаут);
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.СохранениеОтветаВФайл);
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Сжатие);
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Сессия);
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.ПовторноеВыполнение);
+
+ Возврат СтрСоединить(ЧастиКоманды, " ");
КонецФункции
+#КонецОбласти
+#Область ИмпортPostman
&НаКлиенте
Асинх Процедура ПрочитатьФайлИмпорта(ИмяФайлаИмпорта)
Отказ = Ложь;
@@ -2335,48 +3569,60 @@
&НаКлиенте
Функция ИдентификаторРесурсаИмпортаPostman(Знач Запрос, Знач ЗначенияШаблонов)
- ИдентификаторРесурсаИмпорт = ЗначениеПеременнойИмпортаPostman(Запрос["url"]["raw"], ЗначенияШаблонов);
+ ИдентификаторРесурсаИмпорт = ?(
+ Запрос["url"] = Неопределено,
+ "",
+ ЗначениеПеременнойИмпортаPostman(Запрос["url"]["raw"], ЗначенияШаблонов)
+ );
Возврат ?(ПустаяСтрока(ИдентификаторРесурсаИмпорт), "http://", ИдентификаторРесурсаИмпорт);
КонецФункции
&НаКлиенте
-Функция АвторизацияИмпортаPostman(Знач Запрос, Знач ЗначенияШаблонов)
- Перем НайденныйТипАвторизации;
+Функция АутентификацияИмпортаPostman(Знач Запрос, Знач ЗначенияШаблонов)
+ Перем НайденныйТипАутентификации;
- фРезультат = Новый Структура("Тип, Пользователь, Пароль, Токен", Элементы.ТипАвторизации.СписокВыбора[0], "", "", "");
+ ТипАутентификацииСписокВыбора = Элементы.ТипАутентификации.СписокВыбора;
- ОбъектАвторизации = Запрос["auth"];
- Если ОбъектАвторизации = Неопределено Тогда
+ фРезультат = Новый Структура(
+ "Тип, Пользователь, Пароль, Токен, РегионAWS, СервисAWS, ДополнениеHawk, ИдентификаторПриложенияHawk, ДелегированиеHawk",
+ ТипАутентификацииСписокВыбора[0], "", "", "", "", "", "", "", ""
+ );
+
+ ОбъектАутентификации = Запрос["auth"];
+ Если ОбъектАутентификации = Неопределено Тогда
Возврат фРезультат;
КонецЕсли;
- ТипАвторизацииИмпорт = ВРег(ОбъектАвторизации["type"]);
- Для Каждого ЭлементТиповАвторизации Из Элементы.ТипАвторизации.СписокВыбора Цикл
- Если ВРег(ЭлементТиповАвторизации.Значение) = ТипАвторизацииИмпорт Тогда
- НайденныйТипАвторизации = ЭлементТиповАвторизации;
+ ТипАутентификацииИмпорт = ВРег(ОбъектАутентификации["type"]);
+ Для Каждого ЭлементТиповАутентификации Из ТипАутентификацииСписокВыбора Цикл
+ Если ВРег(ЭлементТиповАутентификации.Значение) = ТипАутентификацииИмпорт Тогда
+ НайденныйТипАутентификации = ЭлементТиповАутентификации;
Прервать;
КонецЕсли;
КонецЦикла;
+ Если НайденныйТипАутентификации = Неопределено И ТипАутентификацииИмпорт = "AWSV4" Тогда
+ НайденныйТипАутентификации = ТипАутентификацииСписокВыбора[5]; // AWS4-HMAC-SHA256
+ КонецЕсли;
- Если НайденныйТипАвторизации = Неопределено Тогда
+ Если НайденныйТипАутентификации = Неопределено Тогда
Возврат фРезультат;
КонецЕсли;
- фРезультат.Тип = НайденныйТипАвторизации;
+ фРезультат.Тип = НайденныйТипАутентификации;
- Имена = СтрРазделить("Пароль,Пользователь,Токен", ",");
- ИменаИмпорт = СтрРазделить("password,username,token", ",");
- ПараметрыАвторизации = Новый Соответствие;
+ Имена = СтрРазделить("Пароль,Пользователь,Токен,Пользователь,Пароль,РегионAWS,СервисAWS,Пользователь,Пароль,ДополнениеHawk,ИдентификаторПриложенияHawk,ДелегированиеHawk", ",");
+ ИменаИмпорт = СтрРазделить("password,username,token,accesskey,secretkey,region,service,authid,authkey,extradata,app,delegation", ",");
+ ПараметрыАутентификации = Новый Соответствие;
Для я = 0 По Имена.ВГраница() Цикл
- ПараметрыАвторизации.Вставить(ИменаИмпорт[я], Имена[я]);
+ ПараметрыАутентификации.Вставить(ИменаИмпорт[я], Имена[я]);
КонецЦикла;
- ПараметрыАвторизацииИмпорт = ОбъектАвторизации[ОбъектАвторизации["type"]];
- Для Каждого ПараметрАвторизацииИмпорт Из ПараметрыАвторизацииИмпорт Цикл
- ИмяПараметраАвторизации = ПараметрыАвторизации.Получить(НРег(ПараметрАвторизацииИмпорт["key"]));
- Если ИмяПараметраАвторизации <> Неопределено Тогда
- фРезультат[ИмяПараметраАвторизации] = ЗначениеПеременнойИмпортаPostman(ПараметрАвторизацииИмпорт["value"], ЗначенияШаблонов);
+ ПараметрыАутентификацииИмпорт = ОбъектАутентификации[ОбъектАутентификации["type"]];
+ Для Каждого ПараметрАутентификацииИмпорт Из ПараметрыАутентификацииИмпорт Цикл
+ ИмяПараметраАутентификации = ПараметрыАутентификации.Получить(НРег(ПараметрАутентификацииИмпорт["key"]));
+ Если ИмяПараметраАутентификации <> Неопределено Тогда
+ фРезультат[ИмяПараметраАутентификации] = ЗначениеПеременнойИмпортаPostman(ПараметрАутентификацииИмпорт["value"], ЗначенияШаблонов);
КонецЕсли;
КонецЦикла;
@@ -2390,7 +3636,7 @@
Для Каждого ЭлементЗаголовок Из Запрос["header"] Цикл
фРезультат.Добавить(Новый Структура(
"Активно, Ключ, Значение",
- Истина,
+ ЭлементЗаголовок["disabled"] <> Истина,
ЗначениеПеременнойИмпортаPostman(ЭлементЗаголовок["key"], ЗначенияШаблонов),
ЗначениеПеременнойИмпортаPostman(ЭлементЗаголовок["value"], ЗначенияШаблонов)
));
@@ -2474,17 +3720,35 @@
Возврат;
КонецЕсли;
- АвторизацияИмпорт = АвторизацияИмпортаPostman(Запрос, ЗначенияШаблонов);
+ АутентификацияИмпорт = АутентификацияИмпортаPostman(Запрос, ЗначенияШаблонов);
ТелоЗапросаИмпорт = ТелоЗапросаИмпортаPostman(Запрос, ЗначенияШаблонов);
Схема = СхемаИмпорт;
ИдентификаторРесурса = ИдентификаторРесурсаИмпортаPostman(Запрос, ЗначенияШаблонов);
- ТипАвторизации = АвторизацияИмпорт.Тип;
- Если ТипАвторизации <> Элементы.ТипАвторизации.СписокВыбора[0] Тогда
- ПользовательАвторизации = АвторизацияИмпорт.Пользователь;
- ПарольАвторизации = АвторизацияИмпорт.Пароль;
- ТокенАвторизации = АвторизацияИмпорт.Токен;
+ ТипАутентификации = АутентификацияИмпорт.Тип.Значение;
+ Если ТипАутентификации <> Элементы.ТипАутентификации.СписокВыбора[0].Значение Тогда
+ СписокТиповАутентификации = Элементы.ТипАутентификации.СписокВыбора;
+ Если ТипАутентификации = СписокТиповАутентификации[1].Значение // Basic
+ ИЛИ ТипАутентификации = СписокТиповАутентификации[2].Значение // NTLM
+ ИЛИ ТипАутентификации = СписокТиповАутентификации[3].Значение // Digest
+ Тогда
+ ПользовательАутентификации = АутентификацияИмпорт.Пользователь;
+ ПарольАутентификации = АутентификацияИмпорт.Пароль;
+ ИначеЕсли ТипАутентификации = СписокТиповАутентификации[4].Значение Тогда // Bearer
+ ТокенАутентификации = АутентификацияИмпорт.Токен;
+ ИначеЕсли ТипАутентификации = СписокТиповАутентификации[5].Значение Тогда // AWS4-HMAC-SHA256
+ AWSКлючДоступа = АутентификацияИмпорт.Пользователь;
+ AWSСекретныйКлюч = АутентификацияИмпорт.Пароль;
+ AWSРегион = АутентификацияИмпорт.РегионAWS;
+ AWSСервис = АутентификацияИмпорт.СервисAWS;
+ ИначеЕсли ТипАутентификации = СписокТиповАутентификации[6].Значение Тогда // Hawk
+ HawkИдентификатор = АутентификацияИмпорт.Пользователь;
+ HawkКлюч = АутентификацияИмпорт.Пароль;
+ HawkДополнение = АутентификацияИмпорт.ДополнениеHawk;
+ HawkИдентификаторПриложения = АутентификацияИмпорт.ИдентификаторПриложенияHawk;
+ HawkДелегирование = АутентификацияИмпорт.ДелегированиеHawk;
+ КонецЕсли;
КонецЕсли;
ЗаголовкиЗапроса.Очистить();
@@ -2510,7 +3774,7 @@
КонецЕсли;
ИдентификаторРесурсаПриИзменении(Неопределено);
- ТипАвторизацииПриИзменении(Неопределено);
+ ТипАутентификацииПриИзменении(Неопределено);
ТипТелаЗапросаПриИзменении(Неопределено);
РазделыКонсоли = Элементы.РазделыКонсоли.СписокВыбора[0];
@@ -2540,7 +3804,9 @@
Возврат фРезультат;
КонецФункции
+#КонецОбласти
+#Область ИмпортКомандыCurl
&НаКлиенте
Функция ОпцииКомандыCurl()
фРезультат = Новый Соответствие;
@@ -2572,6 +3838,9 @@
фРезультат.Вставить("--ntlm", Ложь);
фРезультат.Вставить("--ntlm-wb", Ложь);
фРезультат.Вставить("--oauth2-bearer", Истина);
+ фРезультат.Вставить("--aws-sigv4", Истина);
+ фРезультат.Вставить("--retry", Истина);
+ фРезультат.Вставить("--retry-delay", Истина);
фРезультат.Вставить("--compressed", Ложь);
фРезультат.Вставить("--compressed-ssh", Ложь);
фРезультат.Вставить("--tr-encoding", Ложь);
@@ -2587,6 +3856,11 @@
фРезультат.Вставить("-x", Истина);
фРезультат.Вставить("--proxy", Истина);
фРезультат.Вставить("--proxy-basic", Ложь);
+ фРезультат.Вставить("--connect-timeout", Истина);
+ фРезультат.Вставить("-E", Истина);
+ фРезультат.Вставить("--cert", Истина);
+ фРезультат.Вставить("--cert-type", Истина);
+ фРезультат.Вставить("--cacert", Истина);
Возврат фРезультат;
КонецФункции
@@ -2609,12 +3883,7 @@
Текст = Лев(Текст, СтрДлина(Текст) - 1);
КонецЕсли;
- Возврат Текст;
-КонецФункции
-
-&НаСервереБезКонтекста
-Функция КодированныйТекстВURL(Знач Текст)
- Возврат КодироватьСтроку(Текст, СпособКодированияСтроки.КодировкаURL);
+ Возврат СтрЗаменить(Текст, СтрШаблон("%1\%1%1", ОткрывающийСимвол), ОткрывающийСимвол);
КонецФункции
&НаКлиенте
@@ -2691,9 +3960,9 @@
Возврат;
КонецЕсли;
- ЧастиКоманды.ИдентификаторРесурса = ТекстБезКавычек(СтрСоединить(ЧастиТокена), ОткрывающийСимвол);
+ ЧастиКоманды.ИдентификаторРесурса = ТекстБезКавычек(СокрЛ(СтрСоединить(ЧастиТокена)), ОткрывающийСимвол);
Иначе
- Опция.Значение = ТекстБезКавычек(СтрСоединить(ЧастиТокена), ОткрывающийСимвол);
+ Опция.Значение = ТекстБезКавычек(СокрЛ(СтрСоединить(ЧастиТокена)), ОткрывающийСимвол);
ЧастиКоманды.Опции.Добавить(Опция);
Опция = Неопределено;
КонецЕсли;
@@ -2747,14 +4016,17 @@
&НаКлиенте
Функция НовыйОбъектДанныхCurl()
Возврат Новый Структура(
- "Схема, ТолькоЗаголовки, Заголовки, ПоляФормы, ПоляHTMLФормы, ПоляКакПараметры, Авторизация, ИспользоватьРедиректы, КоличествоРедиректов, ПоддержкаСжатогоОтвета, ИмяФайлаТелаОтвета, НормализоватьИдентификаторРесурса, Прокси, BasicАвторизацияПрокси",
+ "Схема, ТолькоЗаголовки, Заголовки, ПоляФормы, ПоляHTMLФормы, ПоляКакПараметры, ПовторноеВыполнение, КлиентскийСертификат, Аутентификация, Таймаут, ИспользоватьРедиректы, КоличествоРедиректов, ПоддержкаСжатогоОтвета, ИмяФайлаТелаОтвета, НормализоватьИдентификаторРесурса, Прокси, BasicАутентификацияПрокси",
Неопределено,
Ложь,
Новый Массив,
Новый Массив,
Новый Массив,
Ложь,
- Новый Структура("Тип, Пользователь, Пароль, Токен", Элементы.ТипАвторизации.СписокВыбора[0], "", "", ""),
+ Новый Структура("Применить, Способ, НачальнаяДлительность, КоэфициентУвеличения, ПорогКоличестваПопыток, МаксимальнаяДлительность", Ложь, Элементы.СпособПовторногоВыполнения.СписокВыбора[0], -1, -1, -1, -1),
+ Новый Структура("Сертификат, Пароль, Тип, СертификатыУЦ", "", "", "", ""),
+ Новый Структура("Тип, Пользователь, Пароль, Токен, РегионAWS, СервисAWS", Элементы.ТипАутентификации.СписокВыбора[0], "", "", "", "", ""),
+ 0,
Ложь,
Неопределено,
Ложь,
@@ -2947,19 +4219,71 @@
КонецПроцедуры
&НаКлиенте
-Процедура ОбработатьДанныеАвторизацииCurl(ДанныеИмпорта, Знач Опция)
+Процедура ОбработатьДанныеАутентификацииCurl(ДанныеИмпорта, Знач Опция)
ЗначениеОпции = Опция.Значение;
Если НЕ ЗначениеЗаполнено(ЗначениеОпции) Тогда
Возврат;
КонецЕсли;
- ЧастиПоля = СтрРазделить(ЗначениеОпции, ":");
- Пользователь = ЧастиПоля[0];
+ ЧастиЗначения = СтрРазделить(ЗначениеОпции, ":");
+ Пользователь = ЧастиЗначения[0];
- ЧастиПоля.Удалить(0);
+ ЧастиЗначения.Удалить(0);
+
+ ДанныеИмпорта.Аутентификация.Пользователь = Пользователь;
+ ДанныеИмпорта.Аутентификация.Пароль = СтрСоединить(ЧастиЗначения, ":");
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ОбработатьДанныеАутентификацииAWSCurl(ДанныеИмпорта, Знач Опция)
+ ЗначениеОпции = Опция.Значение;
+ Если НЕ ЗначениеЗаполнено(ЗначениеОпции) Тогда
+ Возврат;
+ КонецЕсли;
+
+ ЧастиЗначения = СтрРазделить(ЗначениеОпции, ":");
+ Если ЧастиЗначения.Количество() < 2 ИЛИ ЧастиЗначения[0] <> "aws" ИЛИ ЧастиЗначения[1] <> "amz" Тогда
+ Возврат;
+ КонецЕсли;
+
+ ДанныеИмпорта.Аутентификация.Тип = Элементы.ТипАутентификации.СписокВыбора[5];
+
+ Если ЧастиЗначения.Количество() > 2 Тогда
+ ДанныеИмпорта.Аутентификация.РегионAWS = ЧастиЗначения[2];
+ КонецЕсли;
+ Если ЧастиЗначения.Количество() > 3 Тогда
+ ДанныеИмпорта.Аутентификация.СервисAWS = ЧастиЗначения[3];
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ОбработатьПовторноеВыполнениеCurl(ДанныеИмпорта, Знач Опция)
+ ОписаниеТипаЧисло = Новый ОписаниеТипов("Число");
+ ПорогКоличестваПопыток = ОписаниеТипаЧисло.ПривестиЗначение(Опция.Значение);
+
+ ПВ = ДанныеИмпорта.ПовторноеВыполнение;
+ ПВ.ПорогКоличестваПопыток = ПорогКоличестваПопыток;
+ ПВ.Применить = ПорогКоличестваПопыток > 0;
+
+ Если ПВ.Способ <> Элементы.СпособПовторногоВыполнения.СписокВыбора[0] Тогда // Разово
+ Возврат;
+ КонецЕсли;
+
+ ПВ.Способ = Элементы.СпособПовторногоВыполнения.СписокВыбора[3]; // Экспоненциально
+ ПВ.НачальнаяДлительность = 1;
+ ПВ.КоэфициентУвеличения = 2;
+ ПВ.МаксимальнаяДлительность = Мин(КлиентHTTPПовтИсп.МаксимальноДопустимаяДлительностьПаузы(), Pow(2, ПорогКоличестваПопыток));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ОбработатьЗадержкуПовторногоВыполненияCurl(ДанныеИмпорта, Знач Опция)
+ ОписаниеТипаЧисло = Новый ОписаниеТипов("Число");
+ НачальнаяДлительность = ОписаниеТипаЧисло.ПривестиЗначение(Опция.Значение);
- ДанныеИмпорта.Авторизация.Пользователь = Пользователь;
- ДанныеИмпорта.Авторизация.Пароль = СтрСоединить(ЧастиПоля, ":");
+ ПВ = ДанныеИмпорта.ПовторноеВыполнение;
+ ПВ.Способ = Элементы.СпособПовторногоВыполнения.СписокВыбора[1]; // Фиксировано
+ ПВ.НачальнаяДлительность = НачальнаяДлительность;
+ ПВ.МаксимальнаяДлительность = Макс(600, НачальнаяДлительность);
КонецПроцедуры
&НаКлиенте
@@ -2985,15 +4309,18 @@
ПозицияРазделителя = ПозицияОкончанияАутентификации;
КонецЕсли;
- ЗакодированныеДанные = Новый Структура("Пользователь, Пароль");
- ЗакодированныеДанные.Пользователь = СокрЛП(Лев(ЗначениеОпции, ПозицияРазделителя - 1));
- ЗакодированныеДанные.Пароль = Прав(
+ ЗакодированныйПользователь = СокрЛП(Лев(ЗначениеОпции, ПозицияРазделителя - 1));
+ ЗакодированныйПароль = Прав(
Лев(ЗначениеОпции, ПозицияОкончанияАутентификации - 1),
ПозицияОкончанияАутентификации - ПозицияРазделителя - 1
);
- РаскодированныеДанные = РаскодированныеСтроки(ЗакодированныеДанные);
- Прокси.Пользователь = РаскодированныеДанные.Пользователь;
- Прокси.Пароль = РаскодированныеДанные.Пароль;
+ МножествоСтрок = Новый Соответствие;
+ МножествоСтрок.Вставить(ЗакодированныйПользователь);
+ МножествоСтрок.Вставить(ЗакодированныйПароль);
+
+ МножествоСтрок = РаскодированныеСтрокиURLвURL(МножествоСтрок);
+ Прокси.Пользователь = МножествоСтрок.Получить(ЗакодированныйПользователь);
+ Прокси.Пароль = МножествоСтрок.Получить(ЗакодированныйПароль);
КонецЕсли;
ПозицияОкончанияАутентификации = ПозицияОкончанияАутентификации + 1;
@@ -3017,6 +4344,22 @@
КонецЕсли;
КонецПроцедуры
+&НаКлиенте
+Процедура ОбработатьКлиентскийСертификат(ДанныеИмпорта, Знач Опция)
+ ЗначениеОпции = Опция.Значение;
+ Если НЕ ЗначениеЗаполнено(ЗначениеОпции) Тогда
+ Возврат;
+ КонецЕсли;
+
+ ЧастиЗначения = СтрРазделить(ЗначениеОпции, ":");
+ Сертификат = ЧастиЗначения[0];
+
+ ЧастиЗначения.Удалить(0);
+
+ ДанныеИмпорта.КлиентскийСертификат.Сертификат = Сертификат;
+ ДанныеИмпорта.КлиентскийСертификат.Пароль = СтрСоединить(ЧастиЗначения, ":");
+КонецПроцедуры
+
&НаКлиенте
Процедура ОбработатьОпциюCurl(ДанныеИмпорта, Знач ИдентификаторРесурсаИмпорт, Знач Опция, Отказ, ОписаниеОшибки)
ИмяОпции = Опция.Имя;
@@ -3037,20 +4380,29 @@
ИначеЕсли ИмяОпции = "-H" ИЛИ ИмяОпции = "--header" Тогда
ОбработатьЗаголовокCurl(ДанныеИмпорта, Опция);
ИначеЕсли ИмяОпции = "-u" ИЛИ ИмяОпции = "--user" Тогда
- ОбработатьДанныеАвторизацииCurl(ДанныеИмпорта, Опция);
+ ОбработатьДанныеАутентификацииCurl(ДанныеИмпорта, Опция);
ИначеЕсли ИмяОпции = "--basic" Тогда
- ДанныеИмпорта.Авторизация.Тип = Элементы.ТипАвторизации.СписокВыбора[1];
+ ДанныеИмпорта.Аутентификация.Тип = Элементы.ТипАутентификации.СписокВыбора[1];
ИначеЕсли ИмяОпции = "--digest" Тогда
- ДанныеИмпорта.Авторизация.Тип = Элементы.ТипАвторизации.СписокВыбора[3];
+ ДанныеИмпорта.Аутентификация.Тип = Элементы.ТипАутентификации.СписокВыбора[3];
ИначеЕсли ИмяОпции = "--ntlm" ИЛИ ИмяОпции = "--ntlm-wb" Тогда
- ДанныеИмпорта.Авторизация.Тип = Элементы.ТипАвторизации.СписокВыбора[2];
+ ДанныеИмпорта.Аутентификация.Тип = Элементы.ТипАутентификации.СписокВыбора[2];
ИначеЕсли ИмяОпции = "--oauth2-bearer" Тогда
- ДанныеИмпорта.Авторизация.Тип = Элементы.ТипАвторизации.СписокВыбора[4];
- ДанныеИмпорта.Авторизация.Токен = Опция.Значение;
+ ДанныеИмпорта.Аутентификация.Тип = Элементы.ТипАутентификации.СписокВыбора[4];
+ ДанныеИмпорта.Аутентификация.Токен = Опция.Значение;
+ ИначеЕсли ИмяОпции = "--aws-sigv4" Тогда
+ ОбработатьДанныеАутентификацииAWSCurl(ДанныеИмпорта, Опция);
+ ИначеЕсли ИмяОпции = "--retry" Тогда
+ ОбработатьПовторноеВыполнениеCurl(ДанныеИмпорта, Опция);
+ ИначеЕсли ИмяОпции = "--retry-delay" Тогда
+ ОбработатьЗадержкуПовторногоВыполненияCurl(ДанныеИмпорта, Опция);
ИначеЕсли ИмяОпции = "-L" ИЛИ ИмяОпции = "--location" ИЛИ ИмяОпции = "--location-trusted" Тогда
ДанныеИмпорта.ИспользоватьРедиректы = Истина;
ИначеЕсли ИмяОпции = "--max-redirs" Тогда
ДанныеИмпорта.КоличествоРедиректов = Опция.Значение;
+ ИначеЕсли ИмяОпции = "--connect-timeout" Тогда
+ ОписаниеТипаЧисло = Новый ОписаниеТипов("Число");
+ ДанныеИмпорта.Таймаут = ОписаниеТипаЧисло.ПривестиЗначение(Опция.Значение);
ИначеЕсли ИмяОпции = "--compressed" ИЛИ ИмяОпции = "--compressed-ssh" ИЛИ ИмяОпции = "--tr-encoding" Тогда
ДанныеИмпорта.ПоддержкаСжатогоОтвета = Истина;
ИначеЕсли ИмяОпции = "-o" ИЛИ ИмяОпции = "--output" Тогда
@@ -3065,7 +4417,13 @@
ИначеЕсли ИмяОпции = "-x" ИЛИ ИмяОпции = "--proxy" Тогда
ОбработатьДанныеПрокси(ДанныеИмпорта, Опция, Отказ, ОписаниеОшибки);
ИначеЕсли ИмяОпции = "--proxy-basic" Тогда
- ДанныеИмпорта.BasicАвторизацияПрокси = Истина;
+ ДанныеИмпорта.BasicАутентификацияПрокси = Истина;
+ ИначеЕсли ИмяОпции = "-E" ИЛИ ИмяОпции = "--cert" Тогда
+ ОбработатьКлиентскийСертификат(ДанныеИмпорта, Опция);
+ ИначеЕсли ИмяОпции = "--cert-type" Тогда
+ ДанныеИмпорта.КлиентскийСертификат.Тип = Опция.Значение;
+ ИначеЕсли ИмяОпции = "--cacert" Тогда
+ ДанныеИмпорта.КлиентскийСертификат.СертификатыУЦ = Опция.Значение;
ИначеЕсли ИмяОпции = "-:" ИЛИ ИмяОпции = "--next" Тогда
Отказ = Истина;
ОписаниеОшибки = "команда с множественными запросами не допускается";
@@ -3229,17 +4587,62 @@
КонецЕсли;
Если ДанныеИмпорта.Схема = Неопределено Тогда
- ДанныеИмпорта.Схема = Элементы.Схема.СписокВыбора[0].Значение; // GET
+ ДанныеИмпорта.Схема = Элементы.Схема.СписокВыбора[0]; // GET
КонецЕсли;
ИдентификаторРесурса = ЧастиКоманды.ИдентификаторРесурса;
Схема = ДанныеИмпорта.Схема;
- ТипАвторизации = ДанныеИмпорта.Авторизация.Тип;
- Если ТипАвторизации <> Элементы.ТипАвторизации.СписокВыбора[0].Значение Тогда
- ПользовательАвторизации = ДанныеИмпорта.Авторизация.Пользователь;
- ПарольАвторизации = ДанныеИмпорта.Авторизация.Пароль;
- ТокенАвторизации = ДанныеИмпорта.Авторизация.Токен;
+ Если ДанныеИмпорта.ПовторноеВыполнение.Применить Тогда
+ ПВ = ДанныеИмпорта.ПовторноеВыполнение;
+ СпособПовторногоВыполнения = ПВ.Способ;
+ ДлительностьПаузыПовторногоВыполнения = ПВ.НачальнаяДлительность;
+ КоэффициентУвеличенияПаузыПовторногоВыполнения = ?(ПВ.КоэфициентУвеличения < 0, КоэффициентУвеличенияПаузыПовторногоВыполнения, ПВ.КоэфициентУвеличения);
+ ПорогКоличестваПопытокПовторногоВыполнения = ПВ.ПорогКоличестваПопыток;
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения = ПВ.МаксимальнаяДлительность;
+
+ КодыСостоянияОтветаПовторногоВыполнения.Очистить();
+ КодыСостоянияОтветаПовторногоВыполнения.Добавить(КлиентHTTPПовтИсп.КодСостоянияТаймаутНаКлиенте());
+ КодыСостоянияОтветаПовторногоВыполнения.Добавить(КлиентHTTPПовтИсп.КодСостоянияСлишкомМногоЗапросов());
+ Иначе
+ СпособПовторногоВыполнения = Элементы.СпособПовторногоВыполнения.СписокВыбора[0];
+ КонецЕсли;
+
+ ТипАутентификации = ДанныеИмпорта.Аутентификация.Тип.Значение;
+ Если ТипАутентификации <> Элементы.ТипАутентификации.СписокВыбора[0].Значение Тогда
+ СписокТиповАутентификации = Элементы.ТипАутентификации.СписокВыбора;
+ Если ТипАутентификации = СписокТиповАутентификации[1].Значение // Basic
+ ИЛИ ТипАутентификации = СписокТиповАутентификации[2].Значение // NTLM
+ ИЛИ ТипАутентификации = СписокТиповАутентификации[3].Значение // Digest
+ Тогда
+ ПользовательАутентификации = ДанныеИмпорта.Аутентификация.Пользователь;
+ ПарольАутентификации = ДанныеИмпорта.Аутентификация.Пароль;
+ ИначеЕсли ТипАутентификации = СписокТиповАутентификации[4].Значение Тогда // Bearer
+ ТокенАутентификации = ДанныеИмпорта.Аутентификация.Токен;
+ ИначеЕсли ТипАутентификации = СписокТиповАутентификации[5].Значение Тогда // AWS4-HMAC-SHA256
+ AWSКлючДоступа = ДанныеИмпорта.Аутентификация.Пользователь;
+ AWSСекретныйКлюч = ДанныеИмпорта.Аутентификация.Пароль;
+ AWSРегион = ДанныеИмпорта.Аутентификация.РегионAWS;
+ AWSСервис = ДанныеИмпорта.Аутентификация.СервисAWS;
+ КонецЕсли;
+ КонецЕсли;
+
+ ДопустимыеТипыСертификата = Новый Соответствие;
+ ДопустимыеТипыСертификата.Вставить("", Истина);
+ ДопустимыеТипыСертификата.Вставить("PEM", Истина);
+ ДопустимыеТипыСертификата.Вставить("P12", Истина);
+ ДопустимыйТипСертификата = ДопустимыеТипыСертификата.Получить(ВРег(ДанныеИмпорта.КлиентскийСертификат.Тип));
+ Если НЕ ПустаяСтрока(ДанныеИмпорта.КлиентскийСертификат.Сертификат) Тогда
+ Если ДопустимыйТипСертификата = Неопределено Тогда
+ ИспользоватьСертификаты = Ложь;
+ СообщитьПользователю(СтрШаблон("Тип сертификата ""%1"" не поддерживается", ДанныеИмпорта.КлиентскийСертификат.Тип));
+ Иначе
+ ИспользоватьСертификаты = Истина;
+ ИмяФайлаКлиентскогоСертификата = ДанныеИмпорта.КлиентскийСертификат.Сертификат;
+ ПарольКлиентскогоСертификата = ДанныеИмпорта.КлиентскийСертификат.Пароль;
+ ИмяФайлаСертификатовУЦ = ДанныеИмпорта.КлиентскийСертификат.СертификатыУЦ;
+ ПарольФайлаСертификатовУЦ = "";
+ КонецЕсли;
КонецЕсли;
ЗаголовкиЗапроса.Очистить();
@@ -3264,6 +4667,8 @@
ТелоЗапросаФайл = ТелоЗапросаИмпорт.Значение;
КонецЕсли;
+ Таймаут = ДанныеИмпорта.Таймаут;
+
ИспользоватьСессию = ДанныеИмпорта.ИспользоватьРедиректы;
Если ДанныеИмпорта.ИспользоватьРедиректы Тогда
ПорогПеренаправлений = ?(
@@ -3287,19 +4692,22 @@
ПортПрокси = ДанныеИмпорта.Прокси.Порт;
ПользовательПрокси = ДанныеИмпорта.Прокси.Пользователь;
ПарольПрокси = ДанныеИмпорта.Прокси.Пароль;
- ИспользоватьАутентификациюОСПрокси = НЕ ДанныеИмпорта.BasicАвторизацияПрокси;
+ ИспользоватьАутентификациюОСПрокси = НЕ ДанныеИмпорта.BasicАутентификацияПрокси;
НеИспользоватьПроксиДляЛокальныхАдресов = Ложь;
КонецЕсли;
ИдентификаторРесурсаПриИзменении(Неопределено);
- ТипАвторизацииПриИзменении(Неопределено);
+ ТипАутентификацииПриИзменении(Неопределено);
ТипТелаЗапросаПриИзменении(Неопределено);
+ СпособПовторногоВыполненияПриИзменении(Неопределено);
+ ИспользоватьСертификатыПриИзменении(Неопределено);
ИспользоватьПроксиПриИзменении(Неопределено);
РазделыКонсоли = Элементы.РазделыКонсоли.СписокВыбора[0];
РазделыКонсолиПриИзменении(Неопределено);
КонецПроцедуры
+#КонецОбласти
&НаКлиенте
Функция ОбработанныйПутьКФайлу(Знач ПутьКФайлу)
@@ -3337,8 +4745,8 @@
КонецФункции
&НаСервереБезКонтекста
-Функция РаскодированныеСтроки(Знач КоллекцияСтрок)
- Возврат КлиентHTTP.РаскодированныеСтроки(КоллекцияСтрок);
+Функция РаскодированныеСтрокиURLвURL(Знач МножествоСтрок)
+ Возврат КлиентHTTP.РаскодированныеСтрокиURLвURL(МножествоСтрок);
КонецФункции
&НаКлиенте
@@ -3379,6 +4787,135 @@
Возврат фРезультат;
КонецФункции
+&НаСервере
+Функция ПолучитьМакет(ИмяМакета)
+ Возврат РеквизитФормыВЗначение("Объект").ПолучитьМакет(ИмяМакета);
+КонецФункции
+
+&НаКлиенте
+Функция ПараметрыОткрытияФормыКодогенерации(Знач Текст)
+ фРезультат = Новый Структура("Текст, ЗаголовокФормы", Текст, "Код 1С");
+
+ Если Дополнительно.MonacoГотов Тогда
+ фРезультат.Вставить("АдресMonaco", Дополнительно.ФайлКода1С);
+ фРезультат.Вставить("ФорматТекста", "bsl");
+ КонецЕсли;
+
+ Возврат фРезультат;
+КонецФункции
+
+&НаКлиенте
+Функция ПараметрыОткрытияФормыКомандыCurl(Знач Текст)
+ Возврат Новый Структура("Текст, ЗаголовокФормы, ЦветРедактируемогоТекста", Текст, "Команда curl", WebЦвета.Серебряный);
+КонецФункции
+
+&НаСервереБезКонтекста
+Функция РазделительПутиСервера()
+ Возврат ПолучитьРазделительПутиСервера();
+КонецФункции
+
+&НаСервереБезКонтекста
+Функция КодированныйТекстВURL(Знач Текст)
+ Возврат КодироватьСтроку(Текст, СпособКодированияСтроки.КодировкаURL);
+КонецФункции
+
+&НаСервереБезКонтекста
+Функция КодированныйURIВURL(Знач URI)
+ Кодировано = КодироватьСтроку(URI, СпособКодированияСтроки.URLВКодировкеURL);
+ Позиция = СтрНайти(Кодировано, "?");
+ Если Позиция = 0 Тогда
+ Позиция = СтрДлина(Кодировано) + 1;
+ КонецЕсли;
+
+ Возврат РаскодироватьСтроку(
+ Лев(Кодировано, Позиция-1),
+ СпособКодированияСтроки.URLВКодировкеURL
+ ) + Сред(
+ Кодировано,
+ Позиция,
+ СтрДлина(Кодировано) - Позиция + 1
+ );
+КонецФункции
+
+#Область ИнициализацияРедактораMonaco
+&НаКлиенте
+Функция КаталогИсходниковMonaco(Знач ИмяКаталога)
+ Возврат СтрШаблон("%1%2%3", ИмяКаталога, "http_client_1c_monaco", ПолучитьРазделительПути());
+КонецФункции
+
+&НаКлиенте
+Асинх Процедура ИнициализироватьMonaco()
+ ИмяКаталога = Ждать КаталогВременныхФайловАсинх();
+ КаталогИсходников = КаталогИсходниковMonaco(ИмяКаталога);
+ Ждать СоздатьКаталогАсинх(КаталогИсходников);
+ ФайлНаДиске = Новый Файл(КаталогИсходников + "index.html");
+ Если НЕ Ждать ФайлНаДиске.СуществуетАсинх() Тогда
+ Ждать ИзвлечьИсходники(КаталогИсходников);
+ Если НЕ Ждать ФайлНаДиске.СуществуетАсинх() Тогда
+ ПредупреждениеАсинх("Не удалось инициализировать monaco editor");
+ Возврат;
+ КонецЕсли;
+ КонецЕсли;
+
+ ФайлКода1С = СтрШаблон("%1%2code.html", КаталогИсходников, Дополнительно.ИдентификаторЭкземпляраКонсоли);
+ ФайлТелаОтвета = СтрШаблон("%1%2response.html", КаталогИсходников, Дополнительно.ИдентификаторЭкземпляраКонсоли);
+ ИсходныйФайл = КаталогИсходников + "index.html";
+ Ждать КопироватьФайлАсинх(ИсходныйФайл, ФайлКода1С);
+ Ждать КопироватьФайлАсинх(ИсходныйФайл, ФайлТелаОтвета);
+ ОтветMonaco = ФайлТелаОтвета;
+ Дополнительно.MonacoГотов = Истина;
+ Дополнительно.Вставить("ФайлКода1С", ФайлКода1С);
+ Дополнительно.Вставить("КаталогMonaco", КаталогИсходников);
+КонецПроцедуры
+
+&НаКлиенте
+Асинх Функция ИзвлечьИсходники(Знач КаталогИсходников, Знач Очищать = Истина)
+#Если НЕ МобильноеПриложениеКлиент И НЕ МобильныйКлиент Тогда
+ Если Очищать Тогда
+ Ждать УдалитьФайлыАсинх(КаталогИсходников, "*.*");
+ КонецЕсли;
+
+ ИмяАрхива = КаталогИсходников + "source.zip";
+ ДанныеМакета = ПолучитьИзВременногоХранилища(Дополнительно.АдресМакетаMonaco);
+ Ждать ДанныеМакета.ЗаписатьАсинх(ИмяАрхива);
+
+ Попытка
+ Архив = Новый ЧтениеZipФайла(ИмяАрхива);
+ Архив.ИзвлечьВсе(КаталогИсходников);
+ Исключение
+ Дополнительно.MonacoГотов = Ложь;
+ КонецПопытки;
+#КонецЕсли
+КонецФункции
+
+&НаКлиенте
+Функция View()
+ Возврат Элементы.ОтветMonaco.Документ.defaultView;
+КонецФункции
+
+&НаКлиенте
+Процедура УстановитьФорматТекста(Знач Формат)
+ ИзвестныеФорматы = Новый Соответствие;
+ Для Каждого Ф Из СтрРазделить("bsl,json,xml,html", ",") Цикл
+ ИзвестныеФорматы.Вставить(Ф, Ф);
+ КонецЦикла;
+ ИзвестныйФормат = ИзвестныеФорматы.Получить(Формат);
+ Если ИзвестныйФормат = Неопределено Тогда
+ ИзвестныйФормат = "text";
+ КонецЕсли;
+
+ View().setLanguageMode(ИзвестныйФормат);
+КонецПроцедуры
+
+&НаКлиенте
+Процедура УстановитьТекстMonaco(Знач Текст)
+ View().setReadOnly(Ложь);
+ View().eraseText();
+ View().setText(Текст, Неопределено, Ложь);
+ View().setReadOnly(Истина);
+КонецПроцедуры
+#КонецОбласти
+
#Область ОБРАТНЫЕ_ВЫЗОВЫ
&НаКлиенте
Процедура КонструкторURIЗавершение(Результат, ДополнительныеПараметры) Экспорт
@@ -3515,8 +5052,6 @@
Если ВыбранныеФайлы <> Неопределено Тогда
ИмяФайлаТелаОтвета = ВыбранныеФайлы[0];
КонецЕсли;
-
- ИмяФайлаТелаОтветаПриИзменении(Неопределено);
КонецПроцедуры
&НаКлиенте
@@ -3533,6 +5068,27 @@
КонецЕсли;
КонецПроцедуры
+&НаКлиенте
+Процедура ВыборФайлаКлиентсткогоСертификатаЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
+ Если ВыбранныеФайлы <> Неопределено Тогда
+ ИмяФайлаКлиентскогоСертификата = ВыбранныеФайлы[0];
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ВыборФайлаСертификатовУЦЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
+ Если ВыбранныеФайлы <> Неопределено Тогда
+ ИмяФайлаСертификатовУЦ = ВыбранныеФайлы[0];
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ОбъединениеСертификатаИКлючаЗавершение(Результат, ДополнительныеПараметры) Экспорт
+ Если Результат <> Неопределено Тогда
+ ИмяФайлаКлиентскогоСертификата = Результат;
+ КонецЕсли;
+КонецПроцедуры
+
&НаКлиенте
Процедура ВыборФайлаЭкспортаИстории(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы = Неопределено Тогда
@@ -3552,7 +5108,7 @@
Возврат;
КонецЕсли;
-#Если НЕ МобильноеПриложениеКлиент Тогда
+#Если НЕ МобильноеПриложениеКлиент Тогда
ТД = Новый ТекстовыйДокумент;
Ждать ТД.ПрочитатьАсинх(ВыбранныеФайлы[0]);
diff --git "a/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260\320\234\320\237/Ext/Form.xml" "b/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260\320\234\320\237/Ext/Form.xml"
index 92b534d..930a32d 100644
--- "a/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260\320\234\320\237/Ext/Form.xml"
+++ "b/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260\320\234\320\237/Ext/Form.xml"
@@ -518,6 +518,32 @@
Bearer
+
+
+ 0
+
+
+
+ ru
+ AWS4-HMAC-SHA256
+
+
+ AWS4-HMAC-SHA256
+
+
+
+
+ 0
+
+
+
+ ru
+ Hawk
+
+
+ Hawk
+
+
@@ -649,6 +675,220 @@
+
+ AWSКлючДоступа
+ false
+
+
+ ru
+ Ключ доступа:
+
+
+
+
+
+
+ false
+
+
+ ru
+ Группа секретный ключ AWS
+
+
+
+
+ ru
+ Группа секретный ключ AWS
+
+
+ AlwaysHorizontal
+ Usual
+ None
+ false
+
+
+
+ AWSСекретныйКлюч
+ true
+ false
+ false
+ false
+ false
+ true
+ false
+
+
+
+
+ UsualButton
+ Picture
+ Form.Command.ПоказатьСекретныйКлючAWS
+
+ StdPicture.DataSearch
+ true
+
+
+
+
+
+
+ AWSРегион
+ false
+ true
+ false
+ true
+ false
+ false
+ false
+
+
+
+
+ AWSСервис
+ false
+
+
+ ru
+ например, s3
+
+
+
+
+
+
+ HawkИдентификатор
+ false
+
+
+ ru
+ Идентификатор
+
+
+ false
+ true
+ false
+
+
+
+
+ HawkДополнение
+ false
+
+
+ ru
+ ext
+
+
+ false
+
+
+ ru
+ нарпимер, some-app-extra-data
+
+
+
+
+
+
+ ru
+ Специфические данные клиента
+
+
+
+
+
+ HawkИдентификаторПриложения
+ false
+
+
+ ru
+ app
+
+
+ false
+
+
+
+
+ ru
+ Идентификатор приложения
+
+
+
+
+
+ HawkДелегирование
+ false
+
+
+ ru
+ dlg
+
+
+ false
+
+
+
+
+ ru
+ Делегированный идентификатор приложения
+
+
+
+
+
+ false
+
+
+ ru
+ Группа ключ hawk
+
+
+
+
+ ru
+ Группа ключ hawk
+
+
+ AlwaysHorizontal
+ Usual
+ None
+ false
+
+
+
+ HawkКлюч
+
+
+ ru
+ Ключ
+
+
+ false
+ true
+ false
+ true
+ false
+ false
+ false
+ false
+ true
+ false
+
+
+
+
+ UsualButton
+ Picture
+ Form.Command.ПоказатьКлючHawk
+
+ StdPicture.DataSearch
+ true
+
+
+
+
+
@@ -1554,6 +1794,7 @@
true
true
true
+ false
@@ -1822,6 +2063,73 @@
ДекорацияКонтекстВыполненияНастройкиНажатие
+
+ ОтображатьСекреты
+ Button
+ Auto
+
+
+
+
+ ru
+ Режим отображения секретов в результате экспорта в команду curl.
+
+Если опция отключена, отображение секретов регулируется индивидуально интерфейсными кнопками для каждого поля с секретом.
+
+
+
+
+
+ АгентПользователя
+
+
+ ru
+ Пользовательское значение заголовка "User-Agent"
+
+
+ Button
+ false
+ false
+ false
+ true
+ false
+ false
+ false
+
+
+ ru
+ значение платформы по умолчанию
+
+
+
+
+
+
+ ru
+ Пользовательское значение заголовка "User-Agent"
+
+
+
+
+
+ Таймаут
+
+
+ ru
+ Таймаут соединения в секундах
+
+
+ Button
+ true
+
+
+ ru
+ ЧН=
+
+
+
+
+
@@ -1905,6 +2213,19 @@
+
+ ПеренаправлениеКакGET
+
+
+ ru
+ Принудительно переключаться на метод GET для кодов перенаправления 301 и 302
+
+
+ Button
+ Auto
+
+
+
ПоддержкаCookie
@@ -1931,70 +2252,545 @@
-
- true
+
ru
- Прокси
+ Повторное выполнение
ru
- Группа прокси
+ Повторять попытки выполнить HTTP-запрос после неуспешного результата.
+
+Неуспешным считается вызов исключения и ответ с кодом состояния 5хх или каким-либо из определённых пользователем.
+ Button
Vertical
Usual
- NormalSeparation
-
+
-
- ИспользоватьПрокси
+
+ СпособПовторногоВыполнения
ru
- Использовать
-
-
-
-
- ru
- Использовать прокси-сервер для выполнения запроса
-
-
- Button
- Auto
-
-
-
- ИспользоватьПроксиПриИзменении
-
-
-
- НеИспользоватьПроксиДляЛокальныхАдресов
- false
-
-
- ru
- Кроме локальных адресов
+ Способ
ru
- Если опция включена, то при запросе ресурсов с локальных адресов прокси не используется
+ Способ расчёта паузы перед повторным выполнением
Button
- Auto
-
-
-
-
- СерверПрокси
- false
+ true
+ false
+ false
+ false
+ false
+ false
+ true
+ false
+
+
+
+ 0
+
+
+
+ ru
+ Разово
+
+
+ Разово
+
+
+
+
+ 0
+
+
+
+ ru
+ Фиксировано
+
+
+ Фиксировано
+
+
+
+
+ 0
+
+
+
+ ru
+ Линейно
+
+
+ Линейно
+
+
+
+
+ 0
+
+
+
+ ru
+ Экспоненциально
+
+
+ Экспоненциально
+
+
+
+
+
+
+ СпособПовторногоВыполненияПриИзменении
+
+
+
+ false
+
+
+ ru
+ Группа параметры повторного выполнения
+
+
+
+
+ ru
+ Группа параметры повторного выполнения
+
+
+ Vertical
+ Usual
+ None
+ false
+
+
+
+ ДлительностьПаузыПовторногоВыполнения
+
+
+ ru
+ Длительность
+
+
+
+
+ ru
+ Длительность в секундах паузы после первой попытки выполнения HTTP-запроса
+
+
+ Button
+
+
+
+
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения
+
+
+ ru
+ в пределе до
+
+
+
+
+ ru
+ Максимальная длительность в секундах паузы между попытками в секундах (ограничение фреймворка 3600)
+
+
+ Button
+
+
+
+
+ КоэффициентУвеличенияПаузыПовторногоВыполнения
+
+
+ ru
+ Коэффициент
+
+
+
+
+ ru
+ Коэффициент увеличения паузы между попытками выполнить HTTP-запрос
+
+
+ Button
+
+
+
+
+ ПорогКоличестваПопытокПовторногоВыполнения
+
+
+ ru
+ Количество попыток
+
+
+
+
+ ru
+ Максимальное количество неуспешных попыток выполнить HTTP-запрос
+
+
+ Button
+ 1
+
+
+
+
+ КодыСостоянияОтветаПовторногоВыполнения
+
+
+ ru
+ Коды состояния ответа
+
+
+
+
+ ru
+ коды состояния ответа, при получении которых необходимо повторять попытки
+
+
+ Button
+ false
+ false
+ false
+ true
+ true
+ false
+ false
+ false
+ 999
+ 100
+ 599
+
+
+
+
+
+
+
+
+
+
+ ru
+ SSL сертификаты
+
+
+
+
+ ru
+ Группа сертификаты
+
+
+ Usual
+
+
+
+ ИспользоватьСертификаты
+
+
+ ru
+ Использовать
+
+
+
+
+ ru
+ Использовать клиентский сертификат OpenSSL для выполнения запроса
+
+
+ Button
+ Auto
+
+
+
+ ИспользоватьСертификатыПриИзменении
+
+
+
+ ИмяФайлаКлиентскогоСертификата
+ false
+
+
+ ru
+ Файл клиентского сертификата
+
+
+ Top
+ Button
+ false
+ true
+ false
+ false
+ true
+ false
+ false
+ false
+ false
+
+
+
+
+ ru
+ Путь к файлу клиентского сертификата OpenSSL. Допустимо применение форматов PEM и PKCS#12.
+
+Если требуется передавать два файла - сертификат и его ключ - можно получить конкатенацию этих файлов и передать получившийся единый файл как сертификат.
+
+
+
+
+ ИмяФайлаКлиентскогоСертификатаНачалоВыбора
+
+
+
+ false
+
+
+ ru
+ Группа пароль клиентского сертификата
+
+
+
+
+ ru
+ Группа пароль клиентского сертификата
+
+
+ AlwaysHorizontal
+ Usual
+ None
+ false
+
+
+
+ ПарольКлиентскогоСертификата
+ Top
+ false
+ false
+ true
+ false
+ true
+
+
+
+
+ UsualButton
+ Picture
+ Form.Command.ПоказатьПарольКлиентскогоСертификата
+
+ StdPicture.DataSearch
+ true
+
+
+
+
+
+
+ ИмяФайлаСертификатовУЦ
+ false
+
+
+ ru
+ Файл сертификатов УЦ
+
+
+ Top
+
+
+ ru
+ Путь к файлу сертификатов удостоверяющих центров OpenSSL, загружаемые из системного хранилища сертификатов операционной системы. Допустимо применение форматов PEM и PKCS#12.
+
+
+ Button
+ false
+ false
+ true
+ false
+ false
+ true
+ false
+ false
+ false
+ false
+
+
+
+ ИмяФайлаСертификатовУЦНачалоВыбора
+
+
+
+ false
+
+
+ ru
+ Группа пароль файла сертификатов УЦ
+
+
+
+
+ ru
+ Группа пароль файла сертификатов УЦ
+
+
+ AlwaysHorizontal
+ Usual
+ None
+ false
+
+
+
+ ПарольФайлаСертификатовУЦ
+ Top
+ false
+ true
+ false
+ true
+
+
+
+
+ UsualButton
+ Picture
+ Form.Command.ПоказатьПарольФайлаСертификатовУЦ
+
+ StdPicture.DataSearch
+ true
+
+
+
+
+
+
+
+
+ true
+
+
+ ru
+ Прокси
+
+
+
+
+ ru
+ Группа прокси
+
+
+ Vertical
+ Usual
+ NormalSeparation
+
+
+
+ ИспользоватьПрокси
+
+
+ ru
+ Использовать
+
+
+
+
+ ru
+ Использовать прокси-сервер для выполнения запроса
+
+
+ Button
+ Auto
+
+
+
+ ИспользоватьПроксиПриИзменении
+
+
+
+ НеИспользоватьПроксиДляЛокальныхАдресов
+ false
+
+
+ ru
+ Кроме локальных адресов
+
+
+
+
+ ru
+ Если опция включена, то при запросе ресурсов с локальных адресов прокси не используется
+
+
+ Button
+ Auto
+
+
+
+
+ ПротоколПрокси
+ false
+
+
+ ru
+ Схема
+
+
+
+
+ ru
+ Протокол прокси
+
+
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+
+ 0
+
+
+
+ ru
+ https
+
+
+ https
+
+
+
+
+ 0
+
+
+
+ ru
+ http
+
+
+ http
+
+
+
+
+
+
+
+ СерверПрокси
+ false
ru
@@ -2112,69 +2908,438 @@
true
-
+
+
+
+ ru
+ Выполнять на сервере
+
+
+
+ xs:boolean
+
+
+
+
+
+ ru
+ Использовать сессию
+
+
+
+ xs:boolean
+
+
+
+
+
+ ru
+ Порог перенаправлений
+
+
+
+ xs:decimal
+
+ 2
+ 0
+ Nonnegative
+
+
+
+
+
+
+ ru
+ Поддержка cookie
+
+
+
+ xs:boolean
+
+
+
+
+
+ ru
+ Дополнительно
+
+
+
+
+
+
+
+ ru
+ Идентификатор ресурса
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ Схема
+
+
+
+ xs:string
+
+ 8
+ Variable
+
+
+
+
+
+
+ ru
+ Параметры запроса
+
+
+
+ v8:ValueTable
+
+
+ ПараметрыЗапроса.Значение
+
+
+
+
+
+ ru
+ Имя
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ Значение
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ Активно
+
+
+
+ xs:boolean
+
+
+
+
+
+
+
+ ru
+ Тип аутентификации
+
+
+
+ xs:string
+
+ 25
+ Variable
+
+
+
+
+
+
+ ru
+ Пароль аутентификации
+
+
+
+ xs:string
+
+ 255
+ Variable
+
+
+
+
+
+
+ ru
+ Пользователь аутентификации
+
+
+
+ xs:string
+
+ 100
+ Variable
+
+
+
+
+
+
+ ru
+ Токен аутентификации
+
+
+
+ xs:string
+
+ 255
+ Variable
+
+
+
+
+
+
+ ru
+ Заголовки запроса
+
+
+
+ v8:ValueTable
+
+
+
+
+
+ ru
+ Активно
+
+
+
+ xs:boolean
+
+
+
+
+
+ ru
+ Ключ
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ Значение
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
ru
- Выполнять на сервере
+ Тип тела запроса
- xs:boolean
+ xs:string
+
+ 100
+ Variable
+
-
+
ru
- Использовать сессию
+ Тело запроса данные формы
- xs:boolean
+ v8:ValueTable
+
+
+
+
+ ru
+ Активно
+
+
+
+ xs:boolean
+
+
+
+
+
+ ru
+ Тип
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ Ключ
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ Значение
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
-
+
ru
- Порог перенаправлений
+ Разделитель
- xs:decimal
-
- 2
- 0
- Nonnegative
-
+ xs:string
+
+ 1000
+ Variable
+
-
+
ru
- Поддержка cookie
+ Тело запроса данные HTMLФормы
- xs:boolean
+ v8:ValueTable
+
+
+
+
+ ru
+ Активно
+
+
+
+ xs:boolean
+
+
+
+
+
+ ru
+ Ключ
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ Значение
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
-
+
ru
- Дополнительно
+ Тело запроса текст
-
+
+ xs:string
+
+ 0
+ Variable
+
+
-
+
ru
- Идентификатор ресурса
+ Тело запроса файл
@@ -2185,40 +3350,70 @@
-
+
ru
- Схема
+ Код состояния
- xs:string
-
- 8
- Variable
-
+ xs:decimal
+
+ 3
+ 0
+ Nonnegative
+
-
+
ru
- Параметры запроса
+ Время выполнения
+
+
+
+ xs:decimal
+
+ 15
+ 2
+ Nonnegative
+
+
+
+
+
+
+ ru
+ Размер ответа
+
+
+
+ xs:decimal
+
+ 15
+ 2
+ Nonnegative
+
+
+
+
+
+
+ ru
+ Заголовки ответа
v8:ValueTable
-
- ПараметрыЗапроса.Значение
-
ru
- Имя
+ Ключ
@@ -2244,222 +3439,189 @@
-
-
-
- ru
- Активно
-
-
-
- xs:boolean
-
-
-
+
+
+
+ ru
+ Ответ HTML
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ Ответ JSON
+
+
+
+ fd:FormattedDocument
+
+
+
ru
- Тип аутентификации
+ Ответ картинка
xs:string
- 25
+ 0
Variable
-
+
ru
- Пароль аутентификации
+ Ответ текст
+
+
+
+ fd:FormattedDocument
+
+
+
+
+
+ ru
+ Пользователь прокси
xs:string
- 255
+ 0
Variable
-
+
ru
- Пользователь аутентификации
+ Пароль прокси
xs:string
- 100
+ 0
Variable
-
+
ru
- Токен аутентификации
+ Порт прокси
+
+
+
+ xs:decimal
+
+ 5
+ 0
+ Nonnegative
+
+
+
+
+
+
+ ru
+ Сервер прокси
xs:string
- 255
+ 0
Variable
-
+
ru
- Заголовки запроса
+ Не использовать прокси для локальных адресов
- v8:ValueTable
+ xs:boolean
-
-
-
-
- ru
- Активно
-
-
-
- xs:boolean
-
-
-
-
-
- ru
- Ключ
-
-
-
- xs:string
-
- 0
- Variable
-
-
-
-
-
-
- ru
- Значение
-
-
-
- xs:string
-
- 0
- Variable
-
-
-
-
-
+
ru
- Тип тела запроса
+ Использовать прокси
+
+
+
+ xs:boolean
+
+
+
+
+
+ ru
+ Использовать аутентификацию ОСПрокси
+
+
+
+ xs:boolean
+
+
+
+
+
+ ru
+ Ответ текст строка
xs:string
- 100
+ 0
Variable
-
+
ru
- Тело запроса данные формы
+ Регион
- v8:ValueTable
+ xs:string
+
+ 100
+ Variable
+
-
-
-
-
- ru
- Активно
-
-
-
- xs:boolean
-
-
-
-
-
- ru
- Тип
-
-
-
- xs:string
-
- 0
- Variable
-
-
-
-
-
-
- ru
- Ключ
-
-
-
- xs:string
-
- 0
- Variable
-
-
-
-
-
-
- ru
- Значение
-
-
-
- xs:string
-
- 0
- Variable
-
-
-
-
-
+
ru
- Разделитель
+ Секретный ключ
@@ -2470,186 +3632,112 @@
-
+
ru
- Тело запроса данные HTMLФормы
+ Сервис
- v8:ValueTable
+ xs:string
+
+ 100
+ Variable
+
-
-
-
-
- ru
- Активно
-
-
-
- xs:boolean
-
-
-
-
-
- ru
- Ключ
-
-
-
- xs:string
-
- 0
- Variable
-
-
-
-
-
-
- ru
- Значение
-
-
-
- xs:string
-
- 0
- Variable
-
-
-
-
-
+
ru
- Тело запроса текст
+ Ключ доступа
xs:string
- 0
+ 1000
Variable
-
+
ru
- Тело запроса файл
+ Протокол прокси
xs:string
- 0
+ 5
Variable
-
+
ru
- Код состояния
+ Идентификатор Hawk
- xs:decimal
-
- 3
- 0
- Nonnegative
-
+ xs:string
+
+ 0
+ Variable
+
-
+
ru
- Время выполнения
+ Ключ Hawk
- xs:decimal
-
- 15
- 2
- Nonnegative
-
+ xs:string
+
+ 0
+ Variable
+
-
+
ru
- Размер ответа
+ Агент пользователя
- xs:decimal
-
- 15
- 2
- Nonnegative
-
+ xs:string
+
+ 0
+ Variable
+
-
+
ru
- Заголовки ответа
+ Перенаправление как GET
- v8:ValueTable
+ xs:boolean
-
-
-
-
- ru
- Ключ
-
-
-
- xs:string
-
- 0
- Variable
-
-
-
-
-
-
- ru
- Значение
-
-
-
- xs:string
-
- 0
- Variable
-
-
-
-
-
+
ru
- Ответ HTML
+ Дополнительные данные Hawk
@@ -2660,22 +3748,26 @@
-
+
ru
- Ответ JSON
+ Идентификатор приложения Hawk
- fd:FormattedDocument
+ xs:string
+
+ 0
+ Variable
+
-
+
ru
- Ответ картинка
+ Делегирование Hawk
@@ -2686,116 +3778,186 @@
-
+
ru
- Ответ текст
+ Способ повторного выполнения
- fd:FormattedDocument
+ xs:string
+
+ 100
+ Variable
+
-
+
ru
- Пользователь прокси
+ Длительность паузы повторного выполнения
- xs:string
-
- 0
- Variable
-
+ xs:decimal
+
+ 4
+ 0
+ Nonnegative
+
-
+
ru
- Пароль прокси
+ Максимальная длительность паузы повторного выполнения
- xs:string
-
- 0
- Variable
-
+ xs:decimal
+
+ 4
+ 0
+ Nonnegative
+
-
+
ru
- Порт прокси
+ Коэффициент увеличения паузы повторного выполнения
xs:decimal
- 5
+ 4
0
Nonnegative
-
+
ru
- Сервер прокси
+ Порог количества попыток повторного выполнения
- xs:string
-
- 0
- Variable
-
+ xs:decimal
+
+ 2
+ 0
+ Nonnegative
+
-
+
ru
- Не использовать прокси для локальных адресов
+ Коды состояния ответа повторного выполнения
- xs:boolean
+ v8:ValueListType
+
+ КодыСостоянияОтветаПовторногоВыполнения.Picture
+ КодыСостоянияОтветаПовторногоВыполнения.ValueType
+
+
+ xs:decimal
+
+ 10
+ 0
+ Any
+
+
-
+
ru
- Использовать прокси
+ Таймаут
- xs:boolean
+ xs:decimal
+
+ 3
+ 0
+ Nonnegative
+
-
+
ru
- Использовать аутентификацию ОСПрокси
+ Использовать сертификаты
xs:boolean
-
+
ru
- Ответ текст строка
+ Имя файла клиентского сертификата
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+ ShowError
+
+
+
+
+ ru
+ Имя файла сертификатов УЦ
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ Пароль клиентского сертификата
+
+
+
+ xs:string
+
+ 0
+ Variable
+
+
+
+
+
+
+ ru
+ Пароль файла сертификатов УЦ
@@ -2806,6 +3968,17 @@
+
+
+
+ ru
+ Отображать секреты
+
+
+
+ xs:boolean
+
+
@@ -3055,5 +4228,65 @@
+
+
+
+ ru
+ Показать секретный ключ
+
+
+
+
+ ru
+ Показать секретный ключ
+
+
+ ПоказатьСекретныйКлючAWS
+
+
+
+
+ ru
+ Показать ключ
+
+
+
+
+ ru
+ Показать ключ hawk
+
+
+ ПоказатьКлючHawk
+
+
+
+
+ ru
+ Показать пароль клиентского сертификата
+
+
+
+
+ ru
+ Показать пароль клиентского сертификата
+
+
+ ПоказатьПарольКлиентскогоСертификата
+
+
+
+
+ ru
+ Показать пароль файла сертификатов УЦ
+
+
+
+
+ ru
+ Показать пароль файла сертификатов УЦ
+
+
+ ПоказатьПарольФайлаСертификатовУЦ
+
\ No newline at end of file
diff --git "a/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260\320\234\320\237/Ext/Form/Module.bsl" "b/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260\320\234\320\237/Ext/Form/Module.bsl"
index 5502a23..9d9a764 100644
--- "a/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260\320\234\320\237/Ext/Form/Module.bsl"
+++ "b/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260\320\234\320\237/Ext/Form/Module.bsl"
@@ -17,13 +17,22 @@
Элементы.ОткрытьКонсоль.Картинка = БиблиотекаКартинок.Избранное;
#КонецЕсли
+ Для Каждого КЗ Из КлиентHTTPПовтИсп.РегионыAWS() Цикл
+ Элементы.РегионAWS.СписокВыбора.Добавить(КЗ.Значение);
+ КонецЦикла;
+
ИспользоватьСессию = Ложь;
ПоддержкаCookie = Ложь;
ПорогПеренаправлений = 10;
+ ПорогКоличестваПопытокПовторногоВыполнения = 9;
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения = 600;
- Схема = Элементы.Схема.СписокВыбора[0];
- ТипАутентификации = Элементы.ТипАутентификации.СписокВыбора[0];
+ Схема = Элементы.Схема.СписокВыбора[0].Значение;
+ ТипАутентификации = Элементы.ТипАутентификации.СписокВыбора[0].Значение;
+ AWSРегион = Элементы.РегионAWS.СписокВыбора[0].Значение;
ТипТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора[0].Значение;
+ СпособПовторногоВыполнения = Элементы.СпособПовторногоВыполнения.СписокВыбора[0].Значение;
+ ПротоколПрокси = Элементы.ПротоколПрокси.СписокВыбора[0].Значение;
ИдентификаторРесурса = "https://ya.ru";
Дополнительно = Новый Структура("Сессия", Новый Структура("Печенье", Новый Соответствие));
@@ -47,7 +56,7 @@
ОткрытьФорму(
"Обработка.КонсольКлиентаHTTP.Форма.РедакторТекстовогоПоля",
- Новый Структура("ЗаголовокФормы", "Команда curl"),
+ ПараметрыОткрытияФормыКомандыCurl(КомандаCurlЗапросаКонсоли()),
ЭтотОбъект, , , ,
Оповещение,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца
@@ -87,25 +96,46 @@
&НаКлиенте
Процедура ТипАутентификацииПриИзменении(Элемент)
+ ТипАутентификацииСписокВыбора = Элементы.ТипАутентификации.СписокВыбора;
ОтображатьПользовательПароль = (
- ТипАутентификации = Элементы.ТипАутентификации.СписокВыбора[1].Значение
- ИЛИ ТипАутентификации = Элементы.ТипАутентификации.СписокВыбора[2].Значение
- ИЛИ ТипАутентификации = Элементы.ТипАутентификации.СписокВыбора[3].Значение
+ ТипАутентификации = ТипАутентификацииСписокВыбора[1].Значение
+ ИЛИ ТипАутентификации = ТипАутентификацииСписокВыбора[2].Значение
+ ИЛИ ТипАутентификации = ТипАутентификацииСписокВыбора[3].Значение
);
- ОтображатьТокен = (ТипАутентификации = Элементы.ТипАутентификации.СписокВыбора[4].Значение);
+ ОтображатьТокен = (ТипАутентификации = ТипАутентификацииСписокВыбора[4].Значение);
+ ОтображатьAWS4 = (ТипАутентификации = ТипАутентификацииСписокВыбора[5].Значение);
+ ОтображатьHawk = (ТипАутентификации = ТипАутентификацииСписокВыбора[6].Значение);
Элементы.ПоказатьПарольАутентификации.Пометка = Истина;
- ИзменитьРежимОтображенияПароля(Элементы.ПоказатьПарольАутентификации, Элементы.ПарольАутентификации);
+ ПоказатьПарольАутентификации(Неопределено);
Элементы.ПользовательАутентификации.Видимость = ОтображатьПользовательПароль;
Элементы.ГруппаПарольАутентификации.Видимость = ОтображатьПользовательПароль;
Элементы.ПоказатьТокенАутентификации.Пометка = Истина;
- ИзменитьРежимОтображенияПароля(Элементы.ПоказатьТокенАутентификации, Элементы.ТокенАутентификации);
+ ПоказатьТокенАутентификации(Неопределено);
Элементы.ГруппаТокенАутентификации.Видимость = ОтображатьТокен;
+
+ Элементы.ПоказатьСекретныйКлючAWS.Пометка = Истина;
+
+ ПоказатьСекретныйКлючAWS(Неопределено);
+
+ Элементы.КлючДоступаAWS.Видимость = ОтображатьAWS4;
+ Элементы.ГруппаСекретныйКлючAWS.Видимость = ОтображатьAWS4;
+ Элементы.РегионAWS.Видимость = ОтображатьAWS4;
+ Элементы.СервисAWS.Видимость = ОтображатьAWS4;
+
+ Элементы.ПоказатьКлючHawk.Пометка = Истина;
+
+ ПоказатьКлючHawk(Неопределено);
+
+ Элементы.ИдентификаторHawk.Видимость = ОтображатьHawk;
+ Элементы.ГруппаКлючHawk.Видимость = ОтображатьHawk;
+
+ Элементы.ГруппаАутентификация.Заголовок = ЗаголовокГруппыСВыбраннымЭлементом("Аутентификация", ТипАутентификации <> ТипАутентификацииСписокВыбора[0].Значение);
КонецПроцедуры
&НаКлиенте
@@ -161,20 +191,38 @@
ИзменитьРежимОтображенияПароля(Элементы.ПоказатьТокенАутентификации, Элементы.ТокенАутентификации);
КонецПроцедуры
+&НаКлиенте
+Процедура ПоказатьСекретныйКлючAWS(Команда)
+ ИзменитьРежимОтображенияПароля(Элементы.ПоказатьСекретныйКлючAWS, Элементы.СекретныйКлючAWS);
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПоказатьКлючHawk(Команда)
+ ИзменитьРежимОтображенияПароля(Элементы.ПоказатьКлючHawk, Элементы.КлючHawk);
+КонецПроцедуры
+
&НаКлиенте
Асинх Процедура ВыполнитьЗапрос(Команда)
- ПЗ = МножествоПараметровЗапроса();
- ДП = ДополнительныеПараметрыЗапроса();
-
- ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
- Результат = Ждать РезультатВыполненногоЗапроса(ПЗ, ДП);
+ Если ИспользоватьПрокси И ПустаяСтрока(СерверПрокси) Тогда
+ Элементы.Основная.ТекущаяСтраница = Элементы.СтраницаНастройки;
+
+ СообщитьПользователю("Необходимо указать имя прокси-сервера", "СерверПрокси");
+ Возврат;
+ КонецЕсли;
+ Если ИспользоватьСертификаты И ПустаяСтрока(ИмяФайлаКлиентскогоСертификата) Тогда
+ Элементы.Основная.ТекущаяСтраница = Элементы.СтраницаНастройки;
+
+ СообщитьПользователю("Укажите путь к файлу клиентского сертификата", "ИмяФайлаКлиентскогоСертификата");
+ Возврат;
+ КонецЕсли;
- ЗафиксироватьВремяВыполненияЗапроса(ВремяНачала);
- ОбработатьОтвет(Результат.Ответ);
+ Ответ = ?(
+ ВыполнятьНаСервере,
+ ВыполнитьЗапросНаСервере(),
+ Ждать ВыполнитьЗапросНаКлиенте()
+ );
- Если ИспользоватьСессию И ПоддержкаCookie Тогда
- КлиентHTTPКлиентСервер.СкопироватьПеченье(Дополнительно, Результат.ДополнительныеПараметры);
- КонецЕсли;
+ ОбработатьОтвет(Ответ);
Элементы.ГруппаРазделы.ТекущаяСтраница = Элементы.РазделОтвет;
КонецПроцедуры
@@ -331,6 +379,8 @@
ИначеЕсли ТипТелаЗапроса = ТипТелаЗапросаСписокВыбора[4].Значение Тогда // binary
Элементы.ГруппаТипыТелаЗапроса.ТекущаяСтраница = Элементы.ТипыТелаЗапросаДвоичныеДанные;
КонецЕсли;
+
+ Элементы.ГруппаТелоЗапроса.Заголовок = ЗаголовокГруппыСВыбраннымЭлементом("Тело", ТипТелаЗапроса <> ТипТелаЗапросаСписокВыбора[0].Значение);
КонецПроцедуры
&НаКлиенте
@@ -542,8 +592,80 @@
Элементы.ОткрытьCookies.Доступность = (ИспользоватьСессию И ПоддержкаCookie);
КонецПроцедуры
+&НаКлиенте
+Процедура СпособПовторногоВыполненияПриИзменении(Элемент)
+ СпособыПовторногоВыполнения = Элементы.СпособПовторногоВыполнения.СписокВыбора;
+
+ Элементы.ГруппаПараметрыПовторногоВыполнения.Доступность = СпособПовторногоВыполнения <> СпособыПовторногоВыполнения[0].Значение; // Разово
+ Элементы.КоэффициентУвеличенияПаузыПовторногоВыполнения.Видимость = СпособПовторногоВыполнения <> СпособыПовторногоВыполнения[1].Значение; // Фиксировано
+
+ Если СпособПовторногоВыполнения = СпособыПовторногоВыполнения[2].Значение Тогда // Линейно
+ ДлительностьПаузыПовторногоВыполнения = ?(ДлительностьПаузыПовторногоВыполнения < 1, 1, ДлительностьПаузыПовторногоВыполнения);
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения = ?(МаксимальнаяДлительностьПаузыПовторногоВыполнения < 1, 1, МаксимальнаяДлительностьПаузыПовторногоВыполнения);
+
+ Элементы.ДлительностьПаузыПовторногоВыполнения.МинимальноеЗначение = 1;
+ Элементы.МаксимальнаяДлительностьПаузыПовторногоВыполнения.МинимальноеЗначение = 1;
+ Элементы.КоэффициентУвеличенияПаузыПовторногоВыполнения.МинимальноеЗначение = 0;
+ ИначеЕсли СпособПовторногоВыполнения = СпособыПовторногоВыполнения[3].Значение Тогда // Экспоненциально
+ ДлительностьПаузыПовторногоВыполнения = ?(ДлительностьПаузыПовторногоВыполнения < 1, 1, ДлительностьПаузыПовторногоВыполнения);
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения = ?(МаксимальнаяДлительностьПаузыПовторногоВыполнения < 1, 1, МаксимальнаяДлительностьПаузыПовторногоВыполнения);
+ КоэффициентУвеличенияПаузыПовторногоВыполнения = ?(КоэффициентУвеличенияПаузыПовторногоВыполнения < 1, 1, КоэффициентУвеличенияПаузыПовторногоВыполнения);
+
+ Элементы.ДлительностьПаузыПовторногоВыполнения.МинимальноеЗначение = 1;
+ Элементы.МаксимальнаяДлительностьПаузыПовторногоВыполнения.МинимальноеЗначение = 1;
+ Элементы.КоэффициентУвеличенияПаузыПовторногоВыполнения.МинимальноеЗначение = 1;
+ Иначе
+ Элементы.ДлительностьПаузыПовторногоВыполнения.МинимальноеЗначение = 0;
+ Элементы.МаксимальнаяДлительностьПаузыПовторногоВыполнения.МинимальноеЗначение = 0;
+ Элементы.КоэффициентУвеличенияПаузыПовторногоВыполнения.МинимальноеЗначение = 0;
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ИспользоватьСертификатыПриИзменении(Элемент)
+ Элементы.ИмяФайлаКлиентскогоСертификата.Доступность = ИспользоватьСертификаты;
+ Элементы.ГруппаПарольКлиентскогоСертификата.Доступность = ИспользоватьСертификаты;
+ Элементы.ИмяФайлаСертификатовУЦ.Доступность = ИспользоватьСертификаты;
+ Элементы.ГруппаПарольФайлаСертификатовУЦ.Доступность = ИспользоватьСертификаты;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ИмяФайлаКлиентскогоСертификатаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
+ Если ВыполнятьНаСервере Тогда
+ Возврат;
+ КонецЕсли;
+
+ СтандартнаяОбработка = Ложь;
+ Оповещение = Новый ОписаниеОповещения("ВыборФайлаКлиентсткогоСертификатаЗавершение", ЭтотОбъект);
+
+ ПоказатьДиалогВыбораФайла(Оповещение, "Выбор файла сертификата", "PEM (*.crt)|*.crt|PEM (*.pem)|*.pem|PEM (*.cer)|*.cer|PKCS#12 (*.p12)|*.p12|PKCS#12 (*.pfx)|*.pfx|Все файлы|*.*");
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПоказатьПарольКлиентскогоСертификата(Команда)
+ ИзменитьРежимОтображенияПароля(Элементы.ПоказатьПарольКлиентскогоСертификата, Элементы.ПарольКлиентскогоСертификата);
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ИмяФайлаСертификатовУЦНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
+ Если ВыполнятьНаСервере Тогда
+ Возврат;
+ КонецЕсли;
+
+ СтандартнаяОбработка = Ложь;
+ Оповещение = Новый ОписаниеОповещения("ВыборФайлаСертификатовУЦЗавершение", ЭтотОбъект);
+
+ ПоказатьДиалогВыбораФайла(Оповещение, "Выбор файла сертификата", "PEM (*.crt)|*.crt|PEM (*.pem)|*.pem|PEM (*.cer)|*.cer|PKCS#12 (*.p12)|*.p12|PKCS#12 (*.pfx)|*.pfx|Все файлы|*.*");
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПоказатьПарольФайлаСертификатовУЦ(Команда)
+ ИзменитьРежимОтображенияПароля(Элементы.ПоказатьПарольФайлаСертификатовУЦ, Элементы.ПарольФайлаСертификатовУЦ);
+КонецПроцедуры
+
&НаКлиенте
Процедура ИспользоватьПроксиПриИзменении(Элемент)
+ Элементы.ПротоколПрокси.Доступность = ИспользоватьПрокси;
Элементы.СерверПрокси.Доступность = ИспользоватьПрокси;
Элементы.ПортПрокси.Доступность = ИспользоватьПрокси;
Элементы.ПользовательПрокси.Доступность = ИспользоватьПрокси;
@@ -556,20 +678,37 @@
#Область СлужебныеПроцедурыИФункции
&НаКлиенте
-Асинх Функция РезультатВыполненногоЗапроса(ПараметрыЗапроса, ДополнительныеПараметры)
- фРезультат = Новый Структура("Ответ, ДополнительныеПараметры");
+Асинх Функция ВыполнитьЗапросНаКлиенте()
+ ПЗ = МножествоПараметровЗапросаНаКлиенте();
+ ДП = ДополнительныеПараметрыЗапросаНаКлиенте();
+
+ Возврат Ждать РезультатВыполненногоЗапросаНаКлиенте(ПЗ, ДП);
+КонецФункции
+
+&НаСервере
+Функция ВыполнитьЗапросНаСервере()
+ ПЗ = МножествоПараметровЗапросаНаСервере();
+ ДП = ДополнительныеПараметрыЗапросаНаСервере();
+
+ Возврат РезультатВыполненногоЗапросаНаСервере(ПЗ, ДП);
+КонецФункции
+
+&НаКлиенте
+Асинх Функция РезультатВыполненногоЗапросаНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
+ Перем фРезультат;
+ ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
Схемы = Элементы.Схема.СписокВыбора;
Если Схема = Схемы[0].Значение Тогда // GET
- фРезультат.Ответ = ?(
- ВыполнятьНаСервере,
- ПолучитьНаСервере(ИдентификаторРесурса, ПараметрыЗапроса, ДополнительныеПараметры),
- Ждать ПолучитьНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
+ фРезультат = Ждать КлиентHTTPКлиентСервер.Получить(
+ ИдентификаторРесурса,
+ ПараметрыЗапроса,
+ ДополнительныеПараметры
);
ИначеЕсли Схема = Схемы[1].Значение Тогда // POST
- фРезультат.Ответ = Ждать ОтветВыполненногоЗапросаPOST(ПараметрыЗапроса, ДополнительныеПараметры);
+ фРезультат = Ждать ОтветВыполненногоЗапросаPOSTНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры);
ИначеЕсли Схема = Схемы[2].Значение Тогда // PUT
- фРезультат.Ответ = Ждать ОтветВыполненногоЗапросаPUT(ПараметрыЗапроса, ДополнительныеПараметры);
+ фРезультат = Ждать ОтветВыполненногоЗапросаPUTНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры);
ИначеЕсли Схема = Схемы[3].Значение Тогда // DELETE
ТипыТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора;
ТелоЗапроса = ?(
@@ -577,128 +716,273 @@
ТелоЗапросаТекст,
""
);
- фРезультат.Ответ = ?(
- ВыполнятьНаСервере,
- УдалитьНаСервере(ИдентификаторРесурса, ТелоЗапроса, ПараметрыЗапроса, ДополнительныеПараметры),
- Ждать УдалитьНаКлиенте(ТелоЗапроса, ПараметрыЗапроса, ДополнительныеПараметры)
+ фРезультат = Ждать КлиентHTTPКлиентСервер.Удалить(
+ ИдентификаторРесурса,
+ ТелоЗапроса,
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
ИначеЕсли Схема = Схемы[4].Значение Тогда // HEAD
- фРезультат.Ответ = ?(
- ВыполнятьНаСервере,
- ПолучитьЗаголовкиНаСервере(ИдентификаторРесурса, ПараметрыЗапроса, ДополнительныеПараметры),
- Ждать ПолучитьЗаголовкиНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
+ фРезультат = Ждать КлиентHTTPКлиентСервер.ПолучитьЗаголовки(
+ ИдентификаторРесурса,
+ ПараметрыЗапроса,
+ ДополнительныеПараметры
);
ИначеЕсли Схема = Схемы[5].Значение Тогда // PATCH
- фРезультат.Ответ = Ждать ОтветВыполненногоЗапросаPATCH(ПараметрыЗапроса, ДополнительныеПараметры);
+ фРезультат = Ждать ОтветВыполненногоЗапросаPATCHНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры);
Иначе
ВызватьИсключение "Неизвестная схема запроса";
КонецЕсли;
- фРезультат.ДополнительныеПараметры = ДополнительныеПараметры;
+ ВремяВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах() - ВремяНачала;
+
+ Если ИспользоватьСессию И ПоддержкаCookie Тогда
+ КлиентHTTPКлиентСервер.СкопироватьПеченье(Дополнительно, ДополнительныеПараметры);
+ КонецЕсли;
Возврат фРезультат;
КонецФункции
-&НаКлиенте
-Асинх Функция ОтветВыполненногоЗапросаPOST(ПараметрыЗапроса, ДополнительныеПараметры)
+&НаСервере
+Функция РезультатВыполненногоЗапросаНаСервере(ПараметрыЗапроса, ДополнительныеПараметры)
Перем фРезультат;
+ ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
+ Схемы = Элементы.Схема.СписокВыбора;
+ Если Схема = Схемы[0].Значение Тогда // GET
+ фРезультат = КлиентHTTPКлиентСервер.Получить(
+ ИдентификаторРесурса,
+ ПараметрыЗапроса,
+ ДополнительныеПараметры
+ );
+ ИначеЕсли Схема = Схемы[1].Значение Тогда // POST
+ фРезультат = ОтветВыполненногоЗапросаPOSTНаСервере(ПараметрыЗапроса, ДополнительныеПараметры);
+ ИначеЕсли Схема = Схемы[2].Значение Тогда // PUT
+ фРезультат = ОтветВыполненногоЗапросаPUTНаСервере(ПараметрыЗапроса, ДополнительныеПараметры);
+ ИначеЕсли Схема = Схемы[3].Значение Тогда // DELETE
+ ТипыТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора;
+ ТелоЗапроса = ?(
+ ТипТелаЗапроса = ТипыТелаЗапроса[3].Значение, // raw
+ ТелоЗапросаТекст,
+ ""
+ );
+ фРезультат = КлиентHTTPКлиентСервер.Удалить(
+ ИдентификаторРесурса,
+ ТелоЗапроса,
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
+ );
+ ИначеЕсли Схема = Схемы[4].Значение Тогда // HEAD
+ фРезультат = КлиентHTTPКлиентСервер.ПолучитьЗаголовки(
+ ИдентификаторРесурса,
+ ПараметрыЗапроса,
+ ДополнительныеПараметры
+ );
+ ИначеЕсли Схема = Схемы[5].Значение Тогда // PATCH
+ фРезультат = ОтветВыполненногоЗапросаPATCHНаСервере(ПараметрыЗапроса, ДополнительныеПараметры);
+ Иначе
+ ВызватьИсключение "Неизвестная схема запроса";
+ КонецЕсли;
+
+ ВремяВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах() - ВремяНачала;
+
+ Если ИспользоватьСессию И ПоддержкаCookie Тогда
+ КлиентHTTPКлиентСервер.СкопироватьПеченье(Дополнительно, ДополнительныеПараметры);
+ КонецЕсли;
+
+ Возврат фРезультат;
+КонецФункции
+
+&НаКлиенте
+Асинх Функция ОтветВыполненногоЗапросаPOSTНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
ТипыТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора;
Если ТипТелаЗапроса = ТипыТелаЗапроса[0].Значение Тогда // none
- фРезультат = ?(
- ВыполнятьНаСервере,
- ОтправитьТекстНаСервере(ИдентификаторРесурса, "", ПараметрыЗапроса, ДополнительныеПараметры),
- Ждать ОтправитьТекстНаКлиенте("", ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат Ждать КлиентHTTPКлиентСервер.ОтправитьТекст(
+ ИдентификаторРесурса,
+ "",
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[1].Значение Тогда // form-data
- фРезультат = ?(
- ВыполнятьНаСервере,
- ОтправитьДанныеФормыНаСервере(ПараметрыЗапроса, ДополнительныеПараметры),
- Ждать ОтправитьДанныеФормыНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат Ждать КлиентHTTPКлиентСервер.ОтправитьДанныеФормы(
+ ИдентификаторРесурса,
+ Ждать ДанныеФормыТелаЗапросаНаКлиенте(),
+ ПараметрыОтправкиДанныхФормыНаКлиенте(ДополнительныеПараметры),
+ ПараметрыЗапроса
);
ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[2].Значение Тогда // x-www-form-urlencoded
- фРезультат = ?(
- ВыполнятьНаСервере,
- ОтправитьДанныеHTMLФормыНаСервере(ИдентификаторРесурса, ДанныеHTMLФормыТелаЗапроса(), ПараметрыЗапроса, ДополнительныеПараметры),
- Ждать ОтправитьДанныеHTMLФормыНаКлиенте(ДанныеHTMLФормыТелаЗапроса(), ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат Ждать КлиентHTTPКлиентСервер.ОтправитьДанныеHTMLФормы(
+ ИдентификаторРесурса,
+ ДанныеHTMLФормыТелаЗапросаНаКлиенте(),
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[3].Значение Тогда // raw
- фРезультат = ?(
- ВыполнятьНаСервере,
- ОтправитьТекстНаСервере(ИдентификаторРесурса, ТелоЗапросаТекст, ПараметрыЗапроса, ДополнительныеПараметры),
- Ждать ОтправитьТекстНаКлиенте(ТелоЗапросаТекст, ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат Ждать КлиентHTTPКлиентСервер.ОтправитьТекст(
+ ИдентификаторРесурса,
+ ТелоЗапросаТекст,
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[4].Значение Тогда // binary
- фРезультат = ?(
- ВыполнятьНаСервере,
- ОтправитьФайлНаСервере(ИдентификаторРесурса, ТелоЗапросаФайл, ПараметрыЗапроса, ДополнительныеПараметры),
- Ждать ОтправитьФайлНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат Ждать КлиентHTTPКлиентСервер.ОтправитьФайл(
+ ИдентификаторРесурса,
+ Новый Файл(ТелоЗапросаФайл),
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
+ );
+ Иначе
+ ВызватьИсключение СтрШаблон("Тип тела запроса %1 не поддерживается для %2", ТипТелаЗапроса, Схема);
+ КонецЕсли;
+КонецФункции
+
+&НаСервере
+Функция ОтветВыполненногоЗапросаPOSTНаСервере(ПараметрыЗапроса, ДополнительныеПараметры)
+ ТипыТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора;
+ Если ТипТелаЗапроса = ТипыТелаЗапроса[0].Значение Тогда // none
+ Возврат КлиентHTTPКлиентСервер.ОтправитьТекст(
+ ИдентификаторРесурса,
+ "",
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
+ );
+ ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[1].Значение Тогда // form-data
+ Возврат КлиентHTTPКлиентСервер.ОтправитьДанныеФормы(
+ ИдентификаторРесурса,
+ ДанныеФормыТелаЗапросаНаСервере(),
+ ПараметрыОтправкиДанныхФормыНаСервере(ДополнительныеПараметры, Разделитель),
+ ПараметрыЗапроса
+ );
+ ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[2].Значение Тогда // x-www-form-urlencoded
+ Возврат КлиентHTTPКлиентСервер.ОтправитьДанныеHTMLФормы(
+ ИдентификаторРесурса,
+ ДанныеHTMLФормыТелаЗапросаНаСервере(),
+ ПараметрыЗапроса,
+ ДополнительныеПараметры
+ );
+ ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[3].Значение Тогда // raw
+ Возврат КлиентHTTPКлиентСервер.ОтправитьТекст(
+ ИдентификаторРесурса,
+ ТелоЗапросаТекст,
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
+ );
+ ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[4].Значение Тогда // binary
+ Возврат КлиентHTTPКлиентСервер.ОтправитьФайл(
+ ИдентификаторРесурса,
+ Новый Файл(ТелоЗапросаФайл),
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
Иначе
ВызватьИсключение СтрШаблон("Тип тела запроса %1 не поддерживается для %2", ТипТелаЗапроса, Схема);
КонецЕсли;
-
- Возврат фРезультат;
КонецФункции
&НаКлиенте
-Асинх Функция ОтветВыполненногоЗапросаPUT(ПараметрыЗапроса, ДополнительныеПараметры)
- Перем фРезультат;
-
+Асинх Функция ОтветВыполненногоЗапросаPUTНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
ТипыТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора;
Если ТипТелаЗапроса = ТипыТелаЗапроса[0].Значение Тогда // none
- фРезультат = ?(
- ВыполнятьНаСервере,
- ЗаписатьТекстНаСервере(ИдентификаторРесурса, "", ПараметрыЗапроса, ДополнительныеПараметры),
- Ждать ЗаписатьТекстНаКлиенте("", ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат Ждать КлиентHTTPКлиентСервер.ЗаписатьТекст(ИдентификаторРесурса, "", ДополнительныеПараметры, ПараметрыЗапроса);
+ ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[3].Значение Тогда // raw
+ Возврат Ждать КлиентHTTPКлиентСервер.ЗаписатьТекст(
+ ИдентификаторРесурса,
+ ТелоЗапросаТекст,
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
+ );
+ ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[4].Значение Тогда // binary
+ Возврат Ждать КлиентHTTPКлиентСервер.ЗаписатьФайл(
+ ИдентификаторРесурса,
+ Новый Файл(ТелоЗапросаФайл),
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
+ Иначе
+ ВызватьИсключение СтрШаблон("Тип тела запроса %1 не поддерживается для %2", ТипТелаЗапроса, Схема);
+ КонецЕсли;
+КонецФункции
+
+&НаСервере
+Функция ОтветВыполненногоЗапросаPUTНаСервере(ПараметрыЗапроса, ДополнительныеПараметры)
+ ТипыТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора;
+ Если ТипТелаЗапроса = ТипыТелаЗапроса[0].Значение Тогда // none
+ Возврат КлиентHTTPКлиентСервер.ЗаписатьТекст(ИдентификаторРесурса, "", ДополнительныеПараметры, ПараметрыЗапроса);
ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[3].Значение Тогда // raw
- фРезультат = ?(
- ВыполнятьНаСервере,
- ЗаписатьТекстНаСервере(ИдентификаторРесурса, ТелоЗапросаТекст, ПараметрыЗапроса, ДополнительныеПараметры),
- Ждать ЗаписатьТекстНаКлиенте(ТелоЗапросаТекст, ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат КлиентHTTPКлиентСервер.ЗаписатьТекст(
+ ИдентификаторРесурса,
+ ТелоЗапросаТекст,
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[4].Значение Тогда // binary
- фРезультат = ?(
- ВыполнятьНаСервере,
- ЗаписатьФайлНаСервере(ИдентификаторРесурса, ТелоЗапросаФайл, ПараметрыЗапроса, ДополнительныеПараметры),
- Ждать ЗаписатьФайлНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат КлиентHTTPКлиентСервер.ЗаписатьФайл(
+ ИдентификаторРесурса,
+ Новый Файл(ТелоЗапросаФайл),
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
Иначе
ВызватьИсключение СтрШаблон("Тип тела запроса %1 не поддерживается для %2", ТипТелаЗапроса, Схема);
КонецЕсли;
-
- Возврат фРезультат;
КонецФункции
&НаКлиенте
-Асинх Функция ОтветВыполненногоЗапросаPATCH(ПараметрыЗапроса, ДополнительныеПараметры)
- Перем фРезультат;
-
+Асинх Функция ОтветВыполненногоЗапросаPATCHНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
ТипыТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора;
Если ТипТелаЗапроса = ТипыТелаЗапроса[0].Значение Тогда // none
- фРезультат = ?(
- ВыполнятьНаСервере,
- ИзменитьТекстНаСервере(ИдентификаторРесурса, "", ПараметрыЗапроса, ДополнительныеПараметры),
- Ждать ИзменитьТекстНаКлиенте("", ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат Ждать КлиентHTTPКлиентСервер.ИзменитьТекст(
+ ИдентификаторРесурса,
+ "",
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[3].Значение Тогда // raw
- фРезультат = ?(
- ВыполнятьНаСервере,
- ИзменитьТекстНаСервере(ИдентификаторРесурса, ТелоЗапросаТекст, ПараметрыЗапроса, ДополнительныеПараметры),
- Ждать ИзменитьТекстНаКлиенте(ТелоЗапросаТекст, ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат Ждать КлиентHTTPКлиентСервер.ИзменитьТекст(
+ ИдентификаторРесурса,
+ ТелоЗапросаТекст,
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[4].Значение Тогда // binary
- фРезультат = ?(
- ВыполнятьНаСервере,
- ИзменитьФайлНаСервере(ИдентификаторРесурса, ТелоЗапросаФайл, ПараметрыЗапроса, ДополнительныеПараметры),
- Ждать ИзменитьФайлНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
+ Возврат Ждать КлиентHTTPКлиентСервер.ИзменитьФайл(
+ ИдентификаторРесурса,
+ Новый Файл(ТелоЗапросаФайл),
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
+ );
+ Иначе
+ ВызватьИсключение СтрШаблон("Тип тела запроса %1 не поддерживается для %2", ТипТелаЗапроса, Схема);
+ КонецЕсли;
+КонецФункции
+
+&НаСервере
+Функция ОтветВыполненногоЗапросаPATCHНаСервере(ПараметрыЗапроса, ДополнительныеПараметры)
+ ТипыТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора;
+ Если ТипТелаЗапроса = ТипыТелаЗапроса[0].Значение Тогда // none
+ Возврат КлиентHTTPКлиентСервер.ИзменитьТекст(
+ ИдентификаторРесурса,
+ "",
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
+ );
+ ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[3].Значение Тогда // raw
+ Возврат КлиентHTTPКлиентСервер.ИзменитьТекст(
+ ИдентификаторРесурса,
+ ТелоЗапросаТекст,
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
+ );
+ ИначеЕсли ТипТелаЗапроса = ТипыТелаЗапроса[4].Значение Тогда // binary
+ Возврат КлиентHTTPКлиентСервер.ИзменитьФайл(
+ ИдентификаторРесурса,
+ Новый Файл(ТелоЗапросаФайл),
+ ДополнительныеПараметры,
+ ПараметрыЗапроса
);
Иначе
ВызватьИсключение СтрШаблон("Тип тела запроса %1 не поддерживается для %2", ТипТелаЗапроса, Схема);
КонецЕсли;
-
- Возврат фРезультат;
КонецФункции
&НаКлиенте
@@ -735,7 +1019,7 @@
Асинх Функция ОтправитьДанныеФормыНаКлиенте(ПараметрыЗапроса, ДополнительныеПараметры)
Возврат Ждать КлиентHTTPКлиентСервер.ОтправитьДанныеФормы(
ИдентификаторРесурса,
- Ждать ДанныеФормыТелаЗапроса(),
+ Ждать ДанныеФормыТелаЗапросаНаКлиенте(),
ПараметрыОтправкиДанныхФормыНаКлиенте(ДополнительныеПараметры),
ПараметрыЗапроса
);
@@ -822,10 +1106,40 @@
КонецФункции
&НаКлиенте
-Функция ДополнительныеПараметрыЗапроса()
+Функция МножествоПараметровЗапросаНаКлиенте()
+ фРезультат = КлиентHTTPКлиентСервер.НовыеПараметрыЗапроса();
+
+ Для Каждого Стр Из ПараметрыЗапроса Цикл
+ Если НЕ Стр.Активно Тогда
+ Продолжить;
+ КонецЕсли;
+
+ КлиентHTTPКлиентСервер.ДобавитьПараметр(фРезультат, Стр.Ключ, Стр.Значение);
+ КонецЦикла;
+
+ Возврат фРезультат;
+КонецФункции
+
+&НаСервере
+Функция МножествоПараметровЗапросаНаСервере()
+ фРезультат = КлиентHTTPКлиентСервер.НовыеПараметрыЗапроса();
+
+ Для Каждого Стр Из ПараметрыЗапроса Цикл
+ Если НЕ Стр.Активно Тогда
+ Продолжить;
+ КонецЕсли;
+
+ КлиентHTTPКлиентСервер.ДобавитьПараметр(фРезультат, Стр.Ключ, Стр.Значение);
+ КонецЦикла;
+
+ Возврат фРезультат;
+КонецФункции
+
+&НаКлиенте
+Функция ДополнительныеПараметрыЗапросаНаКлиенте()
фРезультат = КлиентHTTPКлиентСервер.НовыеДополнительныеПараметры();
- УстановитьЗаголовкиЗапроса(фРезультат);
+ УстановитьЗаголовкиЗапросаНаКлиенте(фРезультат);
ТипАутентификацииСписокВыбора = Элементы.ТипАутентификации.СписокВыбора;
Если ТипАутентификации = ТипАутентификацииСписокВыбора[1].Значение Тогда // Basic
@@ -836,15 +1150,29 @@
КлиентHTTPКлиентСервер.УстановитьDigestАвторизацию(фРезультат, ПользовательАутентификации, ПарольАутентификации);
ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[4].Значение Тогда // Bearer
КлиентHTTPКлиентСервер.УстановитьBearerАвторизацию(фРезультат, ТокенАутентификации);
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[5].Значение Тогда // AWS4-HMAC-SHA256
+ КлиентHTTPКлиентСервер.УстановитьAWS4Авторизацию(фРезультат, AWSКлючДоступа, AWSСекретныйКлюч, AWSРегион, AWSСервис);
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[6].Значение Тогда // Hawk
+ КлиентHTTPКлиентСервер.УстановитьHawkАвторизацию(фРезультат, HawkИдентификатор, HawkКлюч, HawkДополнение, HawkИдентификаторПриложения, HawkДелегирование);
КонецЕсли;
- Если ИспользоватьПрокси Тогда
- Если ПустаяСтрока(СерверПрокси) Тогда
- Элементы.Основная.ТекущаяСтраница = Элементы.СтраницаНастройки;
- СообщитьПользователю("Прокси сервер должен быть указан");
- ВызватьИсключение "Неправильные настройки";
- КонецЕсли;
+ Если ИспользоватьСертификаты Тогда
+ КлиентHTTPКлиентСервер.ИспользоватьФайлСертификатаКлиента(
+ фРезультат,
+ Новый Файл(ИмяФайлаКлиентскогоСертификата),
+ ПарольКлиентскогоСертификата
+ );
+ Если НЕ ПустаяСтрока(ИмяФайлаСертификатовУЦ) Тогда
+ КлиентHTTPКлиентСервер.ИспользоватьФайлСертификатовУдостоверяющихЦентров(
+ фРезультат,
+ Новый Файл(ИмяФайлаСертификатовУЦ),
+ ПарольФайлаСертификатовУЦ
+ );
+ КонецЕсли;
+ КонецЕсли;
+
+ Если ИспользоватьПрокси Тогда
КлиентHTTPКлиентСервер.ИспользоватьПрокси(
фРезультат,
СерверПрокси,
@@ -853,49 +1181,201 @@
ПарольПрокси,
ИспользоватьАутентификациюОСПрокси,
,
- НеИспользоватьПроксиДляЛокальныхАдресов
+ НеИспользоватьПроксиДляЛокальныхАдресов,
+ ПротоколПрокси
);
КонецЕсли;
Если ИспользоватьСессию Тогда
КлиентHTTPКлиентСервер
.ИспользоватьСессию(фРезультат)
- .УстановитьПорогПеренаправлений(фРезультат, ПорогПеренаправлений);
+ .УстановитьПорогПеренаправлений(фРезультат, ПорогПеренаправлений)
+ .ПеренаправленияКакGET(фРезультат, ПеренаправлениеКакGET);
Если ПоддержкаCookie Тогда
КлиентHTTPКлиентСервер.СкопироватьПеченье(фРезультат, Дополнительно);
КонецЕсли;
КонецЕсли;
+ Если Таймаут > 0 Тогда
+ КлиентHTTPКлиентСервер.УстановитьТаймаут(фРезультат, Таймаут);
+ КонецЕсли;
+
+ Если НЕ ПустаяСтрока(АгентПользователя) Тогда
+ КлиентHTTPКлиентСервер.УстановитьАгентаПользователя(фРезультат, АгентПользователя);
+ КонецЕсли;
+
+ СпособыПовторногоВыполнения = Элементы.СпособПовторногоВыполнения.СписокВыбора;
+ Если СпособПовторногоВыполнения = СпособыПовторногоВыполнения[1].Значение Тогда // Фиксировано
+ КлиентHTTPКлиентСервер.ФиксированоОтложенныеВыполнения(
+ фРезультат,
+ ДлительностьПаузыПовторногоВыполнения,
+ ПорогКоличестваПопытокПовторногоВыполнения,
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения,
+ КодыСостоянияОтветаПовторногоВыполнения.ВыгрузитьЗначения()
+ );
+ ИначеЕсли СпособПовторногоВыполнения = СпособыПовторногоВыполнения[2].Значение Тогда // Линейно
+ КлиентHTTPКлиентСервер.ЛинейноОтложенныеВыполнения(
+ фРезультат,
+ ДлительностьПаузыПовторногоВыполнения,
+ КоэффициентУвеличенияПаузыПовторногоВыполнения,
+ ПорогКоличестваПопытокПовторногоВыполнения,
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения,
+ КодыСостоянияОтветаПовторногоВыполнения.ВыгрузитьЗначения()
+ );
+ ИначеЕсли СпособПовторногоВыполнения = СпособыПовторногоВыполнения[3].Значение Тогда // Экспоненциально
+ КлиентHTTPКлиентСервер.ЭкспоненциальноОтложенныеВыполнения(
+ фРезультат,
+ ДлительностьПаузыПовторногоВыполнения,
+ КоэффициентУвеличенияПаузыПовторногоВыполнения,
+ ПорогКоличестваПопытокПовторногоВыполнения,
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения,
+ КодыСостоянияОтветаПовторногоВыполнения.ВыгрузитьЗначения()
+ );
+ КонецЕсли;
+
Возврат фРезультат;
КонецФункции
-&НаКлиенте
-Процедура УстановитьЗаголовкиЗапроса(Знач ДополнительныеПараметры)
- Для Каждого Стр Из ЗаголовкиЗапроса Цикл
- Если НЕ Стр.Активно Тогда
- Продолжить;
- КонецЕсли;
-
- КлиентHTTPКлиентСервер.УстановитьЗаголовок(ДополнительныеПараметры, Стр.Ключ, Стр.Значение);
- КонецЦикла;
-КонецПроцедуры
-
-&НаКлиенте
-Асинх Функция ДанныеФормыТелаЗапроса()
- фРезультат = КлиентHTTPКлиентСервер.НовыеПоляФормы();
- ТипыДанныхФормы = Элементы.ТелоЗапросаДанныеФормы.ПодчиненныеЭлементы.ДанныеФормыТип.СписокВыбора;
+&НаСервере
+Функция ДополнительныеПараметрыЗапросаНаСервере()
+ фРезультат = КлиентHTTPКлиентСервер.НовыеДополнительныеПараметры();
- Для Каждого Стр Из ТелоЗапросаДанныеФормы Цикл
- Если НЕ Стр.Активно Тогда
- Продолжить;
- КонецЕсли;
+ УстановитьЗаголовкиЗапросаНаСервере(фРезультат);
+
+ ТипАутентификацииСписокВыбора = Элементы.ТипАутентификации.СписокВыбора;
+ Если ТипАутентификации = ТипАутентификацииСписокВыбора[1].Значение Тогда // Basic
+ КлиентHTTPКлиентСервер.УстановитьBasicАвторизацию(фРезультат, ПользовательАутентификации, ПарольАутентификации);
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[2].Значение Тогда // NTLM
+ КлиентHTTPКлиентСервер.УстановитьNTLMАвторизацию(фРезультат, ПользовательАутентификации, ПарольАутентификации);
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[3].Значение Тогда // Digest
+ КлиентHTTPКлиентСервер.УстановитьDigestАвторизацию(фРезультат, ПользовательАутентификации, ПарольАутентификации);
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[4].Значение Тогда // Bearer
+ КлиентHTTPКлиентСервер.УстановитьBearerАвторизацию(фРезультат, ТокенАутентификации);
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[5].Значение Тогда // AWS4-HMAC-SHA256
+ КлиентHTTPКлиентСервер.УстановитьAWS4Авторизацию(фРезультат, AWSКлючДоступа, AWSСекретныйКлюч, AWSРегион, AWSСервис);
+ ИначеЕсли ТипАутентификации = ТипАутентификацииСписокВыбора[6].Значение Тогда // Hawk
+ КлиентHTTPКлиентСервер.УстановитьHawkАвторизацию(фРезультат, HawkИдентификатор, HawkКлюч, HawkДополнение, HawkИдентификаторПриложения, HawkДелегирование);
+ КонецЕсли;
+
+ Если ИспользоватьСертификаты Тогда
+ КлиентHTTPКлиентСервер.ИспользоватьФайлСертификатаКлиента(
+ фРезультат,
+ Новый Файл(ИмяФайлаКлиентскогоСертификата),
+ ПарольКлиентскогоСертификата
+ );
- Если Стр.Тип = ТипыДанныхФормы[0].Значение Тогда // Текст
- КлиентHTTPКлиентСервер.ДобавитьПолеФормыТекст(фРезультат, Стр.Ключ, Стр.Значение);
- Иначе // Файл
- Если ПустаяСтрока(Стр.Значение) Тогда
- Элементы.ГруппаРазделыЗапроса.ТекущаяСтраница = Элементы.РазделТелоЗапроса;
+ Если НЕ ПустаяСтрока(ИмяФайлаСертификатовУЦ) Тогда
+ КлиентHTTPКлиентСервер.ИспользоватьФайлСертификатовУдостоверяющихЦентров(
+ фРезультат,
+ Новый Файл(ИмяФайлаСертификатовУЦ),
+ ПарольФайлаСертификатовУЦ
+ );
+ КонецЕсли;
+ КонецЕсли;
+
+ Если ИспользоватьПрокси Тогда
+ КлиентHTTPКлиентСервер.ИспользоватьПрокси(
+ фРезультат,
+ СерверПрокси,
+ ПортПрокси,
+ ПользовательПрокси,
+ ПарольПрокси,
+ ИспользоватьАутентификациюОСПрокси,
+ ,
+ НеИспользоватьПроксиДляЛокальныхАдресов,
+ ПротоколПрокси
+ );
+ КонецЕсли;
+
+ Если ИспользоватьСессию Тогда
+ КлиентHTTPКлиентСервер
+ .ИспользоватьСессию(фРезультат)
+ .УстановитьПорогПеренаправлений(фРезультат, ПорогПеренаправлений)
+ .ПеренаправленияКакGET(фРезультат, ПеренаправлениеКакGET);
+
+ Если ПоддержкаCookie Тогда
+ КлиентHTTPКлиентСервер.СкопироватьПеченье(фРезультат, Дополнительно);
+ КонецЕсли;
+ КонецЕсли;
+
+ Если Таймаут > 0 Тогда
+ КлиентHTTPКлиентСервер.УстановитьТаймаут(фРезультат, Таймаут);
+ КонецЕсли;
+
+ Если НЕ ПустаяСтрока(АгентПользователя) Тогда
+ КлиентHTTPКлиентСервер.УстановитьАгентаПользователя(фРезультат, АгентПользователя);
+ КонецЕсли;
+
+ СпособыПовторногоВыполнения = Элементы.СпособПовторногоВыполнения.СписокВыбора;
+ Если СпособПовторногоВыполнения = СпособыПовторногоВыполнения[1].Значение Тогда // Фиксировано
+ КлиентHTTPКлиентСервер.ФиксированоОтложенныеВыполнения(
+ фРезультат,
+ ДлительностьПаузыПовторногоВыполнения,
+ ПорогКоличестваПопытокПовторногоВыполнения,
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения,
+ КодыСостоянияОтветаПовторногоВыполнения.ВыгрузитьЗначения()
+ );
+ ИначеЕсли СпособПовторногоВыполнения = СпособыПовторногоВыполнения[2].Значение Тогда // Линейно
+ КлиентHTTPКлиентСервер.ЛинейноОтложенныеВыполнения(
+ фРезультат,
+ ДлительностьПаузыПовторногоВыполнения,
+ КоэффициентУвеличенияПаузыПовторногоВыполнения,
+ ПорогКоличестваПопытокПовторногоВыполнения,
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения,
+ КодыСостоянияОтветаПовторногоВыполнения.ВыгрузитьЗначения()
+ );
+ ИначеЕсли СпособПовторногоВыполнения = СпособыПовторногоВыполнения[3].Значение Тогда // Экспоненциально
+ КлиентHTTPКлиентСервер.ЭкспоненциальноОтложенныеВыполнения(
+ фРезультат,
+ ДлительностьПаузыПовторногоВыполнения,
+ КоэффициентУвеличенияПаузыПовторногоВыполнения,
+ ПорогКоличестваПопытокПовторногоВыполнения,
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения,
+ КодыСостоянияОтветаПовторногоВыполнения.ВыгрузитьЗначения()
+ );
+ КонецЕсли;
+
+ Возврат фРезультат;
+КонецФункции
+
+&НаКлиенте
+Процедура УстановитьЗаголовкиЗапросаНаКлиенте(Знач ДополнительныеПараметры)
+ Для Каждого Стр Из ЗаголовкиЗапроса Цикл
+ Если НЕ Стр.Активно Тогда
+ Продолжить;
+ КонецЕсли;
+
+ КлиентHTTPКлиентСервер.УстановитьЗаголовок(ДополнительныеПараметры, Стр.Ключ, Стр.Значение);
+ КонецЦикла;
+КонецПроцедуры
+
+&НаСервере
+Процедура УстановитьЗаголовкиЗапросаНаСервере(Знач ДополнительныеПараметры)
+ Для Каждого Стр Из ЗаголовкиЗапроса Цикл
+ Если НЕ Стр.Активно Тогда
+ Продолжить;
+ КонецЕсли;
+
+ КлиентHTTPКлиентСервер.УстановитьЗаголовок(ДополнительныеПараметры, Стр.Ключ, Стр.Значение);
+ КонецЦикла;
+КонецПроцедуры
+
+&НаКлиенте
+Асинх Функция ДанныеФормыТелаЗапросаНаКлиенте()
+ фРезультат = КлиентHTTPКлиентСервер.НовыеПоляФормы();
+ ТипыДанныхФормы = Элементы.ТелоЗапросаДанныеФормы.ПодчиненныеЭлементы.ДанныеФормыТип.СписокВыбора;
+
+ Для Каждого Стр Из ТелоЗапросаДанныеФормы Цикл
+ Если НЕ Стр.Активно Тогда
+ Продолжить;
+ КонецЕсли;
+
+ Если Стр.Тип = ТипыДанныхФормы[0].Значение Тогда // Текст
+ КлиентHTTPКлиентСервер.ДобавитьПолеФормыТекст(фРезультат, Стр.Ключ, Стр.Значение);
+ Иначе // Файл
+ Если ПустаяСтрока(Стр.Значение) Тогда
+ Элементы.ГруппаРазделыЗапроса.ТекущаяСтраница = Элементы.РазделТелоЗапроса;
Элементы.ГруппаРазделы.ТекущаяСтраница = Элементы.РазделЗапрос;
ВызватьИсключение "Укажите выгружаемый файл в форме тела запроса";
@@ -951,7 +1431,22 @@
КонецФункции
&НаКлиенте
-Функция ДанныеHTMLФормыТелаЗапроса()
+Функция ДанныеHTMLФормыТелаЗапросаНаКлиенте()
+ фРезультат = КлиентHTTPКлиентСервер.НовыеПоляФормы();
+
+ Для Каждого Стр Из ТелоЗапросаДанныеHTMLФормы Цикл
+ Если НЕ Стр.Активно Тогда
+ Продолжить;
+ КонецЕсли;
+
+ КлиентHTTPКлиентСервер.ДобавитьПолеHTMLФормы(фРезультат, Стр.Ключ, Стр.Значение);
+ КонецЦикла;
+
+ Возврат фРезультат;
+КонецФункции
+
+&НаСервере
+Функция ДанныеHTMLФормыТелаЗапросаНаСервере()
фРезультат = КлиентHTTPКлиентСервер.НовыеПоляФормы();
Для Каждого Стр Из ТелоЗапросаДанныеHTMLФормы Цикл
@@ -997,8 +1492,12 @@
ТекстТелаОтвета = "двоичные данные";
КонецЕсли;
- ВТелеОтветаHTML = ТипMIMEОтвета = КлиентHTTPПовтИсп.ТипMIMEHTML();
- Если ВТелеОтветаHTML Тогда
+ ОтобразитьВПолеВвода = (
+ ТипMIMEОтвета = КлиентHTTPПовтИсп.ТипMIMEHTML() ИЛИ
+ ТипMIMEОтвета = КлиентHTTPПовтИсп.ТипMIMETextXML() ИЛИ
+ ТипMIMEОтвета = КлиентHTTPПовтИсп.ТипMIMEApplicationXML()
+ );
+ Если ОтобразитьВПолеВвода Тогда
ОтветТекстСтрока = Лев(ТекстТелаОтвета, 131072) + ?(СтрДлина(ТекстТелаОтвета) > 131072, "...", "");
ОтветТекст.УстановитьФорматированнуюСтроку(Новый ФорматированнаяСтрока(""));
Иначе
@@ -1006,11 +1505,12 @@
ОтветТекст.УстановитьФорматированнуюСтроку(Новый ФорматированнаяСтрока(ТекстТелаОтвета));
КонецЕсли;
- Элементы.ОтветТекст.Видимость = НЕ ВТелеОтветаHTML;
- Элементы.ОтветТекстСтрока.Видимость = ВТелеОтветаHTML;
+ Элементы.ОтветТекст.Видимость = НЕ ОтобразитьВПолеВвода;
+ Элементы.ОтветТекстСтрока.Видимость = ОтобразитьВПолеВвода;
ВывестиТелоОтветаJSON(ТекстТелаОтвета);
ОтобразитьКартинкуТелаОтвета(ТипMIMEОтвета);
+ ПроверитьОтветHawk(Ответ);
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
@@ -1127,9 +1627,29 @@
Возврат;
КонецЕсли;
+ Элементы.ГруппаФорматыТелаОтвета.ТекущаяСтраница = Элементы.ФорматТелаОтветаКартинка;
+
ПопробоватьОтобразитьКартинку(Неопределено);
КонецПроцедуры
+&НаКлиенте
+Процедура ПроверитьОтветHawk(Знач Ответ)
+ Если ТипАутентификации <> Элементы.ТипАутентификации.СписокВыбора[6].Значение Тогда // Hawk
+ Возврат;
+ КонецЕсли;
+ Если Цел(Ответ.КодСостояния / 100) <> 2 Тогда // 2хх
+ Возврат;
+ КонецЕсли;
+ Если КлиентHTTPКлиентСервер.ЗначениеЗаголовка("Server-Authorization", Ответ.Заголовки) = Неопределено Тогда
+ СообщитьПользователю("В ответе отсутствует заголовок верефикации 'Server-Authorization'");
+ КонецЕсли;
+
+ ОписаниеОшибки = "";
+ Если НЕ КлиентHTTPКлиентСервер.ОтветСЗаголовкомHawkКорректен(Ответ, "Server-Authorization", ОписаниеОшибки) Тогда
+ СообщитьПользователю(ОписаниеОшибки);
+ КонецЕсли;
+КонецПроцедуры
+
&НаКлиенте
Процедура ИзменитьКонтекстВыполненияЗапроса()
Элементы.ТелоЗапросаФайл.КнопкаВыбора = ВыполнятьНаСервере;
@@ -1149,14 +1669,24 @@
Функция ПараметрыИдентификатораСПорядком(Знач ИдентификаторРесурса, Знач ПозицияНачала)
фРезультат = Новый Структура("Параметры, Порядок", Новый Соответствие, Новый Массив);
- ПараметрыСтрока = ?(
- ПозицияНачала = 0,
- "",
- Сред(ИдентификаторРесурса, ПозицияНачала + 1)
+ Если ПозицияНачала = 0 Тогда
+ Возврат фРезультат;
+ КонецЕсли;
+
+ ПозицияОкончания = СтрНайти(ИдентификаторРесурса, "#", , ПозицияНачала);
+ ПараметрыСтрока = Сред(
+ ИдентификаторРесурса,
+ ПозицияНачала + 1,
+ ?(
+ ПозицияОкончания = 0,
+ СтрДлина(ИдентификаторРесурса),
+ ПозицияОкончания - 1
+ ) - ПозицияНачала
);
- ПараметрыИдентификатора = СтрРазделить(ПараметрыСтрока, "&", Ложь);
- Для Каждого Параметр Из ПараметрыИдентификатора Цикл
+ ПараметрыИдентификатора = Новый Массив;
+ МножествоСтрок = Новый Соответствие;
+ Для Каждого Параметр Из СтрРазделить(ПараметрыСтрока, "&", Ложь) Цикл
ПозицияРазделителя = СтрНайти(Параметр, "=");
Если ПозицияРазделителя = 0 Тогда
ПозицияРазделителя = СтрДлина(Параметр) + 1;
@@ -1169,6 +1699,16 @@
ЗначениеПараметра = Прав(Параметр, СтрДлина(Параметр) - ПозицияРазделителя);
+ ПараметрыИдентификатора.Добавить(Новый Структура("Ключ, Значение", ИмяПараметра, ЗначениеПараметра));
+ МножествоСтрок.Вставить(ИмяПараметра);
+ МножествоСтрок.Вставить(ЗначениеПараметра);
+ КонецЦикла;
+
+ МножествоСтрок = РаскодированныеСтрокиURLвURL(МножествоСтрок);
+
+ Для Каждого Параметр Из ПараметрыИдентификатора Цикл
+ ИмяПараметра = МножествоСтрок.Получить(Параметр.Ключ);
+ ЗначениеПараметра = МножествоСтрок.Получить(Параметр.Значение);
ЗначенияПараметра = фРезультат.Параметры.Получить(ИмяПараметра);
Если ЗначенияПараметра = Неопределено Тогда
ЗначенияПараметра = Новый Соответствие;
@@ -1259,12 +1799,14 @@
ВызватьИсключение "Не удалось разобрать URI";
КонецЕсли;
- ПозицияНачалаСтрокиПараметров = СтрНайти(ИдентификаторРесурса, "?", , ПозицияНачалаПоиска);
+ ПозицияСимволаПараметров = СтрНайти(ИдентификаторРесурса, "?", , ПозицияНачалаПоиска);
+ ПозицияСимволаФрагмента = СтрНайти(ИдентификаторРесурса, "#", , ?(ПозицияСимволаПараметров = 0, 1, ПозицияСимволаПараметров));
+ ПозицияОкончания = ?(ПозицияСимволаПараметров = 0, ПозицияСимволаФрагмента, ПозицияСимволаПараметров);
НовыйИдентификатор = ?(
- ПозицияНачалаСтрокиПараметров = 0,
+ ПозицияОкончания = 0,
ИдентификаторРесурса,
- Лев(ИдентификаторРесурса, ПозицияНачалаСтрокиПараметров - 1)
+ Лев(ИдентификаторРесурса, ПозицияОкончания - 1)
);
ПараметрыИдентификатора = Новый Массив;
@@ -1280,7 +1822,12 @@
ПараметрыИдентификатора.Добавить(Новый Структура("Ключ, Значение", Стр.Ключ, ЗначениеПараметра));
КонецЦикла;
- ИдентификаторРесурса = НовыйИдентификатор + КлиентHTTPКлиентСервер.ПараметрыЗапросаСтрокой(ПараметрыИдентификатора);
+ ИдентификаторРесурса = СтрШаблон(
+ "%1%2%3",
+ НовыйИдентификатор,
+ КлиентHTTPКлиентСервер.ПараметрыЗапросаСтрокой(ПараметрыИдентификатора),
+ ?(ПозицияСимволаФрагмента = 0, "", Сред(ИдентификаторРесурса, ПозицияСимволаФрагмента))
+ );
КонецПроцедуры
&НаКлиенте
@@ -1310,25 +1857,408 @@
КонецФункции
&НаКлиенте
-Функция МножествоПараметровЗапроса()
- фРезультат = КлиентHTTPКлиентСервер.НовыеПараметрыЗапроса();
+Функция ЗаголовокГруппыСВыбраннымЭлементом(Знач ОснованиеЗаголовка, Знач Активно)
+ Возврат СтрШаблон(
+ "%1%2",
+ ОснованиеЗаголовка,
+ ?(Активно, " ●", "")
+ );
+КонецФункции
+
+&НаКлиенте
+Функция ОтображениеСекрета(Знач Текст, Знач ЭлементФормы, Знач СкрыватьПустуюСтроку = Истина)
+ Возврат ?(
+ НЕ СкрыватьПустуюСтроку И Текст = "",
+ "",
+ ?(НЕ ОтображатьСекреты И ЭлементФормы.РежимПароля, "***", Текст)
+ );
+КонецФункции
+
+#Область ГенерацияКомандыCurl
+&НаКлиенте
+Функция ЭкранированиеАпострофаUnix(Знач Текст)
+ Возврат СтрЗаменить(Текст, "'", "'\''")
+КонецФункции
+
+&НаКлиенте
+Функция ЭкранированиеСимволовЗначенияПоляФормы(Знач Текст, Знач ЭкранироватьОбратныйСлеш)
+ Возврат СтрЗаменить(
+ ЭкранированиеАпострофаUnix(
+ ?(
+ ЭкранироватьОбратныйСлеш,
+ СтрЗаменить(Текст, "\", "\\"),
+ Текст
+ )
+ ), """", "\"""
+ );
+КонецФункции
+
+&НаКлиенте
+Процедура ЗаполнитьПовторноеВыполнениеCurlКоманды(ЧастиКоманды)
+ Способы = Элементы.СпособПовторногоВыполнения.СписокВыбора;
+ Если СпособПовторногоВыполнения <> Способы[1].Значение И СпособПовторногоВыполнения <> Способы[3].Значение Тогда // не Фиксировано и не Экспоненциально
+ Возврат;
+ КонецЕсли;
- Для Каждого Стр Из ПараметрыЗапроса Цикл
+ ЧастиКоманды.Добавить("--retry");
+ ЧастиКоманды.Добавить(XMLСтрока(ПорогКоличестваПопытокПовторногоВыполнения));
+
+ Если СпособПовторногоВыполнения = Способы[1].Значение Тогда // Фиксировано
+ ЧастиКоманды.Добавить("--retry-delay");
+ ЧастиКоманды.Добавить(XMLСтрока(ДлительностьПаузыПовторногоВыполнения));
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьКлиентскийСертификатCurlКоманды(ЧастиКоманды)
+ Если НЕ ИспользоватьСертификаты ИЛИ ПустаяСтрока(ИмяФайлаКлиентскогоСертификата) Тогда
+ Возврат;
+ КонецЕсли;
+
+ Если НЕ ПустаяСтрока(ИмяФайлаСертификатовУЦ) Тогда
+ ЧастиКоманды.Добавить("--cacert");
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", ЭкранированиеАпострофаUnix(СокрЛП(ИмяФайлаСертификатовУЦ))));
+ КонецЕсли;
+
+ ФайлКС = Новый Файл(ИмяФайлаКлиентскогоСертификата);
+ РасширениеКС = НРег(ФайлКС.Расширение);
+ Если РасширениеКС = ".p12" ИЛИ РасширениеКС = ".pfx" Тогда
+ ЧастиКоманды.Добавить("--cert-type P12");
+ КонецЕсли;
+
+ ЧастиСертификата = Новый Массив;
+
+ ЧастиКоманды.Добавить("--cert");
+ ЧастиСертификата.Добавить(СокрЛП(ИмяФайлаКлиентскогоСертификата));
+
+ Пароль = ОтображениеСекрета(ПарольКлиентскогоСертификата, Элементы.ПарольКлиентскогоСертификата, Ложь);
+ Если Пароль <> "" Тогда
+ ЧастиСертификата.Добавить(Пароль);
+ КонецЕсли;
+
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", ЭкранированиеАпострофаUnix(СтрСоединить(ЧастиСертификата, ":"))));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьПользователяИПарольCurlКоманды(ЧастиКоманды)
+ Если НЕ ЗначениеЗаполнено(ПользовательАутентификации) Тогда
+ Возврат;
+ КонецЕсли;
+
+ ЧастиАутентификации = Новый Массив;
+
+ ЧастиКоманды.Добавить("-u");
+ ЧастиАутентификации.Добавить(ПользовательАутентификации);
+ ЧастиАутентификации.Добавить(ОтображениеСекрета(ПарольАутентификации, Элементы.ПарольАутентификации));
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", ЭкранированиеАпострофаUnix(СтрСоединить(ЧастиАутентификации, ":"))));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьAWS4CurlКоманды(ЧастиКоманды)
+ ЧастиАутентификации = Новый Массив;
+
+ ЧастиКоманды.Добавить("-u");
+ ЧастиАутентификации.Добавить(AWSКлючДоступа);
+ ЧастиАутентификации.Добавить(ОтображениеСекрета(AWSСекретныйКлюч, Элементы.СекретныйКлючAWS));
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", ЭкранированиеАпострофаUnix(СтрСоединить(ЧастиАутентификации, ":"))));
+
+ ЧастиКоманды.Добавить("--aws-sigv4");
+ ЧастиАутентификации.Очистить();
+ ЧастиАутентификации.Добавить("aws:amz");
+ Если НЕ ПустаяСтрока(AWSРегион) Тогда
+ ЧастиАутентификации.Добавить(AWSРегион);
+ Если НЕ ПустаяСтрока(AWSСервис) Тогда
+ ЧастиАутентификации.Добавить(AWSСервис);
+ КонецЕсли;
+ КонецЕсли;
+
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", ЭкранированиеАпострофаUnix(СтрСоединить(ЧастиАутентификации, ":"))));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьАутентификациюCurlКоманды(ЧастиКоманды)
+ Если ТипАутентификации = Элементы.ТипАутентификации.СписокВыбора[0].Значение Тогда
+ ИначеЕсли ТипАутентификации = Элементы.ТипАутентификации.СписокВыбора[1].Значение Тогда // Basic
+ ЗаполнитьПользователяИПарольCurlКоманды(ЧастиКоманды);
+ ЧастиКоманды.Добавить("--basic");
+ ИначеЕсли ТипАутентификации = Элементы.ТипАутентификации.СписокВыбора[2].Значение Тогда // NTLM
+ ЗаполнитьПользователяИПарольCurlКоманды(ЧастиКоманды);
+ ЧастиКоманды.Добавить("--ntlm");
+ ИначеЕсли ТипАутентификации = Элементы.ТипАутентификации.СписокВыбора[3].Значение Тогда // Digest
+ ЗаполнитьПользователяИПарольCurlКоманды(ЧастиКоманды);
+ ЧастиКоманды.Добавить("--digest");
+ ИначеЕсли ТипАутентификации = Элементы.ТипАутентификации.СписокВыбора[4].Значение Тогда // Bearer
+ ЧастиКоманды.Добавить("--oauth2-bearer");
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", ЭкранированиеАпострофаUnix(ОтображениеСекрета(ТокенАутентификации, Элементы.ТокенАутентификации))));
+ ИначеЕсли ТипАутентификации = Элементы.ТипАутентификации.СписокВыбора[5].Значение Тогда // AWS4-HMAC-SHA256
+ ЗаполнитьAWS4CurlКоманды(ЧастиКоманды);
+ Иначе
+ СообщитьПользователю(СтрШаблон("Для типа аутентификации %1 нет отображения в команде curl", ТипАутентификации));
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьПолеФормыCurlКоманды(ЧастиКоманды, Знач Поле)
+ ТипMIME = "";
+ ИмяФайла = "";
+ ЭкранироватьОбратныйСлеш = Истина;
+ ТипыДанныхФормыФайл = Элементы.ТелоЗапросаДанныеФормы.ПодчиненныеЭлементы.ДанныеФормыТип.СписокВыбора[1].Значение;
+
+ ЧастиПоляФормы = Новый Массив;
+ ЧастиПоляФормы.Добавить(ЭкранированиеАпострофаUnix(Поле.Ключ));
+ ЧастиПоляФормы.Добавить("=");
+ Если Поле.Тип = ТипыДанныхФормыФайл Тогда
+ ЧастиПоляФормы.Добавить("@");
+
+ ФайлПоля = Новый Файл(Поле.Значение);
+ ИмяФайла = ФайлПоля.Имя;
+ ТипMIME = КлиентHTTPСлужебный.ТипMIMEРасширенияФайла(ФайлПоля.Расширение);
+ ЭкранироватьОбратныйСлеш = ?(ВыполнятьНаСервере, РазделительПутиСервера(), ПолучитьРазделительПутиКлиента()) <> "\";
+ КонецЕсли;
+
+ ЧастиПоляФормы.Добавить("""");
+ ЧастиПоляФормы.Добавить(ЭкранированиеСимволовЗначенияПоляФормы(Поле.Значение, ЭкранироватьОбратныйСлеш));
+
+ Если НЕ ПустаяСтрока(ИмяФайла) Тогда
+ ЧастиПоляФормы.Добавить(";filename=");
+ ЧастиПоляФормы.Добавить(ИмяФайла);
+ КонецЕсли;
+ Если НЕ ПустаяСтрока(ТипMIME) Тогда
+ ЧастиПоляФормы.Добавить(";type=");
+ ЧастиПоляФормы.Добавить(ТипMIME);
+ КонецЕсли;
+
+ ЧастиПоляФормы.Добавить("""");
+
+ ЧастиКоманды.Добавить("-F");
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", СтрСоединить(ЧастиПоляФормы, "")));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьДанныеФормыCurlКоманды(ЧастиКоманды, ОтобразитьPOST)
+ Если ТелоЗапросаДанныеФормы.Количество() = 0 Тогда
+ ОтобразитьPOST = Истина;
+ Возврат;
+ КонецЕсли;
+
+ Для Каждого Стр Из ТелоЗапросаДанныеФормы Цикл
+ ЗаполнитьПолеФормыCurlКоманды(ЧастиКоманды, Стр);
+ КонецЦикла;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьДанныеHTMLФормыCurlКоманды(ЧастиКоманды, ОтобразитьPOST)
+ Если ТелоЗапросаДанныеHTMLФормы.Количество() = 0 Тогда
+ ОтобразитьPOST = Истина;
+ Возврат;
+ КонецЕсли;
+
+ ПоляФормы = Новый Массив;
+ Для Каждого Стр Из ТелоЗапросаДанныеHTMLФормы Цикл
+ ЧастиКоманды.Добавить("--data-urlencode");
+ ЧастиКоманды.Добавить(СтрШаблон("'%1=%2'", КодированныйТекстВURL(Стр.Ключ), ЭкранированиеАпострофаUnix(Стр.Значение)));
+ КонецЦикла;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьТекстовыеДанныеCurlКоманды(ЧастиКоманды, ОтобразитьPOST)
+ Если ПустаяСтрока(ТелоЗапросаТекст) Тогда
+ ОтобразитьPOST = Истина;
+ Возврат;
+ КонецЕсли;
+
+ ЧастиКоманды.Добавить("--data-raw");
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", ЭкранированиеАпострофаUnix(ТелоЗапросаТекст)));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьДанныеФайлаCurlКоманды(ЧастиКоманды, ОтобразитьPOST, ПредопределенныеЗаголовки)
+ Если ПустаяСтрока(ТелоЗапросаФайл) Тогда
+ ОтобразитьPOST = Истина;
+ Возврат;
+ КонецЕсли;
+
+ ЧастиКоманды.Добавить("--data-binary");
+ ЧастиКоманды.Добавить(СтрШаблон("@""%1""", ЭкранированиеАпострофаUnix(ТелоЗапросаФайл)));
+
+ ФайлТела = Новый Файл(ТелоЗапросаФайл);
+ ТипMIME = КлиентHTTPСлужебный.ТипMIMEРасширенияФайла(ФайлТела.Расширение);
+
+ ПредопределенныеЗаголовки.Добавить(Новый Структура("Ключ, Значение", "Content-Type", ТипMIME));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьТелоЗапросаCurlКоманды(ЧастиКоманды, ОтобразитьPOST, ПредопределенныеЗаголовки)
+ Если ТипТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора[1].Значение Тогда // multipart/form-data
+ ЗаполнитьДанныеФормыCurlКоманды(ЧастиКоманды, ОтобразитьPOST);
+ ИначеЕсли ТипТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора[2].Значение Тогда // application/x-www-form-urlencoded
+ ЗаполнитьДанныеHTMLФормыCurlКоманды(ЧастиКоманды, ОтобразитьPOST);
+ ИначеЕсли ТипТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора[3].Значение Тогда // Текст
+ ЗаполнитьТекстовыеДанныеCurlКоманды(ЧастиКоманды, ОтобразитьPOST);
+ ИначеЕсли ТипТелаЗапроса = Элементы.ТипТелаЗапроса.СписокВыбора[4].Значение Тогда // Файл
+ ЗаполнитьДанныеФайлаCurlКоманды(ЧастиКоманды, ОтобразитьPOST, ПредопределенныеЗаголовки);
+ Иначе
+ ОтобразитьPOST = Истина;
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьТаймаутCurlКоманды(ЧастиКоманды)
+ Если Таймаут = 0 Тогда
+ Возврат;
+ КонецЕсли;
+
+ ЧастиКоманды.Добавить("--connect-timeout");
+ ЧастиКоманды.Добавить(XMLСтрока(Таймаут));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьПроксиCurlКоманды(ЧастиКоманды)
+ Если НЕ (ИспользоватьПрокси И ЗначениеЗаполнено(СерверПрокси)) Тогда
+ Возврат;
+ КонецЕсли;
+
+ ЧастиПрокси = Новый Массив;
+
+ Если ЗначениеЗаполнено(ПользовательПрокси) Тогда
+ ЧастиПрокси.Добавить(ПользовательПрокси);
+ ЧастиПрокси.Добавить(ОтображениеСекрета(ПарольПрокси, Элементы.ПарольПрокси));
+
+ ЧастиКоманды.Добавить(?(ИспользоватьАутентификациюОСПрокси, "--proxy-ntlm", "--proxy-basic"));
+ ЧастиКоманды.Добавить("--proxy-user");
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", СтрЗаменить(СтрСоединить(ЧастиПрокси, ":"), "'", "'\''")));
+ КонецЕсли;
+
+ ЧастиПрокси.Очистить();
+ ЧастиПрокси.Добавить(ПротоколПрокси);
+ ЧастиПрокси.Добавить("://");
+ ЧастиПрокси.Добавить(СерверПрокси);
+
+ Если ЗначениеЗаполнено(ПортПрокси) Тогда
+ ЧастиПрокси.Добавить(":");
+ ЧастиПрокси.Добавить(ПортПрокси);
+ КонецЕсли;
+
+ ЧастиКоманды.Добавить("-x");
+ ЧастиКоманды.Добавить(СтрСоединить(ЧастиПрокси, ""));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьСессиюCurlКоманды(ЧастиКоманды, ЧастиСложнойОпции)
+ Если НЕ ИспользоватьСессию Тогда
+ Возврат;
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(ПорогПеренаправлений) Тогда
+ ЧастиКоманды.Добавить("--max-redirs");
+ ЧастиКоманды.Добавить(ПорогПеренаправлений);
+ КонецЕсли;
+
+ ЧастиСложнойОпции.Добавить("L");
+
+ Если ПоддержкаCookie Тогда
+ ЗначениеCookie = КлиентHTTPКлиентСервер.ЗначениеЗаголовкаCookieРесурса(ИдентификаторРесурса, Дополнительно);
+ Если ЗначениеЗаполнено(ЗначениеCookie) Тогда
+ ЧастиКоманды.Добавить("-b");
+ ЧастиКоманды.Добавить(СтрШаблон("'%1'", ЭкранированиеАпострофаUnix(ЗначениеCookie)));
+ КонецЕсли;
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьЗаголовкиCurlКоманды(ЧастиКоманды, Знач ПредопределенныеЗаголовки)
+ Для Каждого Стр Из ПредопределенныеЗаголовки Цикл
+ ЧастиКоманды.Добавить("-H");
+ ЧастиКоманды.Добавить(
+ СтрШаблон("'%1: %2'", ЭкранированиеАпострофаUnix(Стр.Ключ), ЭкранированиеАпострофаUnix(Стр.Значение))
+ );
+ КонецЦикла;
+
+ Для Каждого Стр Из ЗаголовкиЗапроса Цикл
Если НЕ Стр.Активно Тогда
Продолжить;
КонецЕсли;
- КлиентHTTPКлиентСервер.ДобавитьПараметр(фРезультат, Стр.Ключ, Стр.Значение);
+ ЧастиКоманды.Добавить("-H");
+ ЧастиКоманды.Добавить(
+ СтрШаблон("'%1: %2'", ЭкранированиеАпострофаUnix(Стр.Ключ), ЭкранированиеАпострофаUnix(Стр.Значение))
+ );
КонецЦикла;
-
- Возврат фРезультат;
-КонецФункции
+КонецПроцедуры
&НаКлиенте
-Процедура ЗафиксироватьВремяВыполненияЗапроса(Знач ВремяНачала)
- ВремяВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах() - ВремяНачала;
+Процедура ЗаполнитьСхемуЗапросаCurlКоманды(ЧастиКоманды, ЧастиСложнойОпции, Знач ОтобразитьPOST)
+ СхемаСписокВыбора = Элементы.Схема.СписокВыбора;
+ Если Схема = СхемаСписокВыбора[0].Значение И НЕ ОтобразитьPOST Тогда // GET
+ ЧастиКоманды.Добавить(СтрШаблон("-X %1", Схема));
+ ИначеЕсли Схема = СхемаСписокВыбора[1].Значение И ОтобразитьPOST Тогда // POST
+ ЧастиКоманды.Добавить(СтрШаблон("-X %1", Схема));
+ ИначеЕсли Схема = СхемаСписокВыбора[4].Значение Тогда // HEAD
+ ЧастиСложнойОпции.Добавить("I");
+ ИначеЕсли Схема = СхемаСписокВыбора[2].Значение // PUT
+ ИЛИ Схема = СхемаСписокВыбора[3].Значение // DELETE
+ ИЛИ Схема = СхемаСписокВыбора[5].Значение // PATCH
+ Тогда
+ ЧастиКоманды.Добавить(СтрШаблон("-X %1", Схема));
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, Знач РазделКоманды)
+ Для Каждого Часть Из РазделКоманды Цикл
+ ЧастиКоманды.Добавить(Часть);
+ КонецЦикла;
КонецПроцедуры
+&НаКлиенте
+Функция КомандаCurlЗапросаКонсоли()
+ ЧастиСложнойОпции = Новый Массив;
+ ПредопределенныеЗаголовки = Новый Массив;
+ ОтобразитьPOST = Ложь;
+
+ РазделыКоманды = Новый Структура(
+ "ПовторноеВыполнение, Аутентификация, КлиентскийСертификат, Тело, Таймаут, Прокси, Сессия, Заголовки, Схема",
+ );
+ Для Каждого КЗ Из РазделыКоманды Цикл
+ РазделыКоманды[КЗ.Ключ] = Новый Массив;
+ КонецЦикла;
+
+ ЗаполнитьПовторноеВыполнениеCurlКоманды(РазделыКоманды.ПовторноеВыполнение);
+ ЗаполнитьАутентификациюCurlКоманды(РазделыКоманды.Аутентификация);
+ ЗаполнитьКлиентскийСертификатCurlКоманды(РазделыКоманды.КлиентскийСертификат);
+ ЗаполнитьТелоЗапросаCurlКоманды(РазделыКоманды.Тело, ОтобразитьPOST, ПредопределенныеЗаголовки);
+ ЗаполнитьТаймаутCurlКоманды(РазделыКоманды.Таймаут);
+ ЗаполнитьПроксиCurlКоманды(РазделыКоманды.Прокси);
+ ЗаполнитьСессиюCurlКоманды(РазделыКоманды.Сессия, ЧастиСложнойОпции);
+ ЗаполнитьЗаголовкиCurlКоманды(РазделыКоманды.Заголовки, ПредопределенныеЗаголовки);
+ ЗаполнитьСхемуЗапросаCurlКоманды(РазделыКоманды.Схема, ЧастиСложнойОпции, ОтобразитьPOST);
+
+ ЧастиКоманды = Новый Массив;
+ ЧастиКоманды.Добавить("curl");
+
+ Если ЧастиСложнойОпции.Количество() > 0 Тогда
+ ЧастиСложнойОпции.Вставить(0, "-");
+ ЧастиКоманды.Добавить(СтрСоединить(ЧастиСложнойОпции, ""));
+ КонецЕсли;
+
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Схема);
+
+ ЧастиКоманды.Добавить(КодированныйURIВURL(ИдентификаторРесурса));
+
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Аутентификация);
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.КлиентскийСертификат);
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Заголовки);
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Тело);
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Прокси);
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Таймаут);
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.Сессия);
+ ЗаполнитьЧастиРазделаКомандыCurl(ЧастиКоманды, РазделыКоманды.ПовторноеВыполнение);
+
+ Возврат СтрСоединить(ЧастиКоманды, " ");
+КонецФункции
+#КонецОбласти
+
+#Область ИмпортКомандыCurl
&НаКлиенте
Функция ОпцииКомандыCurl()
фРезультат = Новый Соответствие;
@@ -1357,6 +2287,9 @@
фРезультат.Вставить("--ntlm", Ложь);
фРезультат.Вставить("--ntlm-wb", Ложь);
фРезультат.Вставить("--oauth2-bearer", Истина);
+ фРезультат.Вставить("--aws-sigv4", Истина);
+ фРезультат.Вставить("--retry", Истина);
+ фРезультат.Вставить("--retry-delay", Истина);
фРезультат.Вставить("-L", Ложь);
фРезультат.Вставить("--location", Ложь);
фРезультат.Вставить("--location-trusted", Ложь);
@@ -1369,6 +2302,11 @@
фРезультат.Вставить("-x", Истина);
фРезультат.Вставить("--proxy", Истина);
фРезультат.Вставить("--proxy-basic", Ложь);
+ фРезультат.Вставить("--connect-timeout", Истина);
+ фРезультат.Вставить("-E", Истина);
+ фРезультат.Вставить("--cert", Истина);
+ фРезультат.Вставить("--cert-type", Истина);
+ фРезультат.Вставить("--cacert", Истина);
Возврат фРезультат;
КонецФункции
@@ -1391,12 +2329,7 @@
Текст = Лев(Текст, СтрДлина(Текст) - 1);
КонецЕсли;
- Возврат Текст;
-КонецФункции
-
-&НаСервереБезКонтекста
-Функция КодированныйТекстВURL(Знач Текст)
- Возврат КодироватьСтроку(Текст, СпособКодированияСтроки.КодировкаURL);
+ Возврат СтрЗаменить(Текст, СтрШаблон("%1\%1%1", ОткрывающийСимвол), ОткрывающийСимвол);
КонецФункции
&НаКлиенте
@@ -1473,9 +2406,9 @@
Возврат;
КонецЕсли;
- ЧастиКоманды.ИдентификаторРесурса = ТекстБезКавычек(СтрСоединить(ЧастиТокена), ОткрывающийСимвол);
+ ЧастиКоманды.ИдентификаторРесурса = ТекстБезКавычек(СокрЛ(СтрСоединить(ЧастиТокена)), ОткрывающийСимвол);
Иначе
- Опция.Значение = ТекстБезКавычек(СтрСоединить(ЧастиТокена), ОткрывающийСимвол);
+ Опция.Значение = ТекстБезКавычек(СокрЛ(СтрСоединить(ЧастиТокена)), ОткрывающийСимвол);
ЧастиКоманды.Опции.Добавить(Опция);
Опция = Неопределено;
КонецЕсли;
@@ -1529,14 +2462,17 @@
&НаКлиенте
Функция НовыйОбъектДанныхCurl()
Возврат Новый Структура(
- "Схема, ТолькоЗаголовки, Заголовки, ПоляФормы, ПоляHTMLФормы, ПоляКакПараметры, Аутентификация, ИспользоватьРедиректы, КоличествоРедиректов, ПоддержкаСжатогоОтвета, ИмяФайлаТелаОтвета, ТолькоИмяФайла, НормализоватьИдентификаторРесурса, Прокси, BasicАутентификацияПрокси",
+ "Схема, ТолькоЗаголовки, Заголовки, ПоляФормы, ПоляHTMLФормы, ПоляКакПараметры, ПовторноеВыполнение, КлиентскийСертификат, Аутентификация, Таймаут, ИспользоватьРедиректы, КоличествоРедиректов, ПоддержкаСжатогоОтвета, ИмяФайлаТелаОтвета, ТолькоИмяФайла, НормализоватьИдентификаторРесурса, Прокси, BasicАутентификацияПрокси",
Неопределено,
Ложь,
Новый Массив,
Новый Массив,
Новый Массив,
Ложь,
- Новый Структура("Тип, Пользователь, Пароль, Токен", Элементы.ТипАутентификации.СписокВыбора[0], "", "", ""),
+ Новый Структура("Применить, Способ, НачальнаяДлительность, КоэфициентУвеличения, ПорогКоличестваПопыток, МаксимальнаяДлительность", Ложь, Элементы.СпособПовторногоВыполнения.СписокВыбора[0], -1, -1, -1, -1),
+ Новый Структура("Сертификат, Пароль, Тип, СертификатыУЦ", "", "", "", ""),
+ Новый Структура("Тип, Пользователь, Пароль, Токен, РегионAWS, СервисAWS", Элементы.ТипАутентификации.СписокВыбора[0], "", "", "", "", ""),
+ 0,
Ложь,
Неопределено,
Ложь,
@@ -1745,6 +2681,58 @@
ДанныеИмпорта.Аутентификация.Пароль = СтрСоединить(ЧастиПоля, ":");
КонецПроцедуры
+&НаКлиенте
+Процедура ОбработатьДанныеАутентификацииAWSCurl(ДанныеИмпорта, Знач Опция)
+ ЗначениеОпции = Опция.Значение;
+ Если НЕ ЗначениеЗаполнено(ЗначениеОпции) Тогда
+ Возврат;
+ КонецЕсли;
+
+ ЧастиЗначения = СтрРазделить(ЗначениеОпции, ":");
+ Если ЧастиЗначения.Количество() < 2 ИЛИ ЧастиЗначения[0] <> "aws" ИЛИ ЧастиЗначения[1] <> "amz" Тогда
+ Возврат;
+ КонецЕсли;
+
+ ДанныеИмпорта.Аутентификация.Тип = Элементы.ТипАутентификации.СписокВыбора[5];
+
+ Если ЧастиЗначения.Количество() > 2 Тогда
+ ДанныеИмпорта.Аутентификация.РегионAWS = ЧастиЗначения[2];
+ КонецЕсли;
+ Если ЧастиЗначения.Количество() > 3 Тогда
+ ДанныеИмпорта.Аутентификация.СервисAWS = ЧастиЗначения[3];
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ОбработатьПовторноеВыполнениеCurl(ДанныеИмпорта, Знач Опция)
+ ОписаниеТипаЧисло = Новый ОписаниеТипов("Число");
+ ПорогКоличестваПопыток = ОписаниеТипаЧисло.ПривестиЗначение(Опция.Значение);
+
+ ПВ = ДанныеИмпорта.ПовторноеВыполнение;
+ ПВ.ПорогКоличестваПопыток = ПорогКоличестваПопыток;
+ ПВ.Применить = ПорогКоличестваПопыток > 0;
+
+ Если ПВ.Способ <> Элементы.СпособПовторногоВыполнения.СписокВыбора[0] Тогда // Разово
+ Возврат;
+ КонецЕсли;
+
+ ПВ.Способ = Элементы.СпособПовторногоВыполнения.СписокВыбора[3]; // Экспоненциально
+ ПВ.НачальнаяДлительность = 1;
+ ПВ.КоэфициентУвеличения = 2;
+ ПВ.МаксимальнаяДлительность = Мин(КлиентHTTPПовтИсп.МаксимальноДопустимаяДлительностьПаузы(), Pow(2, ПорогКоличестваПопыток));
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ОбработатьЗадержкуПовторногоВыполненияCurl(ДанныеИмпорта, Знач Опция)
+ ОписаниеТипаЧисло = Новый ОписаниеТипов("Число");
+ НачальнаяДлительность = ОписаниеТипаЧисло.ПривестиЗначение(Опция.Значение);
+
+ ПВ = ДанныеИмпорта.ПовторноеВыполнение;
+ ПВ.Способ = Элементы.СпособПовторногоВыполнения.СписокВыбора[1]; // Фиксировано
+ ПВ.НачальнаяДлительность = НачальнаяДлительность;
+ ПВ.МаксимальнаяДлительность = Макс(600, НачальнаяДлительность);
+КонецПроцедуры
+
&НаКлиенте
Процедура ОбработатьДанныеПрокси(ДанныеИмпорта, Знач Опция, Отказ, ОписаниеОшибки)
ЗначениеОпции = Опция.Значение;
@@ -1768,15 +2756,18 @@
ПозицияРазделителя = ПозицияОкончанияАутентификации;
КонецЕсли;
- ЗакодированныеДанные = Новый Структура("Пользователь, Пароль");
- ЗакодированныеДанные.Пользователь = СокрЛП(Лев(ЗначениеОпции, ПозицияРазделителя - 1));
- ЗакодированныеДанные.Пароль = Прав(
+ ЗакодированныйПользователь = СокрЛП(Лев(ЗначениеОпции, ПозицияРазделителя - 1));
+ ЗакодированныйПароль = Прав(
Лев(ЗначениеОпции, ПозицияОкончанияАутентификации - 1),
ПозицияОкончанияАутентификации - ПозицияРазделителя - 1
);
- РаскодированныеДанные = РаскодированныеСтроки(ЗакодированныеДанные);
- Прокси.Пользователь = РаскодированныеДанные.Пользователь;
- Прокси.Пароль = РаскодированныеДанные.Пароль;
+ МножествоСтрок = Новый Соответствие;
+ МножествоСтрок.Вставить(ЗакодированныйПользователь);
+ МножествоСтрок.Вставить(ЗакодированныйПароль);
+
+ МножествоСтрок = РаскодированныеСтрокиURLвURL(МножествоСтрок);
+ Прокси.Пользователь = МножествоСтрок.Получить(ЗакодированныйПользователь);
+ Прокси.Пароль = МножествоСтрок.Получить(ЗакодированныйПароль);
КонецЕсли;
ПозицияОкончанияАутентификации = ПозицияОкончанияАутентификации + 1;
@@ -1800,6 +2791,22 @@
КонецЕсли;
КонецПроцедуры
+&НаКлиенте
+Процедура ОбработатьКлиентскийСертификат(ДанныеИмпорта, Знач Опция)
+ ЗначениеОпции = Опция.Значение;
+ Если НЕ ЗначениеЗаполнено(ЗначениеОпции) Тогда
+ Возврат;
+ КонецЕсли;
+
+ ЧастиЗначения = СтрРазделить(ЗначениеОпции, ":");
+ Сертификат = ЧастиЗначения[0];
+
+ ЧастиЗначения.Удалить(0);
+
+ ДанныеИмпорта.КлиентскийСертификат.Сертификат = Сертификат;
+ ДанныеИмпорта.КлиентскийСертификат.Пароль = СтрСоединить(ЧастиЗначения, ":");
+КонецПроцедуры
+
&НаКлиенте
Процедура ОбработатьОпциюCurl(ДанныеИмпорта, Знач ИдентификаторРесурсаИмпорт, Знач Опция, Отказ, ОписаниеОшибки)
ИмяОпции = Опция.Имя;
@@ -1830,10 +2837,19 @@
ИначеЕсли ИмяОпции = "--oauth2-bearer" Тогда
ДанныеИмпорта.Аутентификация.Тип = Элементы.ТипАутентификации.СписокВыбора[4];
ДанныеИмпорта.Аутентификация.Токен = Опция.Значение;
+ ИначеЕсли ИмяОпции = "--aws-sigv4" Тогда
+ ОбработатьДанныеАутентификацииAWSCurl(ДанныеИмпорта, Опция);
+ ИначеЕсли ИмяОпции = "--retry" Тогда
+ ОбработатьПовторноеВыполнениеCurl(ДанныеИмпорта, Опция);
+ ИначеЕсли ИмяОпции = "--retry-delay" Тогда
+ ОбработатьЗадержкуПовторногоВыполненияCurl(ДанныеИмпорта, Опция);
ИначеЕсли ИмяОпции = "-L" ИЛИ ИмяОпции = "--location" ИЛИ ИмяОпции = "--location-trusted" Тогда
ДанныеИмпорта.ИспользоватьРедиректы = Истина;
ИначеЕсли ИмяОпции = "--max-redirs" Тогда
ДанныеИмпорта.КоличествоРедиректов = Опция.Значение;
+ ИначеЕсли ИмяОпции = "--connect-timeout" Тогда
+ ОписаниеТипаЧисло = Новый ОписаниеТипов("Число");
+ ДанныеИмпорта.Таймаут = ОписаниеТипаЧисло.ПривестиЗначение(Опция.Значение);
ИначеЕсли ИмяОпции = "--path-as-is" Тогда
ДанныеИмпорта.НормализоватьИдентификаторРесурса = Ложь;
ИначеЕсли ИмяОпции = "-G" ИЛИ ИмяОпции = "--get" Тогда
@@ -1842,6 +2858,12 @@
ОбработатьДанныеПрокси(ДанныеИмпорта, Опция, Отказ, ОписаниеОшибки);
ИначеЕсли ИмяОпции = "--proxy-basic" Тогда
ДанныеИмпорта.BasicАутентификацияПрокси = Истина;
+ ИначеЕсли ИмяОпции = "-E" ИЛИ ИмяОпции = "--cert" Тогда
+ ОбработатьКлиентскийСертификат(ДанныеИмпорта, Опция);
+ ИначеЕсли ИмяОпции = "--cert-type" Тогда
+ ДанныеИмпорта.КлиентскийСертификат.Тип = Опция.Значение;
+ ИначеЕсли ИмяОпции = "--cacert" Тогда
+ ДанныеИмпорта.КлиентскийСертификат.СертификатыУЦ = Опция.Значение;
ИначеЕсли ИмяОпции = "-:" ИЛИ ИмяОпции = "--next" Тогда
Отказ = Истина;
ОписаниеОшибки = "команда с множественными запросами не допускается";
@@ -1903,59 +2925,6 @@
Возврат фРезультат;
КонецФункции
-&НаКлиенте
-Функция НормализованныйИдентификаторРесурса(Знач ИдентификаторРесурсаИмпорт, Отказ, ОписаниеОшибки)
- ПозицияПараметров = СтрНайти(ИдентификаторРесурсаИмпорт, "?");
- ПараметрыURI = ?(
- ПозицияПараметров = 0,
- "",
- Сред(ИдентификаторРесурсаИмпорт, ПозицияПараметров)
- );
-
- URL = ?(
- ПозицияПараметров = 0,
- ИдентификаторРесурсаИмпорт,
- Лев(ИдентификаторРесурсаИмпорт, ПозицияПараметров - 1)
- );
-
- Стек = Новый Массив;
- Для Каждого ЧастьURL Из СтрРазделить(URL, "/", Истина) Цикл
- Если ЧастьURL = ".." Тогда
- Если Стек.Количество() = 0 Тогда
- Отказ = Истина;
- ОписаниеОшибки = "не удалось нормализовать идентификатор ресурса";
- Возврат ИдентификаторРесурсаИмпорт;
- КонецЕсли;
-
- Стек.Удалить(Стек.ВГраница());
- Иначе
- Стек.Добавить(ЧастьURL);
- КонецЕсли;
- КонецЦикла;
-
- Возврат СтрСоединить(Стек, "/") + ПараметрыURI;
-КонецФункции
-
-&НаКлиенте
-Функция ИдентификаторРесурсаСПараметрамиИзТела(Знач ИдентификаторРесурсаИмпорт, Знач ПоляФормыHTML)
- ПозицияПараметров = СтрНайти(ИдентификаторРесурсаИмпорт, "?");
-
- ЧастиПараметров = Новый Массив;
- ЧастиПараметра = Новый Массив;
- Для Каждого Поле Из ПоляФормыHTML Цикл
- ЧастиПараметра.Очистить();
- ЧастиПараметра.Добавить(Поле.Ключ);
-
- Если Поле.Значение <> Неопределено Тогда
- ЧастиПараметра.Добавить(Поле.Значение);
- КонецЕсли;
-
- ЧастиПараметров.Добавить(СтрСоединить(ЧастиПараметра, "="));
- КонецЦикла;
-
- Возврат ИдентификаторРесурсаИмпорт + ?(ПозицияПараметров = 0, "?", "&") + СтрСоединить(ЧастиПараметров, "&");
-КонецФункции
-
&НаКлиенте
Асинх Процедура ПрочитатьКомандуCurl(СтрокаКоманды)
Отказ = Ложь;
@@ -2005,17 +2974,62 @@
КонецЕсли;
Если ДанныеИмпорта.Схема = Неопределено Тогда
- ДанныеИмпорта.Схема = Элементы.Схема.СписокВыбора[0].Значение; // GET
+ ДанныеИмпорта.Схема = Элементы.Схема.СписокВыбора[0]; // GET
КонецЕсли;
ИдентификаторРесурса = ЧастиКоманды.ИдентификаторРесурса;
Схема = ДанныеИмпорта.Схема;
- ТипАутентификации = ДанныеИмпорта.Аутентификация.Тип;
+ Если ДанныеИмпорта.ПовторноеВыполнение.Применить Тогда
+ ПВ = ДанныеИмпорта.ПовторноеВыполнение;
+ СпособПовторногоВыполнения = ПВ.Способ;
+ ДлительностьПаузыПовторногоВыполнения = ПВ.НачальнаяДлительность;
+ КоэффициентУвеличенияПаузыПовторногоВыполнения = ?(ПВ.КоэфициентУвеличения < 0, КоэффициентУвеличенияПаузыПовторногоВыполнения, ПВ.КоэфициентУвеличения);
+ ПорогКоличестваПопытокПовторногоВыполнения = ПВ.ПорогКоличестваПопыток;
+ МаксимальнаяДлительностьПаузыПовторногоВыполнения = ПВ.МаксимальнаяДлительность;
+
+ КодыСостоянияОтветаПовторногоВыполнения.Очистить();
+ КодыСостоянияОтветаПовторногоВыполнения.Добавить(КлиентHTTPПовтИсп.КодСостоянияТаймаутНаКлиенте());
+ КодыСостоянияОтветаПовторногоВыполнения.Добавить(КлиентHTTPПовтИсп.КодСостоянияСлишкомМногоЗапросов());
+ Иначе
+ СпособПовторногоВыполнения = Элементы.СпособПовторногоВыполнения.СписокВыбора[0];
+ КонецЕсли;
+
+ ТипАутентификации = ДанныеИмпорта.Аутентификация.Тип.Значение;
Если ТипАутентификации <> Элементы.ТипАутентификации.СписокВыбора[0].Значение Тогда
- ПользовательАутентификации = ДанныеИмпорта.Аутентификация.Пользователь;
- ПарольАутентификации = ДанныеИмпорта.Аутентификация.Пароль;
- ТокенАутентификации = ДанныеИмпорта.Аутентификация.Токен;
+ СписокТиповАутентификации = Элементы.ТипАутентификации.СписокВыбора;
+ Если ТипАутентификации = СписокТиповАутентификации[1].Значение // Basic
+ ИЛИ ТипАутентификации = СписокТиповАутентификации[2].Значение // NTLM
+ ИЛИ ТипАутентификации = СписокТиповАутентификации[3].Значение // Digest
+ Тогда
+ ПользовательАутентификации = ДанныеИмпорта.Аутентификация.Пользователь;
+ ПарольАутентификации = ДанныеИмпорта.Аутентификация.Пароль;
+ ИначеЕсли ТипАутентификации = СписокТиповАутентификации[4].Значение Тогда // Bearer
+ ТокенАутентификации = ДанныеИмпорта.Аутентификация.Токен;
+ ИначеЕсли ТипАутентификации = СписокТиповАутентификации[5].Значение Тогда // AWS4-HMAC-SHA256
+ AWSКлючДоступа = ДанныеИмпорта.Аутентификация.Пользователь;
+ AWSСекретныйКлюч = ДанныеИмпорта.Аутентификация.Пароль;
+ AWSРегион = ДанныеИмпорта.Аутентификация.РегионAWS;
+ AWSСервис = ДанныеИмпорта.Аутентификация.СервисAWS;
+ КонецЕсли;
+ КонецЕсли;
+
+ ДопустимыеТипыСертификата = Новый Соответствие;
+ ДопустимыеТипыСертификата.Вставить("", Истина);
+ ДопустимыеТипыСертификата.Вставить("PEM", Истина);
+ ДопустимыеТипыСертификата.Вставить("P12", Истина);
+ ДопустимыйТипСертификата = ДопустимыеТипыСертификата.Получить(ВРег(ДанныеИмпорта.КлиентскийСертификат.Тип));
+ Если НЕ ПустаяСтрока(ДанныеИмпорта.КлиентскийСертификат.Сертификат) Тогда
+ Если ДопустимыйТипСертификата = Неопределено Тогда
+ ИспользоватьСертификаты = Ложь;
+ СообщитьПользователю(СтрШаблон("Тип сертификата ""%1"" не поддерживается", ДанныеИмпорта.КлиентскийСертификат.Тип));
+ Иначе
+ ИспользоватьСертификаты = Истина;
+ ИмяФайлаКлиентскогоСертификата = ДанныеИмпорта.КлиентскийСертификат.Сертификат;
+ ПарольКлиентскогоСертификата = ДанныеИмпорта.КлиентскийСертификат.Пароль;
+ ИмяФайлаСертификатовУЦ = ДанныеИмпорта.КлиентскийСертификат.СертификатыУЦ;
+ ПарольФайлаСертификатовУЦ = "";
+ КонецЕсли;
КонецЕсли;
ЗаголовкиЗапроса.Очистить();
@@ -2040,6 +3054,8 @@
ТелоЗапросаФайл = ТелоЗапросаИмпорт.Значение;
КонецЕсли;
+ Таймаут = ДанныеИмпорта.Таймаут;
+
ИспользоватьСессию = ДанныеИмпорта.ИспользоватьРедиректы;
Если ДанныеИмпорта.ИспользоватьРедиректы Тогда
ПорогПеренаправлений = ?(
@@ -2062,16 +3078,71 @@
ИдентификаторРесурсаПриИзменении(Неопределено);
ТипАутентификацииПриИзменении(Неопределено);
ТипТелаЗапросаПриИзменении(Неопределено);
+ СпособПовторногоВыполненияПриИзменении(Неопределено);
+ ИспользоватьСертификатыПриИзменении(Неопределено);
ИспользоватьПроксиПриИзменении(Неопределено);
Элементы.ГруппаРазделы.ТекущаяСтраница = Элементы.РазделЗапрос;
КонецПроцедуры
+#КонецОбласти
+
+&НаКлиенте
+Функция НормализованныйИдентификаторРесурса(Знач ИдентификаторРесурсаИмпорт, Отказ, ОписаниеОшибки)
+ ПозицияПараметров = СтрНайти(ИдентификаторРесурсаИмпорт, "?");
+ ПараметрыURI = ?(
+ ПозицияПараметров = 0,
+ "",
+ Сред(ИдентификаторРесурсаИмпорт, ПозицияПараметров)
+ );
+
+ URL = ?(
+ ПозицияПараметров = 0,
+ ИдентификаторРесурсаИмпорт,
+ Лев(ИдентификаторРесурсаИмпорт, ПозицияПараметров - 1)
+ );
+
+ Стек = Новый Массив;
+ Для Каждого ЧастьURL Из СтрРазделить(URL, "/", Истина) Цикл
+ Если ЧастьURL = ".." Тогда
+ Если Стек.Количество() = 0 Тогда
+ Отказ = Истина;
+ ОписаниеОшибки = "не удалось нормализовать идентификатор ресурса";
+ Возврат ИдентификаторРесурсаИмпорт;
+ КонецЕсли;
+
+ Стек.Удалить(Стек.ВГраница());
+ Иначе
+ Стек.Добавить(ЧастьURL);
+ КонецЕсли;
+ КонецЦикла;
+
+ Возврат СтрСоединить(Стек, "/") + ПараметрыURI;
+КонецФункции
+
+&НаКлиенте
+Функция ИдентификаторРесурсаСПараметрамиИзТела(Знач ИдентификаторРесурсаИмпорт, Знач ПоляФормыHTML)
+ ПозицияПараметров = СтрНайти(ИдентификаторРесурсаИмпорт, "?");
+
+ ЧастиПараметров = Новый Массив;
+ ЧастиПараметра = Новый Массив;
+ Для Каждого Поле Из ПоляФормыHTML Цикл
+ ЧастиПараметра.Очистить();
+ ЧастиПараметра.Добавить(Поле.Ключ);
+
+ Если Поле.Значение <> Неопределено Тогда
+ ЧастиПараметра.Добавить(Поле.Значение);
+ КонецЕсли;
+
+ ЧастиПараметров.Добавить(СтрСоединить(ЧастиПараметра, "="));
+ КонецЦикла;
+
+ Возврат ИдентификаторРесурсаИмпорт + ?(ПозицияПараметров = 0, "?", "&") + СтрСоединить(ЧастиПараметров, "&");
+КонецФункции
&НаКлиенте
Функция ТипыMIMEКартинок()
фРезультат = Новый Соответствие;
фРезультат.Вставить(КлиентHTTPПовтИсп.ТипMIMEJPEG(), Истина);
- фРезультат.Вставить(КлиентHTTPПовтИсп.ТипMIMEJPEG(), Истина);
фРезультат.Вставить(КлиентHTTPПовтИсп.ТипMIMEPNG(), Истина);
фРезультат.Вставить(КлиентHTTPПовтИсп.ТипMIMEGIF(), Истина);
фРезультат.Вставить(КлиентHTTPПовтИсп.ТипыMIME().image.tiff, Истина);
@@ -2081,15 +3152,53 @@
Возврат фРезультат;
КонецФункции
+&НаКлиенте
+Функция ПараметрыОткрытияФормыКомандыCurl(Знач Текст)
+ Возврат Новый Структура("Текст, ЗаголовокФормы, ЦветРедактируемогоТекста", Текст, "Команда curl", WebЦвета.Серебряный);
+КонецФункции
+
&НаСервереБезКонтекста
-Функция РаскодированныеСтроки(Знач КоллекцияСтрок)
- Возврат КлиентHTTP.РаскодированныеСтроки(КоллекцияСтрок);
+Функция РазделительПутиСервера()
+ Возврат ПолучитьРазделительПутиСервера();
+КонецФункции
+
+&НаСервереБезКонтекста
+Функция КодированныйТекстВURL(Знач Текст)
+ Возврат КодироватьСтроку(Текст, СпособКодированияСтроки.КодировкаURL);
+КонецФункции
+
+&НаСервереБезКонтекста
+Функция КодированныйURIВURL(Знач URI)
+ Кодировано = КодироватьСтроку(URI, СпособКодированияСтроки.URLВКодировкеURL);
+ Позиция = СтрНайти(Кодировано, "?");
+ Если Позиция = 0 Тогда
+ Позиция = СтрДлина(Кодировано) + 1;
+ КонецЕсли;
+
+ Возврат РаскодироватьСтроку(
+ Лев(Кодировано, Позиция-1),
+ СпособКодированияСтроки.URLВКодировкеURL
+ ) + Сред(
+ Кодировано,
+ Позиция,
+ СтрДлина(Кодировано) - Позиция + 1
+ );
+КонецФункции
+
+&НаСервереБезКонтекста
+Функция РаскодированныеСтрокиURLвURL(Знач МножествоСтрок)
+ Возврат КлиентHTTP.РаскодированныеСтрокиURLвURL(МножествоСтрок);
КонецФункции
&НаКлиенте
-Процедура СообщитьПользователю(Знач Текст)
+Процедура СообщитьПользователю(Знач Текст, Знач Поле = Неопределено)
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = Текст;
+
+ Если Поле <> Неопределено Тогда
+ Сообщение.Поле = Поле;
+ КонецЕсли;
+
Сообщение.Сообщить();
КонецПроцедуры
@@ -2136,6 +3245,20 @@
КонецЕсли;
КонецПроцедуры
+&НаКлиенте
+Процедура ВыборФайлаКлиентсткогоСертификатаЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
+ Если ВыбранныеФайлы <> Неопределено Тогда
+ ИмяФайлаКлиентскогоСертификата = ВыбранныеФайлы[0];
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ВыборФайлаСертификатовУЦЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
+ Если ВыбранныеФайлы <> Неопределено Тогда
+ ИмяФайлаСертификатовУЦ = ВыбранныеФайлы[0];
+ КонецЕсли;
+КонецПроцедуры
+
&НаКлиенте
Процедура РедакторПараметраЗапросаЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
diff --git "a/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260\320\236\320\261\321\212\320\265\320\264\320\270\320\275\320\265\320\275\320\270\321\217\320\241\320\265\321\200\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\260\320\230\320\232\320\273\321\216\321\207\320\260.xml" "b/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260\320\236\320\261\321\212\320\265\320\264\320\270\320\275\320\265\320\275\320\270\321\217\320\241\320\265\321\200\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\260\320\230\320\232\320\273\321\216\321\207\320\260.xml"
new file mode 100644
index 0000000..6f7332a
--- /dev/null
+++ "b/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260\320\236\320\261\321\212\320\265\320\264\320\270\320\275\320\265\320\275\320\270\321\217\320\241\320\265\321\200\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\260\320\230\320\232\320\273\321\216\321\207\320\260.xml"
@@ -0,0 +1,22 @@
+
+
+
+
\ No newline at end of file
diff --git "a/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260\320\236\320\261\321\212\320\265\320\264\320\270\320\275\320\265\320\275\320\270\321\217\320\241\320\265\321\200\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\260\320\230\320\232\320\273\321\216\321\207\320\260/Ext/Form.xml" "b/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260\320\236\320\261\321\212\320\265\320\264\320\270\320\275\320\265\320\275\320\270\321\217\320\241\320\265\321\200\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\260\320\230\320\232\320\273\321\216\321\207\320\260/Ext/Form.xml"
new file mode 100644
index 0000000..8a15efa
--- /dev/null
+++ "b/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260\320\236\320\261\321\212\320\265\320\264\320\270\320\275\320\265\320\275\320\270\321\217\320\241\320\265\321\200\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\260\320\230\320\232\320\273\321\216\321\207\320\260/Ext/Form.xml"
@@ -0,0 +1,210 @@
+
+
\ No newline at end of file
diff --git "a/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260\320\236\320\261\321\212\320\265\320\264\320\270\320\275\320\265\320\275\320\270\321\217\320\241\320\265\321\200\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\260\320\230\320\232\320\273\321\216\321\207\320\260/Ext/Form/Module.bsl" "b/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260\320\236\320\261\321\212\320\265\320\264\320\270\320\275\320\265\320\275\320\270\321\217\320\241\320\265\321\200\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\260\320\230\320\232\320\273\321\216\321\207\320\260/Ext/Form/Module.bsl"
new file mode 100644
index 0000000..c09e528
--- /dev/null
+++ "b/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Forms/\320\244\320\276\321\200\320\274\320\260\320\236\320\261\321\212\320\265\320\264\320\270\320\275\320\265\320\275\320\270\321\217\320\241\320\265\321\200\321\202\320\270\321\204\320\270\320\272\320\260\321\202\320\260\320\230\320\232\320\273\321\216\321\207\320\260/Ext/Form/Module.bsl"
@@ -0,0 +1,132 @@
+
+// SPDX-License-Identifier: Apache-2.0+
+
+#Область ОбработчикиСобытийФормы
+&НаСервере
+Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
+ Сертификат = Параметры.Сертификат;
+КонецПроцедуры
+#КонецОбласти
+
+#Область ОбработчикиКомандФормы
+&НаКлиенте
+Асинх Процедура Объединить(Команда)
+ Если ПустаяСтрока(Сертификат) Тогда
+ СообщитьПользователю("Укажите путь к файлу сертификата", "Сертификат");
+ Возврат;
+ КонецЕсли;
+ Если ПустаяСтрока(Ключ) Тогда
+ СообщитьПользователю("Укажите путь к файлу ключа сертификата", "Ключ");
+ Возврат;
+ КонецЕсли;
+ Если ПустаяСтрока(Результат) Тогда
+ СообщитьПользователю("Укажите путь к файлу результата конкатенации", "Результат");
+ Возврат;
+ КонецЕсли;
+
+ РезультатОперации = Ждать КлиентHTTPСлужебный.ОбъединенныйФайлСертификатаИКлючаPEM(
+ Результат,
+ Новый Файл(Сертификат),
+ Новый Файл(Ключ),
+ ЗапретитьПерезапись
+ );
+ Если РезультатОперации.Ошибка Тогда
+ СообщитьПользователю(РезультатОперации.ОписаниеОшибки);
+ Возврат;
+ КонецЕсли;
+
+ Закрыть(Результат);
+КонецПроцедуры
+#КонецОбласти
+
+#Область ОбработчикиСобытийЭлементовФормы
+&НаКлиенте
+Процедура СертификатНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
+ СтандартнаяОбработка = Ложь;
+ Оповещение = Новый ОписаниеОповещения("ВыборФайлаСертификатаЗавершение", ЭтотОбъект);
+
+ ПоказатьДиалогВыбораФайла(Оповещение, "Выбор файла сертификата", "PEM (*.crt)|*.crt|PEM (*.pem)|*.pem|PEM (*.cer)|*.cer|Все файлы|*.*");
+КонецПроцедуры
+
+&НаКлиенте
+Процедура КлючНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
+ СтандартнаяОбработка = Ложь;
+ Оповещение = Новый ОписаниеОповещения("ВыборФайлаКлючаСертификатаЗавершение", ЭтотОбъект);
+
+ ПоказатьДиалогВыбораФайла(Оповещение, "Выбор файла ключа сертификата", "PEM (*.key)|*.key|PEM (*.pem)|*.pem|Все файлы|*.*");
+КонецПроцедуры
+
+&НаКлиенте
+Процедура РезультатНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
+ СтандартнаяОбработка = Ложь;
+ Оповещение = Новый ОписаниеОповещения("ВыборФайлаРезультатаЗавершение", ЭтотОбъект);
+
+ ПоказатьДиалогСохраненияФайла(Оповещение, "Выбор файла для создания", "PEM (*.crt)|*.crt|PEM (*.pem)|*.pem|PEM (*.cer)|*.cer|Все файлы|*.*");
+КонецПроцедуры
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+Процедура СообщитьПользователю(Знач Текст, Знач Поле = Неопределено)
+ Сообщение = Новый СообщениеПользователю;
+ Сообщение.Текст = Текст;
+
+ Если Поле <> Неопределено Тогда
+ Сообщение.Поле = Поле;
+ КонецЕсли;
+
+ Сообщение.Сообщить();
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПоказатьДиалогВыбораФайла(Знач Оповещение, Знач Заголовок = "Выбор файла", Знач Фильтр = Неопределено)
+ Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
+ Диалог.Заголовок = Заголовок;
+ Диалог.ПредварительныйПросмотр = Ложь;
+ Диалог.ПроверятьСуществованиеФайла = Истина;
+ Диалог.МножественныйВыбор = Ложь;
+
+ Если Фильтр <> Неопределено Тогда
+ Диалог.Фильтр = Фильтр;
+ КонецЕсли;
+
+ Диалог.Показать(Оповещение);
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПоказатьДиалогСохраненияФайла(Знач Оповещение, Знач Заголовок = "Выбор файла", Знач Фильтр = Неопределено)
+ Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
+ Диалог.Заголовок = Заголовок;
+ Диалог.ПредварительныйПросмотр = Ложь;
+ Диалог.ПроверятьСуществованиеФайла = Ложь;
+ Диалог.МножественныйВыбор = Ложь;
+
+ Если Фильтр <> Неопределено Тогда
+ Диалог.Фильтр = Фильтр;
+ КонецЕсли;
+
+ Диалог.Показать(Оповещение);
+КонецПроцедуры
+
+#Область ОБРАТНЫЕ_ВЫЗОВЫ
+&НаКлиенте
+Процедура ВыборФайлаСертификатаЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
+ Если ВыбранныеФайлы <> Неопределено Тогда
+ Сертификат = ВыбранныеФайлы[0];
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ВыборФайлаКлючаСертификатаЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
+ Если ВыбранныеФайлы <> Неопределено Тогда
+ Ключ = ВыбранныеФайлы[0];
+ КонецЕсли;
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ВыборФайлаРезультатаЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
+ Если ВыбранныеФайлы <> Неопределено Тогда
+ Результат = ВыбранныеФайлы[0];
+ КонецЕсли;
+КонецПроцедуры
+#КонецОбласти
+#КонецОбласти
diff --git "a/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Templates/MonacoEditor.xml" "b/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Templates/MonacoEditor.xml"
new file mode 100644
index 0000000..f271723
--- /dev/null
+++ "b/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Templates/MonacoEditor.xml"
@@ -0,0 +1,16 @@
+
+
+
+
+ MonacoEditor
+
+
+ ru
+ Monaco editor
+
+
+ Автор https://github.com/salexdv
+ BinaryData
+
+
+
\ No newline at end of file
diff --git "a/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Templates/MonacoEditor/Ext/Template.bin" "b/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Templates/MonacoEditor/Ext/Template.bin"
new file mode 100644
index 0000000..07faabf
Binary files /dev/null and "b/src/v2/DataProcessors/\320\232\320\276\320\275\321\201\320\276\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\260HTTP/Templates/MonacoEditor/Ext/Template.bin" differ