1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2024-12-27 02:43:54 +02:00

Оптимизация инструментов http

This commit is contained in:
Anton 2024-11-11 21:59:34 +03:00
parent cc7a949392
commit e6d7004aff
9 changed files with 5908 additions and 5749 deletions

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,83 @@
// OneScript: ./OInt/core/Modules/OPI_S3.os
// Lib: S3
// CLI: s3
// MIT License
// Copyright (c) 2023 Anton Tsitavets
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// https://github.com/Bayselonarrend/OpenIntegrations
// BSLLS:Typo-off
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// BSLLS:NumberOfOptionalParams-off
// BSLLS:UsingServiceTag-off
// BSLLS:LineLength-off
//@skip-check module-structure-top-region
//@skip-check module-structure-method-in-regions
//@skip-check wrong-string-literal-content
//@skip-check method-too-many-params
// Раскомментировать, если выполняется OneScript
#Использовать "../../tools"
#Область ПрограммныйИнтерфейс
#Область ОбщиеМетоды
Функция ПолучитьСтруктуруАвторизации(Знач AccessKey, Знач SecretKey, Знач Region, Знач URL, Знач Service = "s3") Экспорт
КлючПодписи = ПолучитьКлючПодписи(SecretKey, Region, Service);
КонецФункции
#КонецОбласти
#Область РаботаСБакетами
Функция СоздатьБакет(Знач Имя, Знач Авторизация) Экспорт
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ПолучитьКлючПодписи(Знач СекретныйКлюч, Знач Регион, Знач Сервис)
ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату();
КлючДанных = OPI_Криптография.HMACSHA256("AWS4" + СекретныйКлюч, Формат(ТекущаяДата, "ДФ=yyyyMMdd;"));
КлючРегиона = OPI_Криптография.HMACSHA256(КлючДанных, Регион);
КлючСервиса = OPI_Криптография.HMACSHA256(КлючРегиона, Сервис);
ФинальныйКлюч = OPI_Криптография.HMACSHA256(КлючСервиса, "aws4_request");
Возврат ФинальныйКлюч;
КонецФункции
#КонецОбласти

View File

@ -10,6 +10,7 @@
<module name="OPI_Neocities" file="core/Modules/OPI_Neocities.os"/>
<module name="OPI_Notion" file="core/Modules/OPI_Notion.os"/>
<module name="OPI_Ozon" file="core/Modules/OPI_Ozon.os"/>
<module name="OPI_S3" file="core/Modules/OPI_S3.os"/>
<module name="OPI_Slack" file="core/Modules/OPI_Slack.os"/>
<module name="OPI_Telegram" file="core/Modules/OPI_Telegram.os"/>
<module name="OPI_Twitter" file="core/Modules/OPI_Twitter.os"/>

View File

@ -2002,9 +2002,9 @@
КонецФункции
Функция ПолучитьОбщийМодуль(Знач Имя)
Модуль = Вычислить(Имя);
Возврат Модуль;
КонецФункции

View File

@ -221,6 +221,108 @@
КонецФункции
Функция ВыполнитьЗапрос(Знач Запрос, Знач Соединение, Знач Вид, Знач ФайлОтвета = "", Знач ПолныйОтвет = Ложь) Экспорт
Если ЗначениеЗаполнено(ФайлОтвета) Тогда
Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета);
Иначе
Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
КонецЕсли;
Если ЭтоПереадресация(Ответ) Тогда
URL = Ответ.Заголовки["Location"];
СтруктураURL = РазбитьURL(URL);
Сервер = СтруктураURL["Сервер"];
Адрес = СтруктураURL["Адрес"];
Соединение = СоздатьСоединение(Сервер);
Запрос.АдресРесурса = Адрес;
Ответ = ВыполнитьЗапрос(Запрос, Соединение, Вид, ФайлОтвета, ПолныйОтвет);
Иначе
ОбработатьОтвет(Ответ, ПолныйОтвет);
КонецЕсли;
Возврат Ответ;
КонецФункции
Функция СоздатьЗапросСТелом(Знач Адрес, Знач Параметры, Знач ДопЗаголовки, Знач JSON) Экспорт
ТипДанных = ?(JSON, "application/json; charset=utf-8", "application/x-www-form-urlencoded; charset=utf-8");
Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
УстановитьТелоЗапроса(Запрос, Параметры, JSON);
Возврат Запрос;
КонецФункции
Функция СоздатьЗапросМультипарт(Знач Адрес
, Знач Параметры
, Знач Файлы
, Знач ДопЗаголовки
, Знач ИмяФайла
, Знач ТипКонтента) Экспорт
Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
РазделительСтрок = Символы.ВК + Символы.ПС;
ТипДанных = "multipart/form-data; boundary=" + Boundary;
Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
ЗаписьТекста = Новый ЗаписьДанных(ИмяФайла
, КодировкаТекста.UTF8
, ПорядокБайтов.LittleEndian
, ""
, Ложь
, ""
, Ложь);
ЗаписатьПараметрыМультипарт(ЗаписьТекста, Boundary, Параметры);
ЗаписатьФайлыМультипарт(ЗаписьТекста, Boundary, ТипКонтента, Файлы);
ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок);
ЗаписьТекста.Закрыть();
Запрос.УстановитьИмяФайлаТела(ИмяФайла);
Возврат Запрос
КонецФункции
Функция СоздатьЗапросМультипартРелэйтед(Знач Адрес, Знач Файлы, Знач JSON, Знач ДопЗаголовки, Знач ИмяФайла) Экспорт
Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
РазделительСтрок = Символы.ВК + Символы.ПС;
ТипДанных = "multipart/related; boundary=" + Boundary;
Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
ЗаписьТекста = Новый ЗаписьДанных(ИмяФайла
, КодировкаТекста.UTF8
, ПорядокБайтов.LittleEndian
, ""
, Ложь
, ""
, Ложь);
ЗаписатьJSONМультипарт(ЗаписьТекста, Boundary, JSON);
ЗаписатьФайлыРелэйтед(ЗаписьТекста, Boundary, Файлы);
ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок);
ЗаписьТекста.Закрыть();
ДобавитьContentLength(Запрос);
Запрос.УстановитьИмяФайлаТела(ИмяФайла);
Возврат Запрос;
КонецФункции
#КонецОбласти
#КонецОбласти
@ -660,33 +762,13 @@
Параметры = Новый Структура;
КонецЕсли;
ТипДанных = ?(JSON, "application/json; charset=utf-8", "application/x-www-form-urlencoded; charset=utf-8");
СтруктураURL = РазбитьURL(URL);
Сервер = СтруктураURL["Сервер"];
Адрес = СтруктураURL["Адрес"];
Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
Запрос = СоздатьЗапросСТелом(Адрес, Параметры, ДопЗаголовки, JSON);
Соединение = СоздатьСоединение(Сервер);
УстановитьТелоЗапроса(Запрос, Параметры, JSON);
Если ЗначениеЗаполнено(ФайлОтвета) Тогда
Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета);
Иначе
Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
КонецЕсли;
Если ЭтоПереадресация(Ответ) Тогда
Ответ = ВыполнитьЗапросСТелом(Ответ.Заголовки["Location"]
, Вид
, Параметры
, ДопЗаголовки
, JSON
, ПолныйОтвет
, ФайлОтвета);
Иначе
ОбработатьОтвет(Ответ, ПолныйОтвет);
КонецЕсли;
Ответ = ВыполнитьЗапрос(Запрос, Соединение, Вид, ФайлОтвета, ПолныйОтвет);
Возврат Ответ;
@ -710,18 +792,7 @@
Запрос.УстановитьТелоИзДвоичныхДанных(Данные);
КонецЕсли;
Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
Если ЭтоПереадресация(Ответ) Тогда
Ответ = ВыполнитьЗапросСДвоичнымиДанными(Ответ.Заголовки["Location"]
, Вид
, Данные
, ДопЗаголовки
, ПолныйОтвет
, ТипДанных);
Иначе
ОбработатьОтвет(Ответ, ПолныйОтвет);
КонецЕсли;
Ответ = ВыполнитьЗапрос(Запрос, Соединение, Вид, , ПолныйОтвет);
Возврат Ответ;
@ -744,17 +815,7 @@
Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки);
Соединение = СоздатьСоединение(Сервер);
Если ЗначениеЗаполнено(ФайлОтвета) Тогда
Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета);
Иначе
Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
КонецЕсли;
Если ЭтоПереадресация(Ответ) Тогда
Ответ = ВыполнитьЗапросБезТела(Ответ.Заголовки["Location"], Вид, Параметры, ДопЗаголовки, ФайлОтвета);
Иначе
ОбработатьОтвет(Ответ);
КонецЕсли;
Ответ = ВыполнитьЗапрос(Запрос, Соединение, Вид, ФайлОтвета);
Возврат Ответ;
@ -776,54 +837,14 @@
Файлы = Новый Соответствие;
КонецЕсли;
Переадресация = 300;
Ошибка = 400;
Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
РазделительСтрок = Символы.ВК + Символы.ПС;
ТипДанных = "multipart/form-data; boundary=" + Boundary;
СтруктураURL = РазбитьURL(URL);
Сервер = СтруктураURL["Сервер"];
Адрес = СтруктураURL["Адрес"];
ТелоЗапроса = ПолучитьИмяВременногоФайла();
Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
Соединение = СоздатьСоединение(Сервер);
ТелоЗапроса = ПолучитьИмяВременногоФайла();
ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса
, КодировкаТекста.UTF8
, ПорядокБайтов.LittleEndian
, ""
, Ложь
, ""
, Ложь);
ЗаписатьПараметрыМультипарт(ЗаписьТекста, Boundary, Параметры);
ЗаписатьФайлыМультипарт(ЗаписьТекста, Boundary, ТипКонтента, Файлы);
ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок);
ЗаписьТекста.Закрыть();
Запрос.УстановитьИмяФайлаТела(ТелоЗапроса);
Если ЗначениеЗаполнено(ФайлОтвета) Тогда
Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета);
Иначе
Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
КонецЕсли;
ЭтоПереадресация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка;
Если ЭтоПереадресация Тогда
Ответ = ВыполнитьЗапросМультипарт(Ответ.Заголовки["Location"]
, Вид
, Параметры
, Файлы
, ТипКонтента
, ДопЗаголовки
, ФайлОтвета);
Иначе
ОбработатьОтвет(Ответ);
КонецЕсли;
Запрос = СоздатьЗапросМультипарт(Адрес, Параметры, Файлы, ДопЗаголовки, ТелоЗапроса, ТипКонтента);
Соединение = СоздатьСоединение(Сервер);
Ответ = ВыполнитьЗапрос(Запрос, Соединение, Вид, ФайлОтвета);
Запрос = Неопределено;
ЗаписьТекста = Неопределено;
@ -840,55 +861,15 @@
, Знач ДопЗаголовки = ""
, Знач ФайлОтвета = Неопределено)
Переадресация = 300;
Ошибка = 400;
Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
РазделительСтрок = Символы.ВК + Символы.ПС;
ТипДанных = "multipart/related; boundary=" + Boundary;
СтруктураURL = РазбитьURL(URL);
Сервер = СтруктураURL["Сервер"];
Адрес = СтруктураURL["Адрес"];
Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
Соединение = СоздатьСоединение(Сервер);
СтруктураURL = РазбитьURL(URL);
Сервер = СтруктураURL["Сервер"];
Адрес = СтруктураURL["Адрес"];
ТелоЗапроса = ПолучитьИмяВременногоФайла();
ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса
, КодировкаТекста.UTF8
, ПорядокБайтов.LittleEndian
, ""
, Ложь
, ""
, Ложь);
ЗаписатьJSONМультипарт(ЗаписьТекста, Boundary, JSON);
ЗаписатьФайлыРелэйтед(ЗаписьТекста, Boundary, Файлы);
Запрос = СоздатьЗапросМультипартРелэйтед(Адрес, Файлы, JSON, ДопЗаголовки, ТелоЗапроса);
Соединение = СоздатьСоединение(Сервер);
ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок);
ЗаписьТекста.Закрыть();
ДобавитьContentLength(Запрос);
Запрос.УстановитьИмяФайлаТела(ТелоЗапроса);
Если ЗначениеЗаполнено(ФайлОтвета) Тогда
Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета);
Иначе
Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
КонецЕсли;
ЭтоПереадресация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка;
Если ЭтоПереадресация Тогда
Ответ = ВыполнитьЗапросМультипартРелэйтед(Ответ.Заголовки["Location"]
, Вид
, JSON
, Файлы
, ДопЗаголовки
, ФайлОтвета);
Иначе
ОбработатьОтвет(Ответ);
КонецЕсли;
Ответ = ВыполнитьЗапрос(Запрос, Соединение, Вид, ФайлОтвета);
Запрос = Неопределено;
ЗаписьТекста = Неопределено;

View File

@ -0,0 +1,83 @@
// OneScript: ./OInt/core/Modules/OPI_S3.os
// Lib: S3
// CLI: s3
// MIT License
// Copyright (c) 2023 Anton Tsitavets
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// https://github.com/Bayselonarrend/OpenIntegrations
// BSLLS:Typo-off
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// BSLLS:NumberOfOptionalParams-off
// BSLLS:UsingServiceTag-off
// BSLLS:LineLength-off
//@skip-check module-structure-top-region
//@skip-check module-structure-method-in-regions
//@skip-check wrong-string-literal-content
//@skip-check method-too-many-params
// Раскомментировать, если выполняется OneScript
// #Использовать "../../tools"
#Область ПрограммныйИнтерфейс
#Область ОбщиеМетоды
Функция ПолучитьСтруктуруАвторизации(Знач AccessKey, Знач SecretKey, Знач Region, Знач URL, Знач Service = "s3") Экспорт
КлючПодписи = ПолучитьКлючПодписи(SecretKey, Region, Service);
КонецФункции
#КонецОбласти
#Область РаботаСБакетами
Функция СоздатьБакет(Знач Имя, Знач Авторизация) Экспорт
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ПолучитьКлючПодписи(Знач СекретныйКлюч, Знач Регион, Знач Сервис)
ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату();
КлючДанных = OPI_Криптография.HMACSHA256("AWS4" + СекретныйКлюч, Формат(ТекущаяДата, "ДФ=yyyyMMdd;"));
КлючРегиона = OPI_Криптография.HMACSHA256(КлючДанных, Регион);
КлючСервиса = OPI_Криптография.HMACSHA256(КлючРегиона, Сервис);
ФинальныйКлюч = OPI_Криптография.HMACSHA256(КлючСервиса, "aws4_request");
Возврат ФинальныйКлюч;
КонецФункции
#КонецОбласти

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="bf7a006c-94c1-4208-a8be-cbc7ae68489e">
<name>OPI_S3</name>
<synonym>
<key>ru</key>
<value>S3 (ОПИ)</value>
</synonym>
<server>true</server>
<externalConnection>true</externalConnection>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -1,4 +1,4 @@
// OneScript: ./OInt/tools/Modules/internal/Modules/OPI_Инструменты.os
// OneScript: ./OInt/tools/Modules/internal/Modules/OPI_Инструменты.os
// MIT License
@ -221,6 +221,108 @@
КонецФункции
Функция ВыполнитьЗапрос(Знач Запрос, Знач Соединение, Знач Вид, Знач ФайлОтвета = "", Знач ПолныйОтвет = Ложь) Экспорт
Если ЗначениеЗаполнено(ФайлОтвета) Тогда
Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета);
Иначе
Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
КонецЕсли;
Если ЭтоПереадресация(Ответ) Тогда
URL = Ответ.Заголовки["Location"];
СтруктураURL = РазбитьURL(URL);
Сервер = СтруктураURL["Сервер"];
Адрес = СтруктураURL["Адрес"];
Соединение = СоздатьСоединение(Сервер);
Запрос.АдресРесурса = Адрес;
Ответ = ВыполнитьЗапрос(Запрос, Соединение, Вид, ФайлОтвета, ПолныйОтвет);
Иначе
ОбработатьОтвет(Ответ, ПолныйОтвет);
КонецЕсли;
Возврат Ответ;
КонецФункции
Функция СоздатьЗапросСТелом(Знач Адрес, Знач Параметры, Знач ДопЗаголовки, Знач JSON) Экспорт
ТипДанных = ?(JSON, "application/json; charset=utf-8", "application/x-www-form-urlencoded; charset=utf-8");
Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
УстановитьТелоЗапроса(Запрос, Параметры, JSON);
Возврат Запрос;
КонецФункции
Функция СоздатьЗапросМультипарт(Знач Адрес
, Знач Параметры
, Знач Файлы
, Знач ДопЗаголовки
, Знач ИмяФайла
, Знач ТипКонтента) Экспорт
Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
РазделительСтрок = Символы.ВК + Символы.ПС;
ТипДанных = "multipart/form-data; boundary=" + Boundary;
Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
ЗаписьТекста = Новый ЗаписьДанных(ИмяФайла
, КодировкаТекста.UTF8
, ПорядокБайтов.LittleEndian
, ""
, Ложь
, ""
, Ложь);
ЗаписатьПараметрыМультипарт(ЗаписьТекста, Boundary, Параметры);
ЗаписатьФайлыМультипарт(ЗаписьТекста, Boundary, ТипКонтента, Файлы);
ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок);
ЗаписьТекста.Закрыть();
Запрос.УстановитьИмяФайлаТела(ИмяФайла);
Возврат Запрос
КонецФункции
Функция СоздатьЗапросМультипартРелэйтед(Знач Адрес, Знач Файлы, Знач JSON, Знач ДопЗаголовки, Знач ИмяФайла) Экспорт
Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
РазделительСтрок = Символы.ВК + Символы.ПС;
ТипДанных = "multipart/related; boundary=" + Boundary;
Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
ЗаписьТекста = Новый ЗаписьДанных(ИмяФайла
, КодировкаТекста.UTF8
, ПорядокБайтов.LittleEndian
, ""
, Ложь
, ""
, Ложь);
ЗаписатьJSONМультипарт(ЗаписьТекста, Boundary, JSON);
ЗаписатьФайлыРелэйтед(ЗаписьТекста, Boundary, Файлы);
ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок);
ЗаписьТекста.Закрыть();
ДобавитьContentLength(Запрос);
Запрос.УстановитьИмяФайлаТела(ИмяФайла);
Возврат Запрос;
КонецФункции
#КонецОбласти
#КонецОбласти
@ -660,33 +762,13 @@
Параметры = Новый Структура;
КонецЕсли;
ТипДанных = ?(JSON, "application/json; charset=utf-8", "application/x-www-form-urlencoded; charset=utf-8");
СтруктураURL = РазбитьURL(URL);
Сервер = СтруктураURL["Сервер"];
Адрес = СтруктураURL["Адрес"];
Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
Запрос = СоздатьЗапросСТелом(Адрес, Параметры, ДопЗаголовки, JSON);
Соединение = СоздатьСоединение(Сервер);
УстановитьТелоЗапроса(Запрос, Параметры, JSON);
Если ЗначениеЗаполнено(ФайлОтвета) Тогда
Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета);
Иначе
Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
КонецЕсли;
Если ЭтоПереадресация(Ответ) Тогда
Ответ = ВыполнитьЗапросСТелом(Ответ.Заголовки["Location"]
, Вид
, Параметры
, ДопЗаголовки
, JSON
, ПолныйОтвет
, ФайлОтвета);
Иначе
ОбработатьОтвет(Ответ, ПолныйОтвет);
КонецЕсли;
Ответ = ВыполнитьЗапрос(Запрос, Соединение, Вид, ФайлОтвета, ПолныйОтвет);
Возврат Ответ;
@ -710,18 +792,7 @@
Запрос.УстановитьТелоИзДвоичныхДанных(Данные);
КонецЕсли;
Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
Если ЭтоПереадресация(Ответ) Тогда
Ответ = ВыполнитьЗапросСДвоичнымиДанными(Ответ.Заголовки["Location"]
, Вид
, Данные
, ДопЗаголовки
, ПолныйОтвет
, ТипДанных);
Иначе
ОбработатьОтвет(Ответ, ПолныйОтвет);
КонецЕсли;
Ответ = ВыполнитьЗапрос(Запрос, Соединение, Вид, , ПолныйОтвет);
Возврат Ответ;
@ -744,17 +815,7 @@
Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки);
Соединение = СоздатьСоединение(Сервер);
Если ЗначениеЗаполнено(ФайлОтвета) Тогда
Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета);
Иначе
Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
КонецЕсли;
Если ЭтоПереадресация(Ответ) Тогда
Ответ = ВыполнитьЗапросБезТела(Ответ.Заголовки["Location"], Вид, Параметры, ДопЗаголовки, ФайлОтвета);
Иначе
ОбработатьОтвет(Ответ);
КонецЕсли;
Ответ = ВыполнитьЗапрос(Запрос, Соединение, Вид, ФайлОтвета);
Возврат Ответ;
@ -776,54 +837,14 @@
Файлы = Новый Соответствие;
КонецЕсли;
Переадресация = 300;
Ошибка = 400;
Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
РазделительСтрок = Символы.ВК + Символы.ПС;
ТипДанных = "multipart/form-data; boundary=" + Boundary;
СтруктураURL = РазбитьURL(URL);
Сервер = СтруктураURL["Сервер"];
Адрес = СтруктураURL["Адрес"];
ТелоЗапроса = ПолучитьИмяВременногоФайла();
Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
Соединение = СоздатьСоединение(Сервер);
ТелоЗапроса = ПолучитьИмяВременногоФайла();
ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса
, КодировкаТекста.UTF8
, ПорядокБайтов.LittleEndian
, ""
, Ложь
, ""
, Ложь);
ЗаписатьПараметрыМультипарт(ЗаписьТекста, Boundary, Параметры);
ЗаписатьФайлыМультипарт(ЗаписьТекста, Boundary, ТипКонтента, Файлы);
ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок);
ЗаписьТекста.Закрыть();
Запрос.УстановитьИмяФайлаТела(ТелоЗапроса);
Если ЗначениеЗаполнено(ФайлОтвета) Тогда
Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета);
Иначе
Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
КонецЕсли;
ЭтоПереадресация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка;
Если ЭтоПереадресация Тогда
Ответ = ВыполнитьЗапросМультипарт(Ответ.Заголовки["Location"]
, Вид
, Параметры
, Файлы
, ТипКонтента
, ДопЗаголовки
, ФайлОтвета);
Иначе
ОбработатьОтвет(Ответ);
КонецЕсли;
Запрос = СоздатьЗапросМультипарт(Адрес, Параметры, Файлы, ДопЗаголовки, ТелоЗапроса, ТипКонтента);
Соединение = СоздатьСоединение(Сервер);
Ответ = ВыполнитьЗапрос(Запрос, Соединение, Вид, ФайлОтвета);
Запрос = Неопределено;
ЗаписьТекста = Неопределено;
@ -840,55 +861,15 @@
, Знач ДопЗаголовки = ""
, Знач ФайлОтвета = Неопределено)
Переадресация = 300;
Ошибка = 400;
Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
РазделительСтрок = Символы.ВК + Символы.ПС;
ТипДанных = "multipart/related; boundary=" + Boundary;
СтруктураURL = РазбитьURL(URL);
Сервер = СтруктураURL["Сервер"];
Адрес = СтруктураURL["Адрес"];
Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
Соединение = СоздатьСоединение(Сервер);
СтруктураURL = РазбитьURL(URL);
Сервер = СтруктураURL["Сервер"];
Адрес = СтруктураURL["Адрес"];
ТелоЗапроса = ПолучитьИмяВременногоФайла();
ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса
, КодировкаТекста.UTF8
, ПорядокБайтов.LittleEndian
, ""
, Ложь
, ""
, Ложь);
ЗаписатьJSONМультипарт(ЗаписьТекста, Boundary, JSON);
ЗаписатьФайлыРелэйтед(ЗаписьТекста, Boundary, Файлы);
Запрос = СоздатьЗапросМультипартРелэйтед(Адрес, Файлы, JSON, ДопЗаголовки, ТелоЗапроса);
Соединение = СоздатьСоединение(Сервер);
ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок);
ЗаписьТекста.Закрыть();
ДобавитьContentLength(Запрос);
Запрос.УстановитьИмяФайлаТела(ТелоЗапроса);
Если ЗначениеЗаполнено(ФайлОтвета) Тогда
Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета);
Иначе
Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
КонецЕсли;
ЭтоПереадресация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка;
Если ЭтоПереадресация Тогда
Ответ = ВыполнитьЗапросМультипартРелэйтед(Ответ.Заголовки["Location"]
, Вид
, JSON
, Файлы
, ДопЗаголовки
, ФайлОтвета);
Иначе
ОбработатьОтвет(Ответ);
КонецЕсли;
Ответ = ВыполнитьЗапрос(Запрос, Соединение, Вид, ФайлОтвета);
Запрос = Неопределено;
ЗаписьТекста = Неопределено;

View File

@ -55,6 +55,7 @@
<commonModules>CommonModule.OPI_Ozon</commonModules>
<commonModules>CommonModule.OPI_Notion</commonModules>
<commonModules>CommonModule.OPI_Slack</commonModules>
<commonModules>CommonModule.OPI_S3</commonModules>
<commonModules>CommonModule.OPI_Telegram</commonModules>
<commonModules>CommonModule.OPI_Twitter</commonModules>
<commonModules>CommonModule.OPI_Viber</commonModules>