mirror of
https://github.com/Bayselonarrend/OpenIntegrations.git
synced 2024-12-27 02:43:54 +02:00
Оптимизация инструментов http
This commit is contained in:
parent
cc7a949392
commit
e6d7004aff
File diff suppressed because it is too large
Load Diff
83
src/ru/OInt/core/Modules/OPI_S3.os
Normal file
83
src/ru/OInt/core/Modules/OPI_S3.os
Normal 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");
|
||||
|
||||
Возврат ФинальныйКлюч;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
@ -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"/>
|
||||
|
@ -2002,9 +2002,9 @@
|
||||
КонецФункции
|
||||
|
||||
Функция ПолучитьОбщийМодуль(Знач Имя)
|
||||
|
||||
|
||||
Модуль = Вычислить(Имя);
|
||||
|
||||
|
||||
Возврат Модуль;
|
||||
КонецФункции
|
||||
|
||||
|
@ -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
|
||||
, Файлы
|
||||
, ДопЗаголовки
|
||||
, ФайлОтвета);
|
||||
Иначе
|
||||
ОбработатьОтвет(Ответ);
|
||||
КонецЕсли;
|
||||
Ответ = ВыполнитьЗапрос(Запрос, Соединение, Вид, ФайлОтвета);
|
||||
|
||||
Запрос = Неопределено;
|
||||
ЗаписьТекста = Неопределено;
|
||||
|
83
src/ru/OPI/src/CommonModules/OPI_S3/Module.bsl
Normal file
83
src/ru/OPI/src/CommonModules/OPI_S3/Module.bsl
Normal 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");
|
||||
|
||||
Возврат ФинальныйКлюч;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
11
src/ru/OPI/src/CommonModules/OPI_S3/OPI_S3.mdo
Normal file
11
src/ru/OPI/src/CommonModules/OPI_S3/OPI_S3.mdo
Normal 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>
|
@ -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
|
||||
, Файлы
|
||||
, ДопЗаголовки
|
||||
, ФайлОтвета);
|
||||
Иначе
|
||||
ОбработатьОтвет(Ответ);
|
||||
КонецЕсли;
|
||||
Ответ = ВыполнитьЗапрос(Запрос, Соединение, Вид, ФайлОтвета);
|
||||
|
||||
Запрос = Неопределено;
|
||||
ЗаписьТекста = Неопределено;
|
||||
|
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user