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 @@
РедакторCookies
ЭлементыИмпортаPostman
КонструкторИдентификатораРесурса
+
ФормаОбъединенияСертификатаИКлюча
\ 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 + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>/</v8:content> + </v8:item> + + + + АдресРесурса @@ -195,12 +210,6 @@ Top false - - - ru - / - - @@ -310,6 +319,52 @@ </InputField> </ChildItems> </UsualGroup> + <UsualGroup name="ГруппаФрагмент" id="47"> + <Title> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>фрагмент</v8:content> + </v8:item> + + AlwaysHorizontal + None + false + DontUse + + + + false + false + false + false + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>#</v8:content> + </v8:item> + + + + + + Фрагмент + None + + + ru + Фрагмент + + + false + + + + ФрагментПриИзменении + + + + @@ -422,6 +477,21 @@ + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Фрагмент</v8:content> + </v8:item> + + + 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 ПараметрыЗапроса <v8:item> @@ -561,115 +562,162 @@ </Table> </ChildItems> </Page> - <Page name="РазделАвторизация" id="125"> + <Page name="РазделАутентификация" id="125"> <Title> <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Авторизация</v8:content> + <v8:content>Аутентификация</v8:content> </v8:item> ru - Раздел авторизация + Раздел аутентификация - + - - ТипАвторизации + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Тип</v8:content> + <v8:content>Группа тип аутентификации</v8:content> </v8:item> - 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 + + + + ТипАутентификации + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тип</v8:content> + </v8:item> + + 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 <v8:item> @@ -679,30 +727,30 @@ false false - - + + - + false <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Группа пароль авторизации</v8:content> + <v8:content>Группа пароль аутентификации</v8:content> </v8:item> ru - Группа пароль авторизации + Группа пароль аутентификации AlwaysHorizontal None false - + - - ПарольАвторизации + + ПарольАутентификации <v8:item> <v8:lang>ru</v8:lang> @@ -712,42 +760,42 @@ <AutoMaxWidth>false</AutoMaxWidth> <VerticalStretch>false</VerticalStretch> <PasswordMode>true</PasswordMode> - <ContextMenu name="ПарольАвторизацииКонтекстноеМеню" id="134"/> - <ExtendedTooltip name="ПарольАвторизацииРасширеннаяПодсказка" id="135"/> + <ContextMenu name="ПарольАутентификацииКонтекстноеМеню" id="134"/> + <ExtendedTooltip name="ПарольАутентификацииРасширеннаяПодсказка" id="135"/> </InputField> - <Button name="ПоказатьПарольАвторизации" id="138"> + <Button name="ПоказатьПарольАутентификации" id="138"> <Type>UsualButton</Type> <Representation>Picture</Representation> - <CommandName>Form.Command.ПоказатьПарольАвторизации</CommandName> + <CommandName>Form.Command.ПоказатьПарольАутентификации</CommandName> <Picture> <xr:Ref>StdPicture.DataSearch</xr:Ref> <xr:LoadTransparent>true</xr:LoadTransparent> </Picture> - <ExtendedTooltip name="ПоказатьПарольАвторизацииРасширеннаяПодсказка" id="139"/> + <ExtendedTooltip name="ПоказатьПарольАутентификацииРасширеннаяПодсказка" id="139"/> </Button> </ChildItems> </UsualGroup> - <UsualGroup name="ГруппаТокенАвторизации" id="434"> + <UsualGroup name="ГруппаТокенАутентификации" id="434"> <Visible>false</Visible> <Title> <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Группа токен авторизации</v8:content> + <v8:content>Группа токен аутентификации</v8:content> </v8:item> ru - Группа токен авторизации + Группа токен аутентификации AlwaysHorizontal None false - + - - ТокенАвторизации + + ТокенАутентификации <v8:item> <v8:lang>ru</v8:lang> @@ -757,21 +805,264 @@ <AutoMaxWidth>false</AutoMaxWidth> <VerticalStretch>false</VerticalStretch> <PasswordMode>true</PasswordMode> - <ContextMenu name="ТокенАвторизацииКонтекстноеМеню" id="248"/> - <ExtendedTooltip name="ТокенАвторизацииРасширеннаяПодсказка" id="249"/> + <ContextMenu name="ТокенАутентификацииКонтекстноеМеню" id="248"/> + <ExtendedTooltip name="ТокенАутентификацииРасширеннаяПодсказка" id="249"/> + </InputField> + <Button name="ПоказатьТокенАутентификации" id="436"> + <Type>UsualButton</Type> + <Representation>Picture</Representation> + <CommandName>Form.Command.ПоказатьТокенАутентификации</CommandName> + <Picture> + <xr:Ref>StdPicture.DataSearch</xr:Ref> + <xr:LoadTransparent>true</xr:LoadTransparent> + </Picture> + <ExtendedTooltip name="ПоказатьТокенАутентификацииРасширеннаяПодсказка" id="437"/> + </Button> + </ChildItems> + </UsualGroup> + <InputField name="КлючДоступаAWS" id="451"> + <DataPath>AWSКлючДоступа</DataPath> + <Visible>false</Visible> + <Title> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Ключ доступа</v8:content> + </v8:item> + + false + true + false + + + + + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа секретный ключ AWS</v8:content> + </v8:item> + + + + ru + Группа секретный ключ AWS + + + AlwaysHorizontal + None + false + + + + AWSСекретныйКлюч + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Секретный ключ</v8:content> + </v8:item> + + false + true + false + true + + + + + + + + AWSРегион + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Регион</v8:content> + </v8:item> + + false + true + false + true + false + true + false + false + false + + + + + AWSСервис + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Сервис</v8:content> + </v8:item> + + false + true + false + + + ru + например, s3 + + + + + + + HawkИдентификатор + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Идентификатор</v8:content> + </v8:item> + + false + true + false + + + + + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа ключ hawk</v8:content> + </v8:item> + + + + ru + Группа ключ hawk + + + AlwaysHorizontal + None + false + + + + HawkКлюч + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Ключ</v8:content> + </v8:item> + + false + true + false + true + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Секретный ключ</v8:content> + </v8:item> + + - + + HawkДополнение + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>ext</v8:content> + </v8:item> + + false + true + false + + + ru + нарпимер, some-app-extra-data + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Специфические данные клиента</v8:content> + </v8:item> + + + + + HawkИдентификаторПриложения + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>app</v8:content> + </v8:item> + + false + true + false + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Идентификатор приложения</v8:content> + </v8:item> + + + + + HawkДелегирование + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>dlg</v8:content> + </v8:item> + + false + true + false + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Делегированный идентификатор приложения</v8:content> + </v8:item> + + + @@ -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 ЗаголовкиОтвета <v8:item> @@ -1715,7 +2010,7 @@ <Presentation> <v8:item> <v8:lang>ru</v8:lang> - <v8:content>HTML</v8:content> + <v8:content>Просмотр</v8:content> </v8:item> </Presentation> <Value xsi:type="xs:string">HTML</Value> @@ -1864,6 +2159,7 @@ <AutoMaxWidth>false</AutoMaxWidth> <AutoMaxHeight>false</AutoMaxHeight> <PictureSize>AutoSize</PictureSize> + <FileDragMode>AsFile</FileDragMode> <ContextMenu name="ОтветКартинкаКонтекстноеМеню" id="314"/> <ExtendedTooltip name="ОтветКартинкаРасширеннаяПодсказка" id="315"/> </PictureField> @@ -2053,6 +2349,7 @@ <v8:content>Группа контекст выполнения</v8:content> </v8:item> </ToolTip> + <Group>AlwaysHorizontal</Group> <Representation>None</Representation> <ShowTitle>false</ShowTitle> <ExtendedTooltip name="ГруппаКонтекстВыполненияРасширеннаяПодсказка" id="359"/> @@ -2113,8 +2410,24 @@ <ContextMenu name="СохранятьВИсториюКонтекстноеМеню" id="439"/> <ExtendedTooltip name="СохранятьВИсториюРасширеннаяПодсказка" id="440"/> </CheckBoxField> - <UsualGroup name="ГруппаФайлТелаОтвета" id="237"> - <Title> + <CheckBoxField name="ОтображатьСекреты" id="548"> + <DataPath>ОтображатьСекреты</DataPath> + <ToolTipRepresentation>Button</ToolTipRepresentation> + <CheckBoxType>Auto</CheckBoxType> + <ContextMenu name="ОтображатьСекретыКонтекстноеМеню" id="549"/> + <ExtendedTooltip name="ОтображатьСекретыРасширеннаяПодсказка" id="550"> + <Title formatted="false"> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Режим отображения секретов в результатах кодогенерации и экспорта в команду curl. + +Если опция отключена, отображение секретов регулируется индивидуально интерфейсными кнопками для каждого поля с секретом.</v8:content> + </v8:item> + + + + + <v8:item> <v8:lang>ru</v8:lang> <v8:content>Группа файл тела ответа</v8:content> @@ -2126,6 +2439,7 @@ <v8:content>Группа файл тела ответа</v8:content> </v8:item> </ToolTip> + <Group>AlwaysHorizontal</Group> <Representation>None</Representation> <ShowTitle>false</ShowTitle> <ExtendedTooltip name="ГруппаФайлТелаОтветаРасширеннаяПодсказка" id="238"/> @@ -2149,9 +2463,13 @@ </v8:item> + + ТелоОтветаВФайлПриИзменении + ИмяФайлаТелаОтвета + false <v8:item> <v8:lang>ru</v8:lang> @@ -2168,7 +2486,6 @@ <ContextMenu name="ИмяФайлаТелаОтветаКонтекстноеМеню" id="235"/> <ExtendedTooltip name="ИмяФайлаТелаОтветаРасширеннаяПодсказка" id="236"/> <Events> - <Event name="OnChange">ИмяФайлаТелаОтветаПриИзменении</Event> <Event name="StartChoice">ИмяФайлаТелаОтветаНачалоВыбора</Event> </Events> </InputField> @@ -2194,6 +2511,59 @@ + + АгентПользователя + + + ru + Пользовательское значение заголовка "User-Agent" + + + Button + false + true + false + false + false + true + false + false + false + + + ru + значение платформы по умолчанию + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Пользовательское значение заголовка "User-Agent"</v8:content> + </v8:item> + + + + + Таймаут + + + ru + Таймаут соединения в секундах + + + Button + true + + + ru + ЧН= + + + + + <v8:item> @@ -2271,6 +2641,19 @@ <ContextMenu name="ПорогПеренаправленийКонтекстноеМеню" id="210"/> <ExtendedTooltip name="ПорогПеренаправленийРасширеннаяПодсказка" id="211"/> </InputField> + <CheckBoxField name="ПеренаправлениеКакGET" id="489"> + <DataPath>ПеренаправлениеКакGET</DataPath> + <ToolTip> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Принудительно переключаться на метод GET для кодов перенаправления 301 и 302</v8:content> + </v8:item> + </ToolTip> + <ToolTipRepresentation>Button</ToolTipRepresentation> + <CheckBoxType>Auto</CheckBoxType> + <ContextMenu name="ПеренаправлениеКакGETКонтекстноеМеню" id="490"/> + <ExtendedTooltip name="ПеренаправлениеКакGETРасширеннаяПодсказка" id="491"/> + </CheckBoxField> <CheckBoxField name="ПоддержкаCookie" id="212"> <DataPath>ПоддержкаCookie</DataPath> <Title> @@ -2297,172 +2680,720 @@ </UsualGroup> </ChildItems> </UsualGroup> - <UsualGroup name="ГруппаПрокси" id="329"> + <UsualGroup name="ГруппаПовторноеВыполнение" id="495"> <Title> <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Прокси</v8:content> + <v8:content>Повторное выполнение</v8:content> </v8:item> ru - Группа прокси + Повторять попытки выполнить HTTP-запрос после неуспешного результата. + +Неуспешным считается вызов исключения и ответ с кодом состояния 5хх или каким-либо из определённых пользователем. + Button Vertical - NormalSeparation - + - - ИспользоватьПрокси + + СпособПовторногоВыполнения <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Использовать</v8:content> + <v8:content>Способ</v8:content> </v8:item> ru - Использовать прокси-сервер для выполнения запроса + Способ расчёта паузы перед повторным выполнением Button - Auto - - + true + false + false + false + false + false + true + false + + + + 0 + + + + ru + Разово + + + Разово + + + + + 0 + + + + ru + Фиксировано + + + Фиксировано + + + + + 0 + + + + ru + Линейно + + + Линейно + + + + + 0 + + + + ru + Экспоненциально + + + Экспоненциально + + + + + - ИспользоватьПроксиПриИзменении + СпособПовторногоВыполненияПриИзменении - - - НеИспользоватьПроксиДляЛокальныхАдресов + + false <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Кроме локальных адресов</v8:content> + <v8:content>Группа параметры повторного выполнения</v8:content> </v8:item> ru - Если опция включена, то при запросе ресурсов с локальных адресов прокси не используется + Группа параметры повторного выполнения - Button - Auto - - - - - СерверПрокси - false - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Сервер</v8:content> - </v8:item> - - true - - - - - ПортПрокси - false + Vertical + None + false + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа параметры длительности паузы</v8:content> + </v8:item> + + + + ru + Группа параметры длительности паузы + + + AlwaysHorizontal + None + false + + + + ДлительностьПаузыПовторногоВыполнения + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Длительность</v8:content> + </v8:item> + + + + ru + Длительность в секундах паузы после первой попытки выполнения HTTP-запроса + + + Button + + + + + МаксимальнаяДлительностьПаузыПовторногоВыполнения + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>в пределе до</v8:content> + </v8:item> + + + + ru + Максимальная длительность в секундах паузы между попытками в секундах (ограничение фреймворка 3600) + + + Button + + + + + КоэффициентУвеличенияПаузыПовторногоВыполнения + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Коэффициент</v8:content> + </v8:item> + + + + ru + Коэффициент увеличения паузы между попытками выполнить HTTP-запрос + + + Button + + + + + ПорогКоличестваПопытокПовторногоВыполнения + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Количество попыток</v8:content> + </v8:item> + + + + ru + Максимальное количество неуспешных попыток выполнить HTTP-запрос + + + Button + 1 + + + + + + + КодыСостоянияОтветаПовторногоВыполнения + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Коды состояния ответа</v8:content> + </v8:item> + + + + ru + коды состояния ответа, при получении которых необходимо повторять попытки + + + Button + false + false + false + true + true + false + false + false + 999 + 100 + 599 + + + + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>SSL сертификаты</v8:content> + </v8:item> + + + + ru + Группа сертификаты + + + Vertical + + + + ИспользоватьСертификаты <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Порт</v8:content> + <v8:content>Использовать</v8:content> </v8:item> - - - - - ПользовательПрокси - false - + <ToolTip> <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Пользователь</v8:content> + <v8:content>Использовать клиентский сертификат OpenSSL для выполнения запроса</v8:content> </v8:item> - - false - - - - + + Button + Auto + + + + ИспользоватьСертификатыПриИзменении + + + false <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Группа пароль прокси</v8:content> + <v8:content>Группа клиентский сертификат</v8:content> </v8:item> ru - Группа пароль прокси + Группа клиентский сертификат + true + false AlwaysHorizontal None false - + - - ПарольПрокси + + ИмяФайлаКлиентскогоСертификата <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Пароль</v8:content> + <v8:content>Файл клиентского сертификата</v8:content> </v8:item> + Button false - true - - + false + true + false + false + true + false + false + false + false + false + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Путь к файлу клиентского сертификата OpenSSL. Допустимо применение форматов PEM и PKCS#12. + +Если требуется передавать два файла - сертификат и его ключ - можно получить конкатенацию этих файлов и передать получившийся единый файл как сертификат. Воспользуйтесь кнопкой "Объединить сертификат и ключ"</v8:content> + </v8:item> + + + + ИмяФайлаКлиентскогоСертификатаНачалоВыбора + - - - ИспользоватьАутентификациюОСПрокси + false <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Аутентификация ОС</v8:content> + <v8:content>Группа пароль клиентского сертификата</v8:content> </v8:item> ru - Использовать аутентификацию ОС для осуществления NTLM-аутентификации на прокси. Если опция выключена, то будет выполнена Basic-аутентификация + Группа пароль клиентского сертификата - Button - Auto - - - - - - - - + AlwaysHorizontal + None + false + + + + ПарольКлиентскогоСертификата + false + false + true + false + true + + + + + + + + ИмяФайлаСертификатовУЦ + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Файл сертификатов УЦ</v8:content> + </v8:item> + + + + ru + Путь к файлу сертификатов удостоверяющих центров OpenSSL, загружаемые из системного хранилища сертификатов операционной системы. Допустимо применение форматов PEM и PKCS#12. + + + Button + false + false + true + false + false + true + false + false + false + false + false + + + + ИмяФайлаСертификатовУЦНачалоВыбора + + + + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа пароль файла сертификатов УЦ</v8:content> + </v8:item> + + + + ru + Группа пароль файла сертификатов УЦ + + + AlwaysHorizontal + None + false + + + + ПарольФайлаСертификатовУЦ + false + false + true + false + true + + + + + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Прокси</v8:content> + </v8:item> + + + + ru + Группа прокси + + + Vertical + NormalSeparation + + + + ИспользоватьПрокси + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Использовать</v8:content> + </v8:item> + + + + ru + Использовать прокси-сервер для выполнения запроса + + + Button + Auto + + + + ИспользоватьПроксиПриИзменении + + + + НеИспользоватьПроксиДляЛокальныхАдресов + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Кроме локальных адресов</v8:content> + </v8:item> + + + + ru + Если опция включена, то при запросе ресурсов с локальных адресов прокси не используется + + + Button + Auto + + + + + false + + + ru + Сервер прокси + + + AlwaysHorizontal + None + false + + + + ПротоколПрокси + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Сервер</v8:content> + </v8:item> + + + + ru + Протокол прокси + + + false + false + true + false + false + false + false + false + false + + + + 0 + + + + ru + https + + + https + + + + + 0 + + + + ru + http + + + http + + + + + + + + СерверПрокси + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Сервер</v8:content> + </v8:item> + + None + + + ru + Сервер прокси + + + false + false + false + true + + + + + + + ПортПрокси + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Порт</v8:content> + </v8:item> + + + + + + ПользовательПрокси + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Пользователь</v8:content> + </v8:item> + + false + + + + + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа пароль прокси</v8:content> + </v8:item> + + + + ru + Группа пароль прокси + + + AlwaysHorizontal + None + false + + + + ПарольПрокси + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Пароль</v8:content> + </v8:item> + + false + true + + + + + + + + ИспользоватьАутентификациюОСПрокси + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Аутентификация ОС</v8:content> + </v8:item> + + + + ru + Использовать аутентификацию ОС для осуществления NTLM-аутентификации на прокси. Если опция выключена, то будет выполнена Basic-аутентификация + + + Button + Auto + + + + + + + + @@ -2542,6 +3473,7 @@ <AutoMaxRowsCount>false</AutoMaxRowsCount> <AutoInsertNewRow>true</AutoInsertNewRow> <EnableStartDrag>true</EnableStartDrag> + <FileDragMode>AsFile</FileDragMode> <DataPath>История</DataPath> <CommandSet> <ExcludedCommand>Add</ExcludedCommand> @@ -2709,55 +3641,220 @@ <Attributes> <Attribute name="Объект" id="1"> <Type> - <v8:Type>cfg:DataProcessorObject.КонсольКлиентаHTTP</v8:Type> + <v8:Type>cfg:DataProcessorObject.КонсольКлиентаHTTP</v8:Type> + </Type> + <MainAttribute>true</MainAttribute> + </Attribute> + <Attribute name="ИдентификаторРесурса" id="2"> + <Title> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Идентификатор ресурса</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Параметры запроса</v8:content> + </v8:item> + + + v8:ValueTable + + + ПараметрыЗапроса.Значение + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Имя</v8:content> + </v8:item> + + + xs:string + + 100 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Значение</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Активно</v8:content> + </v8:item> + + + xs:boolean + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Ответ текст</v8:content> + </v8:item> + + + fd:FormattedDocument + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Код состояния</v8:content> + </v8:item> + + + xs:decimal + + 3 + 0 + Nonnegative + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Заголовки ответа</v8:content> + </v8:item> + + + v8:ValueTable + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Ключ</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Значение</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Значение заголовка ответа</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + - true - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Идентификатор ресурса</v8:content> + <v8:content>Схема</v8:content> </v8:item> xs:string - 0 + 8 Variable - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Параметры запроса</v8:content> + <v8:content>Заголовки запроса</v8:content> </v8:item> v8:ValueTable - - ПараметрыЗапроса.Значение - - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Имя</v8:content> + <v8:content>Активно</v8:content> + </v8:item> + + + xs:boolean + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Ключ</v8:content> </v8:item> xs:string - 100 + 0 Variable - + <v8:item> <v8:lang>ru</v8:lang> @@ -2772,7 +3869,110 @@ </v8:StringQualifiers> </Type> </Column> - <Column name="Активно" id="3"> + </Columns> + </Attribute> + <Attribute name="ТипАутентификации" id="11"> + <Title> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тип аутентификации</v8:content> + </v8:item> + + + xs:string + + 25 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Пользователь аутентификации</v8:content> + </v8:item> + + + xs:string + + 100 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Пароль аутентификации</v8:content> + </v8:item> + + + xs:string + + 255 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тело запроса текст</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тип тела запроса</v8:content> + </v8:item> + + + xs:string + + 100 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тип тела запроса как есть</v8:content> + </v8:item> + + + xs:string + + 10 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тело запроса данные формы</v8:content> + </v8:item> + + + v8:ValueTable + + + <v8:item> <v8:lang>ru</v8:lang> @@ -2783,83 +3983,187 @@ <v8:Type>xs:boolean</v8:Type> </Type> </Column> + <Column name="Тип" id="2"> + <Title> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тип</v8:content> + </v8:item> + + + xs:string + + 10 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Ключ</v8:content> + </v8:item> + + + xs:string + + 1000 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Значение</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + - + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тело запроса файл</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Разделитель</v8:content> + </v8:item> + + + xs:string + + 1000 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Дополнительно</v8:content> + </v8:item> + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Имя файла тела</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Ответ текст</v8:content> + <v8:content>Использовать сессию</v8:content> </v8:item> - fd:FormattedDocument + xs:boolean - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Код состояния</v8:content> + <v8:content>Количество</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Порог перенаправлений</v8:content> </v8:item> xs:decimal - 3 + 2 0 Nonnegative - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Заголовки ответа</v8:content> + <v8:content>Поддержка cookie</v8:content> </v8:item> - v8:ValueTable + xs:boolean - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Ключ</v8:content> - </v8:item> - - - xs:string - - 0 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Значение</v8:content> - </v8:item> - - - xs:string - - 0 - Variable - - - - - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Значение заголовка ответа</v8:content> + <v8:content>Поддержка сжатого ответа</v8:content> + </v8:item> + + + xs:boolean + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тело ответа в файл</v8:content> + </v8:item> + + + xs:boolean + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Имя файла тела ответа</v8:content> </v8:item> @@ -2870,26 +4174,26 @@ - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Схема</v8:content> + <v8:content>Токен аутентификации</v8:content> </v8:item> xs:string - 8 + 255 Variable - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Заголовки запроса</v8:content> + <v8:content>Тело запроса данные HTMLФормы</v8:content> </v8:item> @@ -2917,7 +4221,7 @@ xs:string - 0 + 1000 Variable @@ -2939,26 +4243,26 @@ - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Тип авторизации</v8:content> + <v8:content>Ответ картинка</v8:content> </v8:item> xs:string - 25 + 0 Variable - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Пользователь авторизации</v8:content> + <v8:content>Формат тела ответа</v8:content> </v8:item> @@ -2969,26 +4273,95 @@ - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Пароль авторизации</v8:content> + <v8:content>Ответ HTML</v8:content> </v8:item> xs:string - 255 + 0 Variable - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Тело запроса текст</v8:content> + <v8:content>Ответ JSON</v8:content> + </v8:item> + + + fd:FormattedDocument + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Время выполнения</v8:content> + </v8:item> + + + xs:decimal + + 15 + 2 + Nonnegative + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Размер ответа</v8:content> + </v8:item> + + + xs:decimal + + 15 + 2 + Nonnegative + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Разделы консоли</v8:content> + </v8:item> + + + xs:string + + 100 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Использовать прокси</v8:content> + </v8:item> + + + xs:boolean + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Сервер прокси</v8:content> </v8:item> @@ -2999,93 +4372,192 @@ - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Тип тела запроса</v8:content> + <v8:content>Порт прокси</v8:content> + </v8:item> + + + xs:decimal + + 5 + 0 + Nonnegative + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Пользователь прокси</v8:content> </v8:item> xs:string - 100 + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Пароль прокси</v8:content> + </v8:item> + + + xs:string + + 0 Variable - + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Использовать аутентификацию ОСПрокси</v8:content> + </v8:item> + + + xs:boolean + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Не использовать прокси для локальных адресов</v8:content> + </v8:item> + + + xs:boolean + + + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Тип тела запроса как есть</v8:content> + <v8:content>Выполнять на сервере</v8:content> </v8:item> - xs:string - - 10 - Variable - + xs:boolean - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Тело запроса данные формы</v8:content> + <v8:content>История</v8:content> </v8:item> v8:ValueTable - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Активно</v8:content> + <v8:content>Временная метка</v8:content> </v8:item> - xs:boolean + xs:decimal + + 15 + 0 + Nonnegative + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Тип</v8:content> + <v8:content>Дата</v8:content> + </v8:item> + + + xs:dateTime + + DateTime + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Код состояния</v8:content> + </v8:item> + + + xs:decimal + + 3 + 0 + Nonnegative + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Схема</v8:content> </v8:item> xs:string - 10 + 8 Variable - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Ключ</v8:content> + <v8:content>Протокол</v8:content> </v8:item> xs:string - 1000 + 5 Variable - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Значение</v8:content> + <v8:content>Хост</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>URN</v8:content> </v8:item> @@ -3096,142 +4568,114 @@ + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Контекст выполнения</v8:content> + </v8:item> + + + xs:string + + 10 + Variable + + + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Тело запроса файл</v8:content> + <v8:content>Сохранять в историю</v8:content> </v8:item> - xs:string - - 0 - Variable - + xs:boolean - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Разделитель</v8:content> + <v8:content>Протокол прокси</v8:content> </v8:item> xs:string - 1000 + 5 Variable - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Дополнительно</v8:content> - </v8:item> - - - - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Имя файла тела</v8:content> + <v8:content>Регион AWS</v8:content> </v8:item> xs:string - 0 + 100 Variable - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Использовать сессию</v8:content> - </v8:item> - - - xs:boolean - - - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Количество</v8:content> + <v8:content>Секретный ключ AWS</v8:content> </v8:item> xs:string - 0 + 1000 Variable - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Порог перенаправлений</v8:content> - </v8:item> - - - xs:decimal - - 2 - 0 - Nonnegative - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Поддержка cookie</v8:content> - </v8:item> - - - xs:boolean - - - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Поддержка сжатого ответа</v8:content> + <v8:content>Сервис AWS</v8:content> </v8:item> - xs:boolean + xs:string + + 100 + Variable + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Тело ответа в файл</v8:content> + <v8:content>Ключ доступа AWS</v8:content> </v8:item> - xs:boolean + xs:string + + 1000 + Variable + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Имя файла тела ответа</v8:content> + <v8:content>Ключ Hawk</v8:content> </v8:item> @@ -3242,80 +4686,41 @@ - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Токен авторизации</v8:content> + <v8:content>Идентификатор Hawk</v8:content> </v8:item> xs:string - 255 + 0 Variable - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Тело запроса данные HTMLФормы</v8:content> + <v8:content>Дополнительные данные Hawk</v8:content> </v8:item> - v8:ValueTable + xs:string + + 0 + Variable + - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Активно</v8:content> - </v8:item> - - - xs:boolean - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Ключ</v8:content> - </v8:item> - - - xs:string - - 1000 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Значение</v8:content> - </v8:item> - - - xs:string - - 0 - Variable - - - - - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Ответ картинка</v8:content> + <v8:content>Идентификатор приложения Hawk</v8:content> </v8:item> @@ -3326,26 +4731,26 @@ - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Формат тела ответа</v8:content> + <v8:content>Делегирование Hawk</v8:content> </v8:item> xs:string - 100 + 0 Variable - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Ответ HTML</v8:content> + <v8:content>Агент пользователя</v8:content> </v8:item> @@ -3356,126 +4761,140 @@ - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Ответ JSON</v8:content> + <v8:content>Перенаправление как GET</v8:content> </v8:item> - fd:FormattedDocument + xs:boolean - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Время выполнения</v8:content> + <v8:content>Таймаут</v8:content> </v8:item> xs:decimal - 15 - 2 + 3 + 0 Nonnegative - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Размер ответа</v8:content> + <v8:content>Длительность паузы повторного выполнения</v8:content> </v8:item> xs:decimal - 15 - 2 + 4 + 0 Nonnegative - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Разделы консоли</v8:content> + <v8:content>Коды состояния ответа повторного выполнения</v8:content> </v8:item> - xs:string - - 100 - Variable - + v8:ValueListType + + КодыСостоянияОтветаПовторногоВыполнения.Picture + КодыСостоянияОтветаПовторногоВыполнения.ValueType + + + xs:decimal + + 10 + 0 + Any + + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Использовать прокси</v8:content> + <v8:content>Коэффициент увеличения паузы повторного выполнения</v8:content> </v8:item> - xs:boolean + xs:decimal + + 4 + 0 + Nonnegative + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Сервер прокси</v8:content> + <v8:content>Максимальная длительность паузы повторного выполнения</v8:content> </v8:item> - xs:string - - 0 - Variable - + xs:decimal + + 4 + 0 + Nonnegative + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Порт прокси</v8:content> + <v8:content>Порог количества попыток повторного выполнения</v8:content> </v8:item> xs:decimal - 5 + 2 0 Nonnegative - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Пользователь прокси</v8:content> + <v8:content>Способ повторного выполнения</v8:content> </v8:item> xs:string - 0 + 100 Variable - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Пароль прокси</v8:content> + <v8:content>Имя файла сертификатов УЦ</v8:content> </v8:item> @@ -3486,178 +4905,68 @@ - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Использовать аутентификацию ОСПрокси</v8:content> + <v8:content>Имя файла клиентского сертификата</v8:content> </v8:item> - xs:boolean + xs:string + + 0 + Variable + + ShowError - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Не использовать прокси для локальных адресов</v8:content> + <v8:content>Использовать сертификаты</v8:content> </v8:item> xs:boolean - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Выполнять на сервере</v8:content> + <v8:content>Пароль клиентского сертификата</v8:content> </v8:item> - xs:boolean + xs:string + + 0 + Variable + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>История</v8:content> + <v8:content>Пароль файла сертификатов УЦ</v8:content> </v8:item> - v8:ValueTable + xs:string + + 0 + Variable + - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Временная метка</v8:content> - </v8:item> - - - xs:decimal - - 15 - 0 - Nonnegative - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Дата</v8:content> - </v8:item> - - - xs:dateTime - - DateTime - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Код состояния</v8:content> - </v8:item> - - - xs:decimal - - 3 - 0 - Nonnegative - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Схема</v8:content> - </v8:item> - - - xs:string - - 8 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Протокол</v8:content> - </v8:item> - - - xs:string - - 5 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Хост</v8:content> - </v8:item> - - - xs:string - - 0 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>URN</v8:content> - </v8:item> - - - xs:string - - 0 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Контекст выполнения</v8:content> - </v8:item> - - - xs:string - - 10 - Variable - - - - - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Сохранять в историю</v8:content> + <v8:content>Отображать секреты</v8:content> </v8:item> @@ -3880,20 +5189,20 @@ F7 ВыполнитьЗапрос - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Показать пароль авторизации</v8:content> + <v8:content>Показать пароль аутентификации</v8:content> </v8:item> ru - Показать пароль авторизации + Показать пароль аутентификации - ПоказатьПарольАвторизации + ПоказатьПарольАутентификации @@ -4096,20 +5405,95 @@ </ToolTip> <Action>ПоказатьПарольПрокси</Action> </Command> - <Command name="ПоказатьТокенАвторизации" id="16"> + <Command name="ПоказатьТокенАутентификации" id="16"> + <Title> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Показать токен аутентификации</v8:content> + </v8:item> + + + + ru + Показать токен аутентификации + + + ПоказатьТокенАутентификации + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Показать секретный ключ</v8:content> + </v8:item> + + + + ru + Показать секретный ключ + + + ПоказатьСекретныйКлючAWS + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Показать ключ</v8:content> + </v8:item> + + + + ru + Показать ключ hawk + + + ПоказатьКлючHawk + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Показать пароль клиентского сертификата</v8:content> + </v8:item> + + + + ru + Показать пароль клиентского сертификата + + + ПоказатьПарольКлиентскогоСертификата + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Показать пароль файла сертификатов УЦ</v8:content> + </v8:item> + + + + ru + Показать пароль файла сертификатов УЦ + + + ПоказатьПарольФайлаСертификатовУЦ + + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Показать токен авторизации</v8:content> + <v8:content>Объединить сертификат и ключ</v8:content> </v8:item> 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 @@ + + +
+ + ФормаОбъединенияСертификатаИКлюча + + + ru + Форма объединения сертификата и ключа + + + + Managed + false + + PlatformApplication + MobilePlatformApplication + + + +
+
\ 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 @@ + +
+ + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Объединение сертификата и ключа в один файл</v8:content> + </v8:item> + + false + + + + + + + ПриСозданииНаСервере + + + + Сертификат + + + ru + Путь к файлу сертификата формата PEM + + + 50 + false + false + true + false + false + true + false + false + false + false + false + + + + СертификатНачалоВыбора + + + + Ключ + + + ru + Путь к файлу ключа сертификата формата PEM + + + 50 + false + false + true + false + false + true + false + false + false + false + false + + + + КлючНачалоВыбора + + + + ЗапретитьПерезапись + + + ru + Режим запрета на действие при существовании файла по указанному пути результата + + + Auto + + + + + Результат + + + ru + Путь к объединяющему сертификат и ключ файлу + + + 50 + false + false + true + false + false + true + false + false + false + false + false + + + + РезультатНачалоВыбора + + + + + + + cfg:DataProcessorObject.КонсольКлиентаHTTP + + true + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Сертификат</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + ShowError + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Ключ</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + ShowError + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Результат</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + ShowError + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Запретить перезапись</v8:content> + </v8:item> + + + xs:boolean + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Объединить</v8:content> + </v8:item> + + + + ru + Объединить + + + Объединить + + + + + + xs:string + + 0 + Variable + + + + +
\ 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 @@
РедакторCookies
ЭлементыИмпортаPostman
КонструкторИдентификатораРесурса
+
ФормаОбъединенияСертификатаИКлюча
+ \ 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 + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>/</v8:content> + </v8:item> + + + + АдресРесурса @@ -198,12 +213,6 @@ Top false - - - ru - / - - @@ -314,6 +323,53 @@ </InputField> </ChildItems> </UsualGroup> + <UsualGroup name="ГруппаФрагмент" id="92"> + <Title> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>фрагмент</v8:content> + </v8:item> + + AlwaysHorizontal + Usual + None + false + DontUse + + + + false + false + false + false + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>#</v8:content> + </v8:item> + + + + + + Фрагмент + None + + + ru + Фрагмент + + + false + + + + ФрагментПриИзменении + + + + @@ -468,6 +524,9 @@ Top + false + true + false true @@ -542,6 +601,52 @@ + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Фрагмент</v8:content> + </v8:item> + + + + ru + Группа фрагмент МП + + + AlwaysHorizontal + Usual + None + false + DontUse + + + + Фрагмент + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>фрагмент:</v8:content> + </v8:item> + + Top + false + true + false + + + ru + # + + + + + + ФрагментМППриИзменении + + + + <v8:item> @@ -711,6 +816,21 @@ </v8:StringQualifiers> </Type> </Attribute> + <Attribute name="Фрагмент" id="9"> + <Title> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Фрагмент</v8:content> + </v8:item> + + + 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 - - - + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Основная</v8:content> + </v8:item> + + + + ru + Основная + + + None + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Страница редактируемый текст</v8:content> + </v8:item> + + + + ru + Страница редактируемый текст + + + + + + РедактируемыйТекст + None + false + false + true + true + true + true + + + + РедактируемыйТекстИзменениеТекстаРедактирования + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Страница форматированный текст</v8:content> + </v8:item> + + + + ru + Страница форматированный текст + + + + + + ТекстMonaco + None + + false + + + + ФорматированныйТекстДокументСформирован + + + + + + @@ -71,6 +131,30 @@ + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Текст monaco</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Конфигурация</v8:content> + </v8:item> + + + @@ -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 @@ - - ТипАвторизации + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Тип</v8:content> + <v8:content>Группа тип аутентификации</v8:content> </v8:item> - 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 + + + + ТипАутентификации + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тип</v8:content> + </v8:item> + + 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 <v8:item> @@ -687,31 +737,31 @@ false false - - + + - + false <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Группа пароль авторизации</v8:content> + <v8:content>Группа пароль аутентификации</v8:content> </v8:item> ru - Группа пароль авторизации + Группа пароль аутентификации AlwaysHorizontal Usual None false - + - - ПарольАвторизации + + ПарольАутентификации <v8:item> <v8:lang>ru</v8:lang> @@ -721,43 +771,43 @@ <AutoMaxWidth>false</AutoMaxWidth> <VerticalStretch>false</VerticalStretch> <PasswordMode>true</PasswordMode> - <ContextMenu name="ПарольАвторизацииКонтекстноеМеню" id="134"/> - <ExtendedTooltip name="ПарольАвторизацииРасширеннаяПодсказка" id="135"/> + <ContextMenu name="ПарольАутентификацииКонтекстноеМеню" id="134"/> + <ExtendedTooltip name="ПарольАутентификацииРасширеннаяПодсказка" id="135"/> </InputField> - <Button name="ПоказатьПарольАвторизации" id="138"> + <Button name="ПоказатьПарольАутентификации" id="138"> <Type>UsualButton</Type> <Representation>Picture</Representation> - <CommandName>Form.Command.ПоказатьПарольАвторизации</CommandName> + <CommandName>Form.Command.ПоказатьПарольАутентификации</CommandName> <Picture> <xr:Ref>StdPicture.DataSearch</xr:Ref> <xr:LoadTransparent>true</xr:LoadTransparent> </Picture> - <ExtendedTooltip name="ПоказатьПарольАвторизацииРасширеннаяПодсказка" id="139"/> + <ExtendedTooltip name="ПоказатьПарольАутентификацииРасширеннаяПодсказка" id="139"/> </Button> </ChildItems> </UsualGroup> - <UsualGroup name="ГруппаТокенАвторизации" id="434"> + <UsualGroup name="ГруппаТокенАутентификации" id="434"> <Visible>false</Visible> <Title> <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Группа токен авторизации</v8:content> + <v8:content>Группа токен аутентификации</v8:content> </v8:item> ru - Группа токен авторизации + Группа токен аутентификации AlwaysHorizontal Usual None false - + - - ТокенАвторизации + + ТокенАутентификации <v8:item> <v8:lang>ru</v8:lang> @@ -767,21 +817,259 @@ <AutoMaxWidth>false</AutoMaxWidth> <VerticalStretch>false</VerticalStretch> <PasswordMode>true</PasswordMode> - <ContextMenu name="ТокенАвторизацииКонтекстноеМеню" id="248"/> - <ExtendedTooltip name="ТокенАвторизацииРасширеннаяПодсказка" id="249"/> + <ContextMenu name="ТокенАутентификацииКонтекстноеМеню" id="248"/> + <ExtendedTooltip name="ТокенАутентификацииРасширеннаяПодсказка" id="249"/> + </InputField> + <Button name="ПоказатьТокенАутентификации" id="436"> + <Type>UsualButton</Type> + <Representation>Picture</Representation> + <CommandName>Form.Command.ПоказатьТокенАутентификации</CommandName> + <Picture> + <xr:Ref>StdPicture.DataSearch</xr:Ref> + <xr:LoadTransparent>true</xr:LoadTransparent> + </Picture> + <ExtendedTooltip name="ПоказатьТокенАутентификацииРасширеннаяПодсказка" id="437"/> + </Button> + </ChildItems> + </UsualGroup> + <InputField name="КлючДоступаAWS" id="470"> + <DataPath>AWSКлючДоступа</DataPath> + <Visible>false</Visible> + <Title> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Ключ доступа</v8:content> + </v8:item> + + false + true + false + + + + + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа секретный ключ AWS</v8:content> + </v8:item> + + + + ru + Группа секретный ключ AWS + + + AlwaysHorizontal + Usual + None + false + + + + AWSСекретныйКлюч + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Секретный ключ</v8:content> + </v8:item> + + false + true + false + true + + + + + + + + AWSРегион + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Регион</v8:content> + </v8:item> + + false + true + false + true + false + true + false + false + false + + + + + AWSСервис + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Сервис</v8:content> + </v8:item> + + false + true + false + + + ru + например, s3 + + + + + + + HawkИдентификатор + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Идентификатор</v8:content> + </v8:item> + + false + true + false + + + + + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа ключ hawk</v8:content> + </v8:item> + + + + ru + Группа ключ hawk + + + AlwaysHorizontal + Usual + None + false + + + + HawkКлюч + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Ключ</v8:content> + </v8:item> + + false + true + false + true + + - + + HawkДополнение + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>ext</v8:content> + </v8:item> + + false + true + false + + + ru + нарпимер, some-app-extra-data + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Специфические данные клиента</v8:content> + </v8:item> + + + + + HawkИдентификаторПриложения + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>app</v8:content> + </v8:item> + + false + true + false + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Идентификатор приложения</v8:content> + </v8:item> + + + + + HawkДелегирование + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>dlg</v8:content> + </v8:item> + + false + true + false + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Делегированный идентификатор приложения</v8:content> + </v8:item> + + + @@ -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 - - - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Формат тела ответа JSON</v8:content> - </v8:item> - - - - ru - Формат тела ответа JSON - - - - - - ОтветJSON - true - None - false - false - - - + + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа форматирование текста тела ответа</v8:content> + </v8:item> + + + + ru + Группа форматирование текста тела ответа + + + 2 + false + false + AlwaysHorizontal + Center + Usual + None + false + + + + ФорматироватьТекстТелаОтвета + Auto + + + + ФорматироватьТекстТелаОтветаПриИзменении + + + + ФорматТекстТелаОтвета + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>как</v8:content> + </v8:item> + + Tumbler + true + + + + 0 + + + + ru + JSON + + + JSON + + + + + 0 + + + + ru + XML + + + XML + + + + + 0 + + + + ru + HTML + + + HTML + + + + + + + ФорматТекстТелаОтветаПриИзменении + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа форматы текста тела ответа</v8:content> + </v8:item> + + + + ru + Группа форматы текста тела ответа + + + None + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Текст тела ответа как текст</v8:content> + </v8:item> + + + + ru + Текст тела ответа как текст + + + + + + ОтветТекст + true + None + false + false + + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Текст тела ответа форматированный</v8:content> + </v8:item> + + + + ru + Текст тела ответа форматированный + + + + + + ОтветMonaco + None + false + false + + false + + + + ОтветMonacoДокументСформирован + + + + + + @@ -1846,14 +2252,13 @@ - + ОтветHTML - true None false false - - + + @@ -2132,6 +2537,22 @@ + + ОтображатьСекреты + Button + Auto + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Режим отображения секретов в результатах кодогенерации и экспорта в команду curl. + +Если опция отключена, отображение секретов регулируется индивидуально интерфейсными кнопками для каждого поля с секретом.</v8:content> + </v8:item> + + + <v8:item> @@ -2142,7 +2563,7 @@ <ToolTip> <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Группа файл тела ответа</v8:content> + <v8:content>Настройка сохранения тела ответа в файл</v8:content> </v8:item> </ToolTip> <Behavior>Usual</Behavior> @@ -2169,9 +2590,13 @@ </v8:item> + + ТелоОтветаВФайлПриИзменении + ИмяФайлаТелаОтвета + false <v8:item> <v8:lang>ru</v8:lang> @@ -2188,7 +2613,6 @@ <ContextMenu name="ИмяФайлаТелаОтветаКонтекстноеМеню" id="235"/> <ExtendedTooltip name="ИмяФайлаТелаОтветаРасширеннаяПодсказка" id="236"/> <Events> - <Event name="OnChange">ИмяФайлаТелаОтветаПриИзменении</Event> <Event name="StartChoice">ИмяФайлаТелаОтветаНачалоВыбора</Event> </Events> </InputField> @@ -2214,6 +2638,59 @@ + + АгентПользователя + + + ru + Пользовательское значение заголовка "User-Agent" + + + Button + false + true + false + false + false + true + false + false + false + + + ru + значение платформы по умолчанию + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Пользовательское значение заголовка "User-Agent"</v8:content> + </v8:item> + + + + + Таймаут + + + ru + Таймаут соединения в секундах + + + Button + true + + + ru + ЧН= + + + + + <v8:item> @@ -2224,7 +2701,7 @@ <ToolTip> <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Группа настройки использования сессии</v8:content> + <v8:content>Настройка использования сессии</v8:content> </v8:item> </ToolTip> <Group>Vertical</Group> @@ -2293,6 +2770,19 @@ <ContextMenu name="ПорогПеренаправленийКонтекстноеМеню" id="210"/> <ExtendedTooltip name="ПорогПеренаправленийРасширеннаяПодсказка" id="211"/> </InputField> + <CheckBoxField name="ПеренаправлениеКакGET" id="507"> + <DataPath>ПеренаправлениеКакGET</DataPath> + <ToolTip> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Принудительно переключаться на метод GET для кодов перенаправления 301 и 302</v8:content> + </v8:item> + </ToolTip> + <ToolTipRepresentation>Button</ToolTipRepresentation> + <CheckBoxType>Auto</CheckBoxType> + <ContextMenu name="ПеренаправлениеКакGETКонтекстноеМеню" id="508"/> + <ExtendedTooltip name="ПеренаправлениеКакGETРасширеннаяПодсказка" id="509"/> + </CheckBoxField> <CheckBoxField name="ПоддержкаCookie" id="212"> <DataPath>ПоддержкаCookie</DataPath> <Title> @@ -2319,111 +2809,663 @@ </UsualGroup> </ChildItems> </UsualGroup> - <UsualGroup name="ГруппаПрокси" id="329"> + <UsualGroup name="ГруппаПовторноеВыполнение" id="513"> <Title> <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Прокси</v8:content> + <v8:content>Повторное выполнение</v8:content> </v8:item> ru - Группа прокси + Повторять попытки выполнить HTTP-запрос после неуспешного результата. + +Неуспешным считается вызов исключения и ответ с кодом состояния 5хх или каким-либо из определённых пользователем. + Button Vertical Usual - NormalSeparation - + - - ИспользоватьПрокси + + СпособПовторногоВыполнения <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Использовать</v8:content> + <v8:content>Способ</v8:content> </v8:item> ru - Использовать прокси-сервер для выполнения запроса + Способ расчёта паузы перед повторным выполнением Button - Auto - - + true + false + false + false + false + false + true + false + + + + 0 + + + + ru + Разово + + + Разово + + + + + 0 + + + + ru + Фиксировано + + + Фиксировано + + + + + 0 + + + + ru + Линейно + + + Линейно + + + + + 0 + + + + ru + Экспоненциально + + + Экспоненциально + + + + + - ИспользоватьПроксиПриИзменении + СпособПовторногоВыполненияПриИзменении - - - НеИспользоватьПроксиДляЛокальныхАдресов + + false <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Кроме локальных адресов</v8:content> + <v8:content>Группа параметры повторного выполнения</v8:content> </v8:item> ru - Если опция включена, то при запросе ресурсов с локальных адресов прокси не используется + Группа параметры повторного выполнения - Button - Auto - - - - - СерверПрокси - false - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Сервер</v8:content> - </v8:item> - - true - - - - - ПортПрокси - false - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Порт</v8:content> - </v8:item> - - - - - - ПользовательПрокси - false - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Пользователь</v8:content> - </v8:item> - - false - - - - - false - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Группа пароль прокси</v8:content> - </v8:item> + <Group>Vertical</Group> + <Behavior>Usual</Behavior> + <Representation>None</Representation> + <ShowTitle>false</ShowTitle> + <ExtendedTooltip name="ГруппаПараметрыПовторногоВыполненияРасширеннаяПодсказка" id="522"/> + <ChildItems> + <UsualGroup name="ГруппаПараметрыДлительностиПаузы" id="535"> + <Title> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа параметры длительности паузы</v8:content> + </v8:item> + + + + ru + Группа параметры длительности паузы + + + AlwaysHorizontal + Usual + None + false + + + + ДлительностьПаузыПовторногоВыполнения + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Длительность</v8:content> + </v8:item> + + + + ru + Длительность в секундах паузы после первой попытки выполнения HTTP-запроса + + + Button + + + + + МаксимальнаяДлительностьПаузыПовторногоВыполнения + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>в пределе до</v8:content> + </v8:item> + + + + ru + Максимальная длительность в секундах паузы между попытками в секундах (ограничение фреймворка 3600) + + + Button + + + + + КоэффициентУвеличенияПаузыПовторногоВыполнения + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Коэффициент</v8:content> + </v8:item> + + + + ru + Коэффициент увеличения паузы между попытками выполнить HTTP-запрос + + + Button + + + + + ПорогКоличестваПопытокПовторногоВыполнения + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Количество попыток</v8:content> + </v8:item> + + + + ru + Максимальное количество неуспешных попыток выполнить HTTP-запрос + + + Button + 1 + + + + + + + КодыСостоянияОтветаПовторногоВыполнения + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Коды состояния ответа</v8:content> + </v8:item> + + + + ru + коды состояния ответа, при получении которых необходимо повторять попытки + + + Button + false + false + false + true + true + false + false + false + 999 + 100 + 599 + + + + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>SSL сертификаты</v8:content> + </v8:item> + + + + ru + Группа сертификаты + + + Vertical + + + + ИспользоватьСертификаты + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Использовать</v8:content> + </v8:item> + + + + ru + Использовать клиентский сертификат OpenSSL для выполнения запроса + + + Button + Auto + + + + ИспользоватьСертификатыПриИзменении + + + + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа клиентский сертификат</v8:content> + </v8:item> + + + + ru + Группа клиентский сертификат + + + true + false + AlwaysHorizontal + None + false + + + + ИмяФайлаКлиентскогоСертификата + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Файл клиентского сертификата</v8:content> + </v8:item> + + Button + false + false + true + false + false + true + false + false + false + false + false + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Путь к файлу клиентского сертификата OpenSSL. Допустимо применение форматов PEM и PKCS#12. + +Если требуется передавать два файла - сертификат и его ключ - можно получить конкатенацию этих файлов и передать получившийся единый файл как сертификат. Воспользуйтесь кнопкой "Объединить сертификат и ключ"</v8:content> + </v8:item> + + + + ИмяФайлаКлиентскогоСертификатаНачалоВыбора + + + + + + + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа пароль клиентского сертификата</v8:content> + </v8:item> + + + + ru + Группа пароль клиентского сертификата + + + AlwaysHorizontal + None + false + + + + ПарольКлиентскогоСертификата + false + false + true + false + true + + + + + + + + ИмяФайлаСертификатовУЦ + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Файл сертификатов УЦ</v8:content> + </v8:item> + + + + ru + Путь к файлу сертификатов удостоверяющих центров OpenSSL, загружаемые из системного хранилища сертификатов операционной системы. Допустимо применение форматов PEM и PKCS#12. + + + Button + false + false + true + false + false + true + false + false + false + false + false + + + + ИмяФайлаСертификатовУЦНачалоВыбора + + + + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа пароль файла сертификатов УЦ</v8:content> + </v8:item> + + + + ru + Группа пароль файла сертификатов УЦ + + + AlwaysHorizontal + None + false + + + + ПарольФайлаСертификатовУЦ + false + false + true + false + true + + + + + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Прокси</v8:content> + </v8:item> + + + + ru + Настройки прокси + + + Vertical + Usual + NormalSeparation + + + + ИспользоватьПрокси + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Использовать</v8:content> + </v8:item> + + + + ru + Использовать прокси-сервер для выполнения запроса + + + Button + Auto + + + + ИспользоватьПроксиПриИзменении + + + + НеИспользоватьПроксиДляЛокальныхАдресов + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Кроме локальных адресов</v8:content> + </v8:item> + + + + ru + Если опция включена, то при запросе ресурсов с локальных адресов прокси не используется + + + Button + Auto + + + + + false + + + ru + Сервер прокси + + + AlwaysHorizontal + Usual + None + false + + + + ПротоколПрокси + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Сервер</v8:content> + </v8:item> + + + + ru + Протокол прокси + + + false + false + true + false + false + false + false + false + false + + + + 0 + + + + ru + https + + + https + + + + + 0 + + + + ru + http + + + http + + + + + + + + СерверПрокси + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Сервер</v8:content> + </v8:item> + + None + + + ru + Сервер прокси + + + false + false + false + true + + + + + + + ПортПрокси + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Порт</v8:content> + </v8:item> + + + + + + ПользовательПрокси + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Пользователь</v8:content> + </v8:item> + + false + + + + + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа пароль прокси</v8:content> + </v8:item> @@ -2484,6 +3526,43 @@ + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Редактор Monaco</v8:content> + </v8:item> + + + + ru + Управление редактором Monaco + + + Vertical + Usual + NormalSeparation + + + + + @@ -2734,55 +3813,220 @@ - cfg:DataProcessorObject.КонсольКлиентаHTTP + cfg:DataProcessorObject.КонсольКлиентаHTTP + + true + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Идентификатор ресурса</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Параметры запроса</v8:content> + </v8:item> + + + v8:ValueTable + + + ПараметрыЗапроса.Значение + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Имя</v8:content> + </v8:item> + + + xs:string + + 100 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Значение</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Активно</v8:content> + </v8:item> + + + xs:boolean + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Ответ текст</v8:content> + </v8:item> + + + fd:FormattedDocument + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Код состояния</v8:content> + </v8:item> + + + xs:decimal + + 3 + 0 + Nonnegative + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Заголовки ответа</v8:content> + </v8:item> + + + v8:ValueTable + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Ключ</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Значение</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Значение заголовка ответа</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + - true - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Идентификатор ресурса</v8:content> + <v8:content>Схема</v8:content> </v8:item> xs:string - 0 + 8 Variable - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Параметры запроса</v8:content> + <v8:content>Заголовки запроса</v8:content> </v8:item> v8:ValueTable - - ПараметрыЗапроса.Значение - - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Имя</v8:content> + <v8:content>Активно</v8:content> + </v8:item> + + + xs:boolean + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Ключ</v8:content> </v8:item> xs:string - 100 + 0 Variable - + <v8:item> <v8:lang>ru</v8:lang> @@ -2797,7 +4041,110 @@ </v8:StringQualifiers> </Type> </Column> - <Column name="Активно" id="3"> + </Columns> + </Attribute> + <Attribute name="ТипАутентификации" id="11"> + <Title> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тип аутентификации</v8:content> + </v8:item> + + + xs:string + + 25 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Пользователь аутентификации</v8:content> + </v8:item> + + + xs:string + + 100 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Пароль аутентификации</v8:content> + </v8:item> + + + xs:string + + 255 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тело запроса текст</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тип тела запроса</v8:content> + </v8:item> + + + xs:string + + 100 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тип тела запроса как есть</v8:content> + </v8:item> + + + xs:string + + 10 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тело запроса данные формы</v8:content> + </v8:item> + + + v8:ValueTable + + + <v8:item> <v8:lang>ru</v8:lang> @@ -2808,83 +4155,187 @@ <v8:Type>xs:boolean</v8:Type> </Type> </Column> + <Column name="Тип" id="2"> + <Title> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тип</v8:content> + </v8:item> + + + xs:string + + 10 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Ключ</v8:content> + </v8:item> + + + xs:string + + 1000 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Значение</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + - + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тело запроса файл</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Разделитель</v8:content> + </v8:item> + + + xs:string + + 1000 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Дополнительно</v8:content> + </v8:item> + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Имя файла тела</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Ответ текст</v8:content> + <v8:content>Использовать сессию</v8:content> </v8:item> - fd:FormattedDocument + xs:boolean - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Код состояния</v8:content> + <v8:content>Количество</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Порог перенаправлений</v8:content> </v8:item> xs:decimal - 3 + 2 0 Nonnegative - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Заголовки ответа</v8:content> + <v8:content>Поддержка cookie</v8:content> </v8:item> - v8:ValueTable + xs:boolean - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Ключ</v8:content> - </v8:item> - - - xs:string - - 0 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Значение</v8:content> - </v8:item> - - - xs:string - - 0 - Variable - - - - - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Значение заголовка ответа</v8:content> + <v8:content>Поддержка сжатого ответа</v8:content> + </v8:item> + + + xs:boolean + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тело ответа в файл</v8:content> + </v8:item> + + + xs:boolean + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Имя файла тела ответа</v8:content> </v8:item> @@ -2894,27 +4345,28 @@ Variable + ShowError - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Схема</v8:content> + <v8:content>Токен аутентификации</v8:content> </v8:item> xs:string - 8 + 255 Variable - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Заголовки запроса</v8:content> + <v8:content>Тело запроса данные HTMLФормы</v8:content> </v8:item> @@ -2942,7 +4394,7 @@ xs:string - 0 + 1000 Variable @@ -2964,26 +4416,26 @@ - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Тип авторизации</v8:content> + <v8:content>Ответ картинка</v8:content> </v8:item> xs:string - 25 + 0 Variable - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Пользователь авторизации</v8:content> + <v8:content>Формат тела ответа</v8:content> </v8:item> @@ -2994,26 +4446,26 @@ - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Пароль авторизации</v8:content> + <v8:content>Ответ HTML</v8:content> </v8:item> xs:string - 255 + 0 Variable - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Тело запроса текст</v8:content> + <v8:content>Ответ monaco</v8:content> </v8:item> @@ -3024,11 +4476,43 @@ - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Тип тела запроса</v8:content> + <v8:content>Время выполнения</v8:content> + </v8:item> + + + xs:decimal + + 15 + 2 + Nonnegative + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Размер ответа</v8:content> + </v8:item> + + + xs:decimal + + 15 + 2 + Nonnegative + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Разделы консоли</v8:content> </v8:item> @@ -3039,78 +4523,218 @@ - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Тип тела запроса как есть</v8:content> + <v8:content>Использовать прокси</v8:content> + </v8:item> + + + xs:boolean + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Сервер прокси</v8:content> </v8:item> xs:string - 10 + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Порт прокси</v8:content> + </v8:item> + + + xs:decimal + + 5 + 0 + Nonnegative + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Пользователь прокси</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Пароль прокси</v8:content> + </v8:item> + + + xs:string + + 0 Variable - + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Использовать аутентификацию ОСПрокси</v8:content> + </v8:item> + + + xs:boolean + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Не использовать прокси для локальных адресов</v8:content> + </v8:item> + + + xs:boolean + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Выполнять на сервере</v8:content> + </v8:item> + + + xs:boolean + + + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Тело запроса данные формы</v8:content> + <v8:content>История</v8:content> </v8:item> v8:ValueTable - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Активно</v8:content> + <v8:content>Временная метка</v8:content> </v8:item> - xs:boolean + xs:decimal + + 15 + 0 + Nonnegative + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Тип</v8:content> + <v8:content>Дата</v8:content> + </v8:item> + + + xs:dateTime + + DateTime + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Код состояния</v8:content> + </v8:item> + + + xs:decimal + + 3 + 0 + Nonnegative + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Схема</v8:content> </v8:item> xs:string - 10 + 8 Variable - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Ключ</v8:content> + <v8:content>Протокол</v8:content> </v8:item> xs:string - 1000 + 5 Variable - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Значение</v8:content> + <v8:content>Хост</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>URN</v8:content> </v8:item> @@ -3121,142 +4745,170 @@ + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Контекст выполнения</v8:content> + </v8:item> + + + xs:string + + 10 + Variable + + + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Тело запроса файл</v8:content> + <v8:content>Сохранять в историю</v8:content> </v8:item> - xs:string - - 0 - Variable - + xs:boolean - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Разделитель</v8:content> + <v8:content>Файл monaco</v8:content> </v8:item> xs:string - 1000 + 0 Variable - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Дополнительно</v8:content> + <v8:content>Форматировать</v8:content> </v8:item> - + + xs:boolean + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Имя файла тела</v8:content> + <v8:content>Формат тела ответа</v8:content> </v8:item> xs:string - 0 + 100 Variable - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Использовать сессию</v8:content> + <v8:content>Протокол прокси</v8:content> </v8:item> - xs:boolean + xs:string + + 5 + Variable + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Количество</v8:content> + <v8:content>Ключ доступа AWS</v8:content> </v8:item> xs:string - 0 + 1000 Variable - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Порог перенаправлений</v8:content> + <v8:content>Секретный ключ AWS</v8:content> </v8:item> - xs:decimal - - 2 - 0 - Nonnegative - + xs:string + + 1000 + Variable + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Поддержка cookie</v8:content> + <v8:content>Регион AWS</v8:content> </v8:item> - xs:boolean + xs:string + + 100 + Variable + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Поддержка сжатого ответа</v8:content> + <v8:content>Сервис AWS</v8:content> </v8:item> - xs:boolean + xs:string + + 100 + Variable + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Тело ответа в файл</v8:content> + <v8:content>Идентификатор Hawk</v8:content> </v8:item> - xs:boolean + xs:string + + 0 + Variable + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Имя файла тела ответа</v8:content> + <v8:content>Ключ Hawk</v8:content> </v8:item> @@ -3267,80 +4919,41 @@ - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Токен авторизации</v8:content> + <v8:content>Делегирование Hawk</v8:content> </v8:item> xs:string - 255 + 0 Variable - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Тело запроса данные HTMLФормы</v8:content> + <v8:content>Дополнительные данные Hawk</v8:content> </v8:item> - v8:ValueTable + xs:string + + 0 + Variable + - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Активно</v8:content> - </v8:item> - - - xs:boolean - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Ключ</v8:content> - </v8:item> - - - xs:string - - 1000 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Значение</v8:content> - </v8:item> - - - xs:string - - 0 - Variable - - - - - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Ответ картинка</v8:content> + <v8:content>Идентификатор приложения Hawk</v8:content> </v8:item> @@ -3351,26 +4964,22 @@ - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Формат тела ответа</v8:content> + <v8:content>Перенаправление как GET</v8:content> </v8:item> - xs:string - - 100 - Variable - + xs:boolean - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Ответ HTML</v8:content> + <v8:content>Агент пользователя</v8:content> </v8:item> @@ -3381,111 +4990,129 @@ - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Ответ JSON</v8:content> + <v8:content>Способ повторного выполнения</v8:content> </v8:item> - fd:FormattedDocument + xs:string + + 100 + Variable + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Время выполнения</v8:content> + <v8:content>Длительность паузы повторного выполнения</v8:content> </v8:item> xs:decimal - 15 - 2 + 4 + 0 Nonnegative - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Размер ответа</v8:content> + <v8:content>Коэффициент увеличения паузы повторного выполнения</v8:content> </v8:item> xs:decimal - 15 - 2 + 4 + 0 Nonnegative - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Разделы консоли</v8:content> + <v8:content>Порог количества попыток повторного выполнения</v8:content> </v8:item> - - xs:string - - 100 - Variable - + + xs:decimal + + 2 + 0 + Nonnegative + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Использовать прокси</v8:content> + <v8:content>Максимальная длительность паузы повторного выполнения</v8:content> </v8:item> - xs:boolean + xs:decimal + + 4 + 0 + Nonnegative + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Сервер прокси</v8:content> + <v8:content>Коды состояния ответа повторного выполнения</v8:content> </v8:item> - xs:string - - 0 - Variable - + v8:ValueListType + + КодыСостоянияОтветаПовторногоВыполнения.Picture + КодыСостоянияОтветаПовторногоВыполнения.ValueType + + + xs:decimal + + 10 + 0 + Any + + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Порт прокси</v8:content> + <v8:content>Таймаут</v8:content> </v8:item> xs:decimal - 5 + 3 0 Nonnegative - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Пользователь прокси</v8:content> + <v8:content>Имя файла клиентского сертификата</v8:content> </v8:item> @@ -3495,12 +5122,13 @@ Variable + ShowError - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Пароль прокси</v8:content> + <v8:content>Имя файла сертификатов УЦ</v8:content> </v8:item> @@ -3511,178 +5139,52 @@ - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Использовать аутентификацию ОСПрокси</v8:content> - </v8:item> - - - xs:boolean - - - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Не использовать прокси для локальных адресов</v8:content> + <v8:content>Использовать сертификаты</v8:content> </v8:item> xs:boolean - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Выполнять на сервере</v8:content> + <v8:content>Пароль клиентского сертификата</v8:content> </v8:item> - xs:boolean + xs:string + + 0 + Variable + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>История</v8:content> + <v8:content>Пароль файла сертификатов УЦ</v8:content> </v8:item> - v8:ValueTable + xs:string + + 0 + Variable + - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Временная метка</v8:content> - </v8:item> - - - xs:decimal - - 15 - 0 - Nonnegative - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Дата</v8:content> - </v8:item> - - - xs:dateTime - - DateTime - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Код состояния</v8:content> - </v8:item> - - - xs:decimal - - 3 - 0 - Nonnegative - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Схема</v8:content> - </v8:item> - - - xs:string - - 8 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Протокол</v8:content> - </v8:item> - - - xs:string - - 5 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Хост</v8:content> - </v8:item> - - - xs:string - - 0 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>URN</v8:content> - </v8:item> - - - xs:string - - 0 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Контекст выполнения</v8:content> - </v8:item> - - - xs:string - - 10 - Variable - - - - - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Сохранять в историю</v8:content> + <v8:content>Отображать секреты</v8:content> </v8:item> @@ -3905,20 +5407,20 @@ F7 ВыполнитьЗапрос - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Показать пароль авторизации</v8:content> + <v8:content>Показать пароль аутентификации</v8:content> </v8:item> ru - Показать пароль авторизации + Показать пароль аутентификации - ПоказатьПарольАвторизации + ПоказатьПарольАутентификации @@ -4121,20 +5623,110 @@ </ToolTip> <Action>ПоказатьПарольПрокси</Action> </Command> - <Command name="ПоказатьТокенАвторизации" id="16"> + <Command name="ПоказатьТокенАутентификации" id="16"> + <Title> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Показать токен аутентификации</v8:content> + </v8:item> + + + + ru + Показать токен аутентификации + + + ПоказатьТокенАутентификации + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Перезагрузить редактор Monaco</v8:content> + </v8:item> + + + + ru + Извлечь monaco + + + ИзвлечьMonaco + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Показать секретный ключ</v8:content> + </v8:item> + + + + ru + Показать секретный ключ + + + ПоказатьСекретныйКлючAWS + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Показать ключ</v8:content> + </v8:item> + + + + ru + Показать ключ hawk + + + ПоказатьКлючHawk + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Объединить сертификат и ключ</v8:content> + </v8:item> + + + + ru + Объединить файлы сертификата и ключа в один + + + ОбъединитьСертификатИКлюч + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Показать пароль клиентского сертификата</v8:content> + </v8:item> + + + + ru + Показать пароль клиентского сертификата + + + ПоказатьПарольКлиентскогоСертификата + + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Показать токен авторизации</v8:content> + <v8:content>Показать пароль файла сертификатов УЦ</v8:content> </v8:item> 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 + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Ключ доступа:</v8:content> + </v8:item> + + + + + + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа секретный ключ AWS</v8:content> + </v8:item> + + + + ru + Группа секретный ключ AWS + + + AlwaysHorizontal + Usual + None + false + + + + AWSСекретныйКлюч + true + false + false + false + false + true + false + + + + + + + + AWSРегион + false + true + false + true + false + false + false + + + + + AWSСервис + false + + + ru + например, s3 + + + + + + + HawkИдентификатор + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Идентификатор</v8:content> + </v8:item> + + false + true + false + + + + + HawkДополнение + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>ext</v8:content> + </v8:item> + + false + + + ru + нарпимер, some-app-extra-data + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Специфические данные клиента</v8:content> + </v8:item> + + + + + HawkИдентификаторПриложения + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>app</v8:content> + </v8:item> + + false + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Идентификатор приложения</v8:content> + </v8:item> + + + + + HawkДелегирование + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>dlg</v8:content> + </v8:item> + + false + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Делегированный идентификатор приложения</v8:content> + </v8:item> + + + + + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа ключ hawk</v8:content> + </v8:item> + + + + ru + Группа ключ hawk + + + AlwaysHorizontal + Usual + None + false + + + + HawkКлюч + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Ключ</v8:content> + </v8:item> + + false + true + false + true + false + false + false + false + true + false + + + + + + @@ -1554,6 +1794,7 @@ true true true + false @@ -1822,6 +2063,73 @@ ДекорацияКонтекстВыполненияНастройкиНажатие + + ОтображатьСекреты + Button + Auto + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Режим отображения секретов в результате экспорта в команду curl. + +Если опция отключена, отображение секретов регулируется индивидуально интерфейсными кнопками для каждого поля с секретом.</v8:content> + </v8:item> + + + + + АгентПользователя + + + ru + Пользовательское значение заголовка "User-Agent" + + + Button + false + false + false + true + false + false + false + + + ru + значение платформы по умолчанию + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Пользовательское значение заголовка "User-Agent"</v8:content> + </v8:item> + + + + + Таймаут + + + ru + Таймаут соединения в секундах + + + Button + true + + + ru + ЧН= + + + + + @@ -1905,6 +2213,19 @@ + + ПеренаправлениеКакGET + + + ru + Принудительно переключаться на метод GET для кодов перенаправления 301 и 302 + + + Button + Auto + + + ПоддержкаCookie @@ -1931,70 +2252,545 @@ </UsualGroup> </ChildItems> </UsualGroup> - <UsualGroup name="ГруппаПрокси" id="58"> - <EnableContentChange>true</EnableContentChange> + <UsualGroup name="ГруппаПовторноеВыполнение" id="394"> <Title> <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Прокси</v8:content> + <v8:content>Повторное выполнение</v8:content> </v8:item> ru - Группа прокси + Повторять попытки выполнить HTTP-запрос после неуспешного результата. + +Неуспешным считается вызов исключения и ответ с кодом состояния 5хх или каким-либо из определённых пользователем. + Button Vertical Usual - NormalSeparation - + - - ИспользоватьПрокси + + СпособПовторногоВыполнения <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Использовать</v8:content> - </v8:item> - - - - ru - Использовать прокси-сервер для выполнения запроса - - - Button - Auto - - - - ИспользоватьПроксиПриИзменении - - - - НеИспользоватьПроксиДляЛокальныхАдресов - false - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Кроме локальных адресов</v8:content> + <v8:content>Способ</v8:content> </v8:item> ru - Если опция включена, то при запросе ресурсов с локальных адресов прокси не используется + Способ расчёта паузы перед повторным выполнением Button - Auto - - - - - СерверПрокси - false + true + false + false + false + false + false + true + false + + + + 0 + + + + ru + Разово + + + Разово + + + + + 0 + + + + ru + Фиксировано + + + Фиксировано + + + + + 0 + + + + ru + Линейно + + + Линейно + + + + + 0 + + + + ru + Экспоненциально + + + Экспоненциально + + + + + + + СпособПовторногоВыполненияПриИзменении + + + + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа параметры повторного выполнения</v8:content> + </v8:item> + + + + ru + Группа параметры повторного выполнения + + + Vertical + Usual + None + false + + + + ДлительностьПаузыПовторногоВыполнения + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Длительность</v8:content> + </v8:item> + + + + ru + Длительность в секундах паузы после первой попытки выполнения HTTP-запроса + + + Button + + + + + МаксимальнаяДлительностьПаузыПовторногоВыполнения + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>в пределе до</v8:content> + </v8:item> + + + + ru + Максимальная длительность в секундах паузы между попытками в секундах (ограничение фреймворка 3600) + + + Button + + + + + КоэффициентУвеличенияПаузыПовторногоВыполнения + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Коэффициент</v8:content> + </v8:item> + + + + ru + Коэффициент увеличения паузы между попытками выполнить HTTP-запрос + + + Button + + + + + ПорогКоличестваПопытокПовторногоВыполнения + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Количество попыток</v8:content> + </v8:item> + + + + ru + Максимальное количество неуспешных попыток выполнить HTTP-запрос + + + Button + 1 + + + + + КодыСостоянияОтветаПовторногоВыполнения + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Коды состояния ответа</v8:content> + </v8:item> + + + + ru + коды состояния ответа, при получении которых необходимо повторять попытки + + + Button + false + false + false + true + true + false + false + false + 999 + 100 + 599 + + + + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>SSL сертификаты</v8:content> + </v8:item> + + + + ru + Группа сертификаты + + + Usual + + + + ИспользоватьСертификаты + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Использовать</v8:content> + </v8:item> + + + + ru + Использовать клиентский сертификат OpenSSL для выполнения запроса + + + Button + Auto + + + + ИспользоватьСертификатыПриИзменении + + + + ИмяФайлаКлиентскогоСертификата + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Файл клиентского сертификата</v8:content> + </v8:item> + + Top + Button + false + true + false + false + true + false + false + false + false + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Путь к файлу клиентского сертификата OpenSSL. Допустимо применение форматов PEM и PKCS#12. + +Если требуется передавать два файла - сертификат и его ключ - можно получить конкатенацию этих файлов и передать получившийся единый файл как сертификат.</v8:content> + </v8:item> + + + + ИмяФайлаКлиентскогоСертификатаНачалоВыбора + + + + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа пароль клиентского сертификата</v8:content> + </v8:item> + + + + ru + Группа пароль клиентского сертификата + + + AlwaysHorizontal + Usual + None + false + + + + ПарольКлиентскогоСертификата + Top + false + false + true + false + true + + + + + + + + ИмяФайлаСертификатовУЦ + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Файл сертификатов УЦ</v8:content> + </v8:item> + + Top + + + ru + Путь к файлу сертификатов удостоверяющих центров OpenSSL, загружаемые из системного хранилища сертификатов операционной системы. Допустимо применение форматов PEM и PKCS#12. + + + Button + false + false + true + false + false + true + false + false + false + false + + + + ИмяФайлаСертификатовУЦНачалоВыбора + + + + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа пароль файла сертификатов УЦ</v8:content> + </v8:item> + + + + ru + Группа пароль файла сертификатов УЦ + + + AlwaysHorizontal + Usual + None + false + + + + ПарольФайлаСертификатовУЦ + Top + false + true + false + true + + + + + + + + + + true + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Прокси</v8:content> + </v8:item> + + + + ru + Группа прокси + + + Vertical + Usual + NormalSeparation + + + + ИспользоватьПрокси + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Использовать</v8:content> + </v8:item> + + + + ru + Использовать прокси-сервер для выполнения запроса + + + Button + Auto + + + + ИспользоватьПроксиПриИзменении + + + + НеИспользоватьПроксиДляЛокальныхАдресов + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Кроме локальных адресов</v8:content> + </v8:item> + + + + ru + Если опция включена, то при запросе ресурсов с локальных адресов прокси не используется + + + Button + Auto + + + + + ПротоколПрокси + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Схема</v8:content> + </v8:item> + + + + ru + Протокол прокси + + + true + false + false + false + false + false + false + + + + 0 + + + + ru + https + + + https + + + + + 0 + + + + ru + http + + + http + + + + + + + + СерверПрокси + false <v8:item> <v8:lang>ru</v8:lang> @@ -2112,69 +2908,438 @@ </Type> <MainAttribute>true</MainAttribute> </Attribute> - <Attribute name="ВыполнятьНаСервере" id="4"> + <Attribute name="ВыполнятьНаСервере" id="4"> + <Title> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Выполнять на сервере</v8:content> + </v8:item> + + + xs:boolean + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Использовать сессию</v8:content> + </v8:item> + + + xs:boolean + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Порог перенаправлений</v8:content> + </v8:item> + + + xs:decimal + + 2 + 0 + Nonnegative + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Поддержка cookie</v8:content> + </v8:item> + + + xs:boolean + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Дополнительно</v8:content> + </v8:item> + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Идентификатор ресурса</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Схема</v8:content> + </v8:item> + + + xs:string + + 8 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Параметры запроса</v8:content> + </v8:item> + + + v8:ValueTable + + + ПараметрыЗапроса.Значение + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Имя</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Значение</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Активно</v8:content> + </v8:item> + + + xs:boolean + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тип аутентификации</v8:content> + </v8:item> + + + xs:string + + 25 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Пароль аутентификации</v8:content> + </v8:item> + + + xs:string + + 255 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Пользователь аутентификации</v8:content> + </v8:item> + + + xs:string + + 100 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Токен аутентификации</v8:content> + </v8:item> + + + xs:string + + 255 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Заголовки запроса</v8:content> + </v8:item> + + + v8:ValueTable + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Активно</v8:content> + </v8:item> + + + xs:boolean + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Ключ</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Значение</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Выполнять на сервере</v8:content> + <v8:content>Тип тела запроса</v8:content> </v8:item> - xs:boolean + xs:string + + 100 + Variable + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Использовать сессию</v8:content> + <v8:content>Тело запроса данные формы</v8:content> </v8:item> - xs:boolean + v8:ValueTable + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Активно</v8:content> + </v8:item> + + + xs:boolean + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тип</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Ключ</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Значение</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Порог перенаправлений</v8:content> + <v8:content>Разделитель</v8:content> </v8:item> - xs:decimal - - 2 - 0 - Nonnegative - + xs:string + + 1000 + Variable + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Поддержка cookie</v8:content> + <v8:content>Тело запроса данные HTMLФормы</v8:content> </v8:item> - xs:boolean + v8:ValueTable + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Активно</v8:content> + </v8:item> + + + xs:boolean + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Ключ</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Значение</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Дополнительно</v8:content> + <v8:content>Тело запроса текст</v8:content> </v8:item> - + + xs:string + + 0 + Variable + + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Идентификатор ресурса</v8:content> + <v8:content>Тело запроса файл</v8:content> </v8:item> @@ -2185,40 +3350,70 @@ - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Схема</v8:content> + <v8:content>Код состояния</v8:content> </v8:item> - xs:string - - 8 - Variable - + xs:decimal + + 3 + 0 + Nonnegative + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Параметры запроса</v8:content> + <v8:content>Время выполнения</v8:content> + </v8:item> + + + xs:decimal + + 15 + 2 + Nonnegative + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Размер ответа</v8:content> + </v8:item> + + + xs:decimal + + 15 + 2 + Nonnegative + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Заголовки ответа</v8:content> </v8:item> v8:ValueTable - - ПараметрыЗапроса.Значение - <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Имя</v8:content> + <v8:content>Ключ</v8:content> </v8:item> @@ -2244,222 +3439,189 @@ - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Активно</v8:content> - </v8:item> - - - xs:boolean - - - + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Ответ HTML</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Ответ JSON</v8:content> + </v8:item> + + + fd:FormattedDocument + + + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Тип аутентификации</v8:content> + <v8:content>Ответ картинка</v8:content> </v8:item> xs:string - 25 + 0 Variable - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Пароль аутентификации</v8:content> + <v8:content>Ответ текст</v8:content> + </v8:item> + + + fd:FormattedDocument + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Пользователь прокси</v8:content> </v8:item> xs:string - 255 + 0 Variable - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Пользователь аутентификации</v8:content> + <v8:content>Пароль прокси</v8:content> </v8:item> xs:string - 100 + 0 Variable - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Токен аутентификации</v8:content> + <v8:content>Порт прокси</v8:content> + </v8:item> + + + xs:decimal + + 5 + 0 + Nonnegative + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Сервер прокси</v8:content> </v8:item> xs:string - 255 + 0 Variable - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Заголовки запроса</v8:content> + <v8:content>Не использовать прокси для локальных адресов</v8:content> </v8:item> - v8:ValueTable + xs:boolean - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Активно</v8:content> - </v8:item> - - - xs:boolean - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Ключ</v8:content> - </v8:item> - - - xs:string - - 0 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Значение</v8:content> - </v8:item> - - - xs:string - - 0 - Variable - - - - - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Тип тела запроса</v8:content> + <v8:content>Использовать прокси</v8:content> + </v8:item> + + + xs:boolean + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Использовать аутентификацию ОСПрокси</v8:content> + </v8:item> + + + xs:boolean + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Ответ текст строка</v8:content> </v8:item> xs:string - 100 + 0 Variable - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Тело запроса данные формы</v8:content> + <v8:content>Регион</v8:content> </v8:item> - v8:ValueTable + xs:string + + 100 + Variable + - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Активно</v8:content> - </v8:item> - - - xs:boolean - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Тип</v8:content> - </v8:item> - - - xs:string - - 0 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Ключ</v8:content> - </v8:item> - - - xs:string - - 0 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Значение</v8:content> - </v8:item> - - - xs:string - - 0 - Variable - - - - - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Разделитель</v8:content> + <v8:content>Секретный ключ</v8:content> </v8:item> @@ -2470,186 +3632,112 @@ - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Тело запроса данные HTMLФормы</v8:content> + <v8:content>Сервис</v8:content> </v8:item> - v8:ValueTable + xs:string + + 100 + Variable + - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Активно</v8:content> - </v8:item> - - - xs:boolean - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Ключ</v8:content> - </v8:item> - - - xs:string - - 0 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Значение</v8:content> - </v8:item> - - - xs:string - - 0 - Variable - - - - - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Тело запроса текст</v8:content> + <v8:content>Ключ доступа</v8:content> </v8:item> xs:string - 0 + 1000 Variable - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Тело запроса файл</v8:content> + <v8:content>Протокол прокси</v8:content> </v8:item> xs:string - 0 + 5 Variable - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Код состояния</v8:content> + <v8:content>Идентификатор Hawk</v8:content> </v8:item> - xs:decimal - - 3 - 0 - Nonnegative - + xs:string + + 0 + Variable + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Время выполнения</v8:content> + <v8:content>Ключ Hawk</v8:content> </v8:item> - xs:decimal - - 15 - 2 - Nonnegative - + xs:string + + 0 + Variable + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Размер ответа</v8:content> + <v8:content>Агент пользователя</v8:content> </v8:item> - xs:decimal - - 15 - 2 - Nonnegative - + xs:string + + 0 + Variable + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Заголовки ответа</v8:content> + <v8:content>Перенаправление как GET</v8:content> </v8:item> - v8:ValueTable + xs:boolean - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Ключ</v8:content> - </v8:item> - - - xs:string - - 0 - Variable - - - - - - <v8:item> - <v8:lang>ru</v8:lang> - <v8:content>Значение</v8:content> - </v8:item> - - - xs:string - - 0 - Variable - - - - - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Ответ HTML</v8:content> + <v8:content>Дополнительные данные Hawk</v8:content> </v8:item> @@ -2660,22 +3748,26 @@ - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Ответ JSON</v8:content> + <v8:content>Идентификатор приложения Hawk</v8:content> </v8:item> - fd:FormattedDocument + xs:string + + 0 + Variable + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Ответ картинка</v8:content> + <v8:content>Делегирование Hawk</v8:content> </v8:item> @@ -2686,116 +3778,186 @@ - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Ответ текст</v8:content> + <v8:content>Способ повторного выполнения</v8:content> </v8:item> - fd:FormattedDocument + xs:string + + 100 + Variable + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Пользователь прокси</v8:content> + <v8:content>Длительность паузы повторного выполнения</v8:content> </v8:item> - xs:string - - 0 - Variable - + xs:decimal + + 4 + 0 + Nonnegative + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Пароль прокси</v8:content> + <v8:content>Максимальная длительность паузы повторного выполнения</v8:content> </v8:item> - xs:string - - 0 - Variable - + xs:decimal + + 4 + 0 + Nonnegative + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Порт прокси</v8:content> + <v8:content>Коэффициент увеличения паузы повторного выполнения</v8:content> </v8:item> xs:decimal - 5 + 4 0 Nonnegative - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Сервер прокси</v8:content> + <v8:content>Порог количества попыток повторного выполнения</v8:content> </v8:item> - xs:string - - 0 - Variable - + xs:decimal + + 2 + 0 + Nonnegative + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Не использовать прокси для локальных адресов</v8:content> + <v8:content>Коды состояния ответа повторного выполнения</v8:content> </v8:item> - xs:boolean + v8:ValueListType + + КодыСостоянияОтветаПовторногоВыполнения.Picture + КодыСостоянияОтветаПовторногоВыполнения.ValueType + + + xs:decimal + + 10 + 0 + Any + + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Использовать прокси</v8:content> + <v8:content>Таймаут</v8:content> </v8:item> - xs:boolean + xs:decimal + + 3 + 0 + Nonnegative + - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Использовать аутентификацию ОСПрокси</v8:content> + <v8:content>Использовать сертификаты</v8:content> </v8:item> xs:boolean - + <v8:item> <v8:lang>ru</v8:lang> - <v8:content>Ответ текст строка</v8:content> + <v8:content>Имя файла клиентского сертификата</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + ShowError + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Имя файла сертификатов УЦ</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Пароль клиентского сертификата</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Пароль файла сертификатов УЦ</v8:content> </v8:item> @@ -2806,6 +3968,17 @@ + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Отображать секреты</v8:content> + </v8:item> + + + xs:boolean + + @@ -3055,5 +4228,65 @@ + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Показать секретный ключ</v8:content> + </v8:item> + + + + ru + Показать секретный ключ + + + ПоказатьСекретныйКлючAWS + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Показать ключ</v8:content> + </v8:item> + + + + ru + Показать ключ hawk + + + ПоказатьКлючHawk + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Показать пароль клиентского сертификата</v8:content> + </v8:item> + + + + ru + Показать пароль клиентского сертификата + + + ПоказатьПарольКлиентскогоСертификата + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Показать пароль файла сертификатов УЦ</v8:content> + </v8:item> + + + + 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 @@ + + +
+ + ФормаОбъединенияСертификатаИКлюча + + + ru + Форма объединения сертификата и ключа + + + + Managed + false + + PlatformApplication + MobilePlatformApplication + + + +
+
\ 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 @@ + +
+ + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Объединение сертификата и ключа в один файл</v8:content> + </v8:item> + + false + + + + + + + ПриСозданииНаСервере + + + + Сертификат + + + ru + Путь к файлу сертификата формата PEM + + + 50 + false + false + true + false + false + true + false + false + false + false + false + + + + СертификатНачалоВыбора + + + + Ключ + + + ru + Путь к файлу ключа сертификата формата PEM + + + 50 + false + false + true + false + false + true + false + false + false + false + false + + + + КлючНачалоВыбора + + + + ЗапретитьПерезапись + + + ru + Режим запрета на действие при существовании файла по указанному пути результата + + + Auto + + + + + Результат + + + ru + Путь к объединяющему сертификат и ключ файлу + + + 50 + false + false + true + false + false + true + false + false + false + false + false + + + + РезультатНачалоВыбора + + + + + + + cfg:DataProcessorObject.КонсольКлиентаHTTP + + true + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Сертификат</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + ShowError + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Ключ</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + ShowError + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Результат</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + ShowError + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Запретить перезапись</v8:content> + </v8:item> + + + xs:boolean + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Объединить</v8:content> + </v8:item> + + + + ru + Объединить + + + Объединить + + + + + + xs:string + + 0 + Variable + + + + +
\ 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 @@ + + + + \ 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