1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2026-05-22 10:05:29 +02:00

S3: Преобразование XML ответов в JSON и получение списка бакетов

This commit is contained in:
Anton
2024-11-13 22:27:15 +03:00
parent 33fb0a56ea
commit 5b84f62635
8 changed files with 3792 additions and 3465 deletions
+3389 -3366
View File
File diff suppressed because it is too large Load Diff
+120 -41
View File
@@ -74,12 +74,13 @@
// Отправляет простой http запрос без тела
//
// Параметры:
// Метод - Строка - HTTP метод - method
// ОсновныеДанные - Строка - Основные данные запроса (c полным URL). См. ПолучитьСтруктуруДанных - data
// Метод - Строка - HTTP метод - method
// ОсновныеДанные - Структура Из КлючИЗначение - Основные данные запроса (c полным URL). См. ПолучитьСтруктуруДанных - data
// Заголовки - Соответствие Из КлючИЗначение - Дополнительные заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от хранилища
Функция ОтправитьЗапросБезТела(Знач Метод, Знач ОсновныеДанные) Экспорт
Функция ОтправитьЗапросБезТела(Знач Метод, Знач ОсновныеДанные, Знач Заголовки = Неопределено) Экспорт
ПроверитьОсновныеДанные(ОсновныеДанные);
@@ -92,11 +93,13 @@
Запрос = OPI_Инструменты.СоздатьЗапрос(Адрес);
Соединение = OPI_Инструменты.СоздатьСоединение(Сервер, Защищенное);
ДобавитьДополнительныеЗаголовки(Запрос, Заголовки);
ЗаголовокАвторизации = СоздатьЗаголовокАвторизации(ОсновныеДанные, Запрос, Соединение, Метод);
Запрос.Заголовки.Вставить("Authorization", ЗаголовокАвторизации);
Ответ = OPI_Инструменты.ВыполнитьЗапрос(Запрос, Соединение, Метод, , Истина);
Ответ = OPI_Инструменты.ВыполнитьЗапрос(Запрос, Соединение, Метод, , Истина);
Ответ = ОформитьОтвет(Ответ);
Возврат Ответ;
@@ -110,15 +113,19 @@
// Создать бакет
// Создает новый бакет с выбранным именем
//
// Примечание:
// Метод в документации AWS: [CreateBucket](@docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html)
//
// Параметры:
// Наименование - Строка - Наименование бакета - name
// ОсновныеДанные - Строка - Основные данные запроса. См. ПолучитьСтруктуруДанных - data
// Наименование - Строка - Наименование бакета - name
// ОсновныеДанные - Структура Из КлючИЗначение - Основные данные запроса. См. ПолучитьСтруктуруДанных - data
// Заголовки - Соответствие Из КлючИЗначение - Дополнительные заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от хранилища
Функция СоздатьБакет(Знач Наименование, Знач ОсновныеДанные) Экспорт
Функция СоздатьБакет(Знач Наименование, Знач ОсновныеДанные, Знач Заголовки = Неопределено) Экспорт
Ответ = УправлениеБакетом(Наименование, ОсновныеДанные, "PUT");
Ответ = УправлениеБакетом(Наименование, ОсновныеДанные, "PUT", Заголовки);
Возврат Ответ;
КонецФункции
@@ -126,15 +133,57 @@
// Удалить бакет
// Удаляет бакет с выбранным именем
//
// Примечание:
// Метод в документации AWS: [DeleteBucket](@docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html)
//
// Параметры:
// Наименование - Строка - Наименование бакета - name
// ОсновныеДанные - Строка - Основные данные запроса. См. ПолучитьСтруктуруДанных - data
// Наименование - Строка - Наименование бакета - name
// ОсновныеДанные - Структура Из КлючИЗначение - Основные данные запроса. См. ПолучитьСтруктуруДанных - data
// Заголовки - Соответствие Из КлючИЗначение - Дополнительные заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от хранилища
Функция УдалитьБакет(Знач Наименование, Знач ОсновныеДанные) Экспорт
Функция УдалитьБакет(Знач Наименование, Знач ОсновныеДанные, Знач Заголовки = Неопределено) Экспорт
Ответ = УправлениеБакетом(Наименование, ОсновныеДанные, "DELETE", Заголовки);
Возврат Ответ;
КонецФункции
// Получить список бакетов
// Получает список бакетов. Возможно использование отборов, если они поддерживаются сервисом
//
// Примечание:
// Метод в документации AWS: [ListBuckets](@docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html)
//
// Параметры:
// ОсновныеДанные - Структура Из КлючИЗначение - Основные данные запроса. См. ПолучитьСтруктуруДанных - data
// Префикс - Строка - Отбор по началу имени, если необходимо - prefix
// Регион - Строка - Отбор по региону бакета, если необходимо - region
// ТокенСтраницы - Строка - Токен страницы, если используется пагинация - ctoken
// Заголовки - Соответствие Из КлючИЗначение - Дополнительные заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от хранилища
Функция ПолучитьСписокБакетов(Знач ОсновныеДанные
, Знач Префикс = ""
, Знач Регион = ""
, Знач ТокенСтраницы = ""
, Знач Заголовки = Неопределено) Экспорт
Параметры = Новый Соответствие;
OPI_Инструменты.ДобавитьПоле("bucket-region" , Регион , "Строка", Параметры);
OPI_Инструменты.ДобавитьПоле("continuation-token", ТокенСтраницы, "Строка", Параметры);
OPI_Инструменты.ДобавитьПоле("max-buckets" , 250 , "Строка", Параметры);
OPI_Инструменты.ДобавитьПоле("prefix" , Префикс , "Строка", Параметры);
URL = ПолучитьURLСервиса(ОсновныеДанные);
URL = URL + OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры);
ОсновныеДанные.Вставить("URL", URL);
Ответ = ОтправитьЗапросБезТела("GET", ОсновныеДанные, Заголовки);
Ответ = УправлениеБакетом(Наименование, ОсновныеДанные, "DELETE");
Возврат Ответ;
КонецФункции
@@ -206,13 +255,15 @@
ШаблонЗапроса = "";
Для Н = 1 По 6 Цикл
Для Н = 1 По 6 Цикл
ШаблонЗапроса = ШаблонЗапроса + "%" + Строка(Н) + ?(Н = 6, "", Символы.ПС);
КонецЦикла;
Метод = вРег(Метод);
СтрокаURI = ПолучитьСтрокуURI(Запрос);
СтрокаПараметров = ПолучитьСтрокуПараметров(СтрокаURI);
СтрокаПараметров = ПолучитьСтрокуПараметров(Запрос);
СтрокаЗаголовков = ПолучитьСтрокуЗаголовков(Запрос);
СтрокаКлючей = ПолучитьСтрокуКлючейЗаголовков(Запрос);
@@ -282,8 +333,9 @@
КонецФункции
Функция ПолучитьСтрокуПараметров(Знач URI)
Функция ПолучитьСтрокуПараметров(Знач Запрос)
URI = Запрос.АдресРесурса;
НачалоПараметров = СтрНайти(URI, "?");
Если НачалоПараметров = 0 Тогда
@@ -359,9 +411,15 @@
КонецФункции
Функция ПолучитьURLСервиса(Знач Авторизация)
Функция ПолучитьURLСервиса(Знач ОсновныеДанные)
URL = Авторизация["URL"];
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(ОсновныеДанные);
Если ТипЗнч(ОсновныеДанные) = Тип("Массив") Тогда
ВызватьИсключение "Ошибка получения авторизационных данных из структуры";
КонецЕсли;
URL = ОсновныеДанные["URL"];
OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
@@ -390,46 +448,49 @@
#Область Прочее
Функция УправлениеБакетом(Знач Имя, Знач ОсновныеДанные, Знач Метод)
Функция УправлениеБакетом(Знач Имя, Знач ОсновныеДанные, Знач Метод, Знач Заголовки)
OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя);
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(ОсновныеДанные);
Если ТипЗнч(ОсновныеДанные) = Тип("Массив") Тогда
ВызватьИсключение "Ошибка получения авторизационных данных из структуры";
КонецЕсли;
URL = ПолучитьURLСервиса(ОсновныеДанные);
URL = URL + Имя;
ОсновныеДанные.Вставить("URL", URL);
Ответ = ОтправитьЗапросБезТела(Метод, ОсновныеДанные);
Ответ = ОтправитьЗапросБезТела(Метод, ОсновныеДанные, Заголовки);
Возврат Ответ;
КонецФункции
Функция ОформитьОтвет(Знач Ответ)
ШаблонОтвета = Новый Структура();
Функция ОформитьОтвет(Знач Ответ, Знач ОжидаютсяДвоичные = Ложь)
Статус = Ответ.КодСостояния;
OPI_Инструменты.ОбработатьОтвет(Ответ);
Если ТипЗнч(Ответ) = Тип("ДвоичныеДанные") Тогда
Ответ = ПолучитьСтрокуИзДвоичныхДанных(Ответ);
КонецЕсли;
Если ПоддерживаемыйОтвет(Ответ) Тогда
ШаблонОтвета.Вставить("message", Ответ);
Если Не ОжидаютсяДвоичные Или Статус > 299 Тогда
ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();
ТелоОтвета = СокрЛП(ТелоОтвета);
Если ЗначениеЗаполнено(ТелоОтвета) Тогда
Попытка
ДанныеОтвета = OPI_Инструменты.ОбработатьXML(ТелоОтвета);
Исключение
ДанныеОтвета = Новый Структура("notXMLMessage", ТелоОтвета);
КонецПопытки;
Иначе
ДанныеОтвета = Новый Структура;
КонецЕсли;
ДанныеОтвета = Новый Структура("status,response", Статус, ДанныеОтвета);
Иначе
ШаблонОтвета.Вставить("message", "Неподдерживаемое сообщение");
ДанныеОтвета = Ответ.ПолучитьТелоКакДвоичныеДанные();
КонецЕсли;
ШаблонОтвета.Вставить("status", Статус);
Возврат ШаблонОтвета;
Возврат ДанныеОтвета;
КонецФункции
@@ -465,6 +526,24 @@
КонецПроцедуры
Процедура ДобавитьДополнительныеЗаголовки(Запрос, Знач Заголовки)
Если Не ЗначениеЗаполнено(Заголовки) Тогда
Возврат;
КонецЕсли;
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Заголовки);
Если ТипЗнч(Заголовки) = Тип("Массив") Тогда
ВызватьИсключение "Ошибка установки дополнительных заголовков";
КонецЕсли;
Для Каждого Заголовок Из Заголовки Цикл
Запрос.Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#КонецОбласти
@@ -2111,6 +2111,7 @@
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("S3_URL" , ПараметрыТеста);
S3_СоздатьБакет(ПараметрыТеста);
S3_ПолучитьСписокБакетов(ПараметрыТеста);
S3_УдалитьБакет(ПараметрыТеста);
КонецПроцедуры
@@ -14615,11 +14616,11 @@
SecretKey = ПараметрыФункции["S3_SecretKey"];
Region = "BTC";
Авторизация = OPI_S3.ПолучитьСтруктуруДанных(URL, AccessKey, SecretKey, Region);
ОсновныеДанные = OPI_S3.ПолучитьСтруктуруДанных(URL, AccessKey, SecretKey, Region);
Имя = "newbucket2";
Имя = "opi-newbucket2";
Результат = OPI_S3.СоздатьБакет(Имя, Авторизация);
Результат = OPI_S3.СоздатьБакет(Имя, ОсновныеДанные);
// END
@@ -14635,11 +14636,11 @@
SecretKey = ПараметрыФункции["S3_SecretKey"];
Region = "BTC";
Авторизация = OPI_S3.ПолучитьСтруктуруДанных(URL, AccessKey, SecretKey, Region);
ОсновныеДанные = OPI_S3.ПолучитьСтруктуруДанных(URL, AccessKey, SecretKey, Region);
Имя = "newbucket2";
Имя = "opi-newbucket2";
Результат = OPI_S3.УдалитьБакет(Имя, Авторизация);
Результат = OPI_S3.УдалитьБакет(Имя, ОсновныеДанные);
// END
@@ -14648,6 +14649,24 @@
КонецПроцедуры
Процедура S3_ПолучитьСписокБакетов(ПараметрыФункции)
URL = ПараметрыФункции["S3_URL"];
AccessKey = ПараметрыФункции["S3_AccessKey"];
SecretKey = ПараметрыФункции["S3_SecretKey"];
Region = "BTC";
ОсновныеДанные = OPI_S3.ПолучитьСтруктуруДанных(URL, AccessKey, SecretKey, Region);
Результат = OPI_S3.ПолучитьСписокБакетов(ОсновныеДанные);
// END
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокБакетов", "S3");
OPI_ПолучениеДанныхТестов.Проверка_S3Успех(Результат);
КонецПроцедуры
#КонецОбласти
#КонецОбласти
@@ -1990,9 +1990,9 @@
КонецФункции
Функция ПолучитьОбщийМодуль(Знач Имя)
Модуль = Вычислить(Имя);
Возврат Модуль;
КонецФункции
@@ -684,8 +684,52 @@
КонецФункции
Функция ОбработатьXML(XML) Экспорт
НачалоОбработкиXML(XML);
ВозвращаемоеЗначение = Новый Соответствие;
Пока XML.Прочитать() Цикл
ТипУзла = XML.ТипУзла;
ИмяУзла = XML.Имя;
СуществующееЗначение = ВозвращаемоеЗначение.Получить(ИмяУзла);
Если ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если СуществующееЗначение = Неопределено Тогда
ВозвращаемоеЗначение.Вставить(ИмяУзла, ОбработатьXML(XML));
Иначе
ЗначениеВМассив(СуществующееЗначение);
СуществующееЗначение.Добавить(ОбработатьXML(XML));
ВозвращаемоеЗначение.Вставить(ИмяУзла, СуществующееЗначение);
КонецЕсли;
Иначе
Если Не ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
ВозвращаемоеЗначение = XML.Значение;
XML.Прочитать();
КонецЕсли;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат ВозвращаемоеЗначение;
КонецФункции
Процедура ЗначениеВМассив(Значение) Экспорт
Если ТипЗнч(Значение) = Тип("Массив") Тогда
Возврат;
КонецЕсли;
Значение_ = Новый Массив;
Значение_.Добавить(Значение);
Значение = Значение_;
@@ -1267,6 +1311,16 @@
КонецПроцедуры
Процедура НачалоОбработкиXML(XML)
Если Не ТипЗнч(XML) = Тип("ЧтениеXML") Тогда
XML_ = XML;
XML = Новый ЧтениеXML;
XML.УстановитьСтроку(XML_);
КонецЕсли;
КонецПроцедуры
#Область GZip
// Описание структур см. здесь https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT
+121 -42
View File
@@ -1,4 +1,4 @@
// OneScript: ./OInt/core/Modules/OPI_S3.os
// OneScript: ./OInt/core/Modules/OPI_S3.os
// Lib: S3
// CLI: s3
@@ -74,12 +74,13 @@
// Отправляет простой http запрос без тела
//
// Параметры:
// Метод - Строка - HTTP метод - method
// ОсновныеДанные - Строка - Основные данные запроса (c полным URL). См. ПолучитьСтруктуруДанных - data
// Метод - Строка - HTTP метод - method
// ОсновныеДанные - Структура Из КлючИЗначение - Основные данные запроса (c полным URL). См. ПолучитьСтруктуруДанных - data
// Заголовки - Соответствие Из КлючИЗначение - Дополнительные заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от хранилища
Функция ОтправитьЗапросБезТела(Знач Метод, Знач ОсновныеДанные) Экспорт
Функция ОтправитьЗапросБезТела(Знач Метод, Знач ОсновныеДанные, Знач Заголовки = Неопределено) Экспорт
ПроверитьОсновныеДанные(ОсновныеДанные);
@@ -92,11 +93,13 @@
Запрос = OPI_Инструменты.СоздатьЗапрос(Адрес);
Соединение = OPI_Инструменты.СоздатьСоединение(Сервер, Защищенное);
ДобавитьДополнительныеЗаголовки(Запрос, Заголовки);
ЗаголовокАвторизации = СоздатьЗаголовокАвторизации(ОсновныеДанные, Запрос, Соединение, Метод);
Запрос.Заголовки.Вставить("Authorization", ЗаголовокАвторизации);
Ответ = OPI_Инструменты.ВыполнитьЗапрос(Запрос, Соединение, Метод, , Истина);
Ответ = OPI_Инструменты.ВыполнитьЗапрос(Запрос, Соединение, Метод, , Истина);
Ответ = ОформитьОтвет(Ответ);
Возврат Ответ;
@@ -110,15 +113,19 @@
// Создать бакет
// Создает новый бакет с выбранным именем
//
// Примечание:
// Метод в документации AWS: [CreateBucket](@docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html)
//
// Параметры:
// Наименование - Строка - Наименование бакета - name
// ОсновныеДанные - Строка - Основные данные запроса. См. ПолучитьСтруктуруДанных - data
// Наименование - Строка - Наименование бакета - name
// ОсновныеДанные - Структура Из КлючИЗначение - Основные данные запроса. См. ПолучитьСтруктуруДанных - data
// Заголовки - Соответствие Из КлючИЗначение - Дополнительные заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от хранилища
Функция СоздатьБакет(Знач Наименование, Знач ОсновныеДанные) Экспорт
Функция СоздатьБакет(Знач Наименование, Знач ОсновныеДанные, Знач Заголовки = Неопределено) Экспорт
Ответ = УправлениеБакетом(Наименование, ОсновныеДанные, "PUT");
Ответ = УправлениеБакетом(Наименование, ОсновныеДанные, "PUT", Заголовки);
Возврат Ответ;
КонецФункции
@@ -126,15 +133,57 @@
// Удалить бакет
// Удаляет бакет с выбранным именем
//
// Примечание:
// Метод в документации AWS: [DeleteBucket](@docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html)
//
// Параметры:
// Наименование - Строка - Наименование бакета - name
// ОсновныеДанные - Строка - Основные данные запроса. См. ПолучитьСтруктуруДанных - data
// Наименование - Строка - Наименование бакета - name
// ОсновныеДанные - Структура Из КлючИЗначение - Основные данные запроса. См. ПолучитьСтруктуруДанных - data
// Заголовки - Соответствие Из КлючИЗначение - Дополнительные заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от хранилища
Функция УдалитьБакет(Знач Наименование, Знач ОсновныеДанные) Экспорт
Функция УдалитьБакет(Знач Наименование, Знач ОсновныеДанные, Знач Заголовки = Неопределено) Экспорт
Ответ = УправлениеБакетом(Наименование, ОсновныеДанные, "DELETE", Заголовки);
Возврат Ответ;
КонецФункции
// Получить список бакетов
// Получает список бакетов. Возможно использование отборов, если они поддерживаются сервисом
//
// Примечание:
// Метод в документации AWS: [ListBuckets](@docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html)
//
// Параметры:
// ОсновныеДанные - Структура Из КлючИЗначение - Основные данные запроса. См. ПолучитьСтруктуруДанных - data
// Префикс - Строка - Отбор по началу имени, если необходимо - prefix
// Регион - Строка - Отбор по региону бакета, если необходимо - region
// ТокенСтраницы - Строка - Токен страницы, если используется пагинация - ctoken
// Заголовки - Соответствие Из КлючИЗначение - Дополнительные заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от хранилища
Функция ПолучитьСписокБакетов(Знач ОсновныеДанные
, Знач Префикс = ""
, Знач Регион = ""
, Знач ТокенСтраницы = ""
, Знач Заголовки = Неопределено) Экспорт
Параметры = Новый Соответствие;
OPI_Инструменты.ДобавитьПоле("bucket-region" , Регион , "Строка", Параметры);
OPI_Инструменты.ДобавитьПоле("continuation-token", ТокенСтраницы, "Строка", Параметры);
OPI_Инструменты.ДобавитьПоле("max-buckets" , 250 , "Строка", Параметры);
OPI_Инструменты.ДобавитьПоле("prefix" , Префикс , "Строка", Параметры);
URL = ПолучитьURLСервиса(ОсновныеДанные);
URL = URL + OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры);
ОсновныеДанные.Вставить("URL", URL);
Ответ = ОтправитьЗапросБезТела("GET", ОсновныеДанные, Заголовки);
Ответ = УправлениеБакетом(Наименование, ОсновныеДанные, "DELETE");
Возврат Ответ;
КонецФункции
@@ -206,13 +255,15 @@
ШаблонЗапроса = "";
Для Н = 1 По 6 Цикл
Для Н = 1 По 6 Цикл
ШаблонЗапроса = ШаблонЗапроса + "%" + Строка(Н) + ?(Н = 6, "", Символы.ПС);
КонецЦикла;
Метод = вРег(Метод);
СтрокаURI = ПолучитьСтрокуURI(Запрос);
СтрокаПараметров = ПолучитьСтрокуПараметров(СтрокаURI);
СтрокаПараметров = ПолучитьСтрокуПараметров(Запрос);
СтрокаЗаголовков = ПолучитьСтрокуЗаголовков(Запрос);
СтрокаКлючей = ПолучитьСтрокуКлючейЗаголовков(Запрос);
@@ -282,8 +333,9 @@
КонецФункции
Функция ПолучитьСтрокуПараметров(Знач URI)
Функция ПолучитьСтрокуПараметров(Знач Запрос)
URI = Запрос.АдресРесурса;
НачалоПараметров = СтрНайти(URI, "?");
Если НачалоПараметров = 0 Тогда
@@ -359,9 +411,15 @@
КонецФункции
Функция ПолучитьURLСервиса(Знач Авторизация)
Функция ПолучитьURLСервиса(Знач ОсновныеДанные)
URL = Авторизация["URL"];
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(ОсновныеДанные);
Если ТипЗнч(ОсновныеДанные) = Тип("Массив") Тогда
ВызватьИсключение "Ошибка получения авторизационных данных из структуры";
КонецЕсли;
URL = ОсновныеДанные["URL"];
OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
@@ -390,46 +448,49 @@
#Область Прочее
Функция УправлениеБакетом(Знач Имя, Знач ОсновныеДанные, Знач Метод)
Функция УправлениеБакетом(Знач Имя, Знач ОсновныеДанные, Знач Метод, Знач Заголовки)
OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя);
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(ОсновныеДанные);
Если ТипЗнч(ОсновныеДанные) = Тип("Массив") Тогда
ВызватьИсключение "Ошибка получения авторизационных данных из структуры";
КонецЕсли;
URL = ПолучитьURLСервиса(ОсновныеДанные);
URL = URL + Имя;
ОсновныеДанные.Вставить("URL", URL);
Ответ = ОтправитьЗапросБезТела(Метод, ОсновныеДанные);
Ответ = ОтправитьЗапросБезТела(Метод, ОсновныеДанные, Заголовки);
Возврат Ответ;
КонецФункции
Функция ОформитьОтвет(Знач Ответ)
ШаблонОтвета = Новый Структура();
Функция ОформитьОтвет(Знач Ответ, Знач ОжидаютсяДвоичные = Ложь)
Статус = Ответ.КодСостояния;
OPI_Инструменты.ОбработатьОтвет(Ответ);
Если ТипЗнч(Ответ) = Тип("ДвоичныеДанные") Тогда
Ответ = ПолучитьСтрокуИзДвоичныхДанных(Ответ);
КонецЕсли;
Если ПоддерживаемыйОтвет(Ответ) Тогда
ШаблонОтвета.Вставить("message", Ответ);
Если Не ОжидаютсяДвоичные Или Статус > 299 Тогда
ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();
ТелоОтвета = СокрЛП(ТелоОтвета);
Если ЗначениеЗаполнено(ТелоОтвета) Тогда
Попытка
ДанныеОтвета = OPI_Инструменты.ОбработатьXML(ТелоОтвета);
Исключение
ДанныеОтвета = Новый Структура("notXMLMessage", ТелоОтвета);
КонецПопытки;
Иначе
ДанныеОтвета = Новый Структура;
КонецЕсли;
ДанныеОтвета = Новый Структура("status,response", Статус, ДанныеОтвета);
Иначе
ШаблонОтвета.Вставить("message", "Неподдерживаемое сообщение");
ДанныеОтвета = Ответ.ПолучитьТелоКакДвоичныеДанные();
КонецЕсли;
ШаблонОтвета.Вставить("status", Статус);
Возврат ШаблонОтвета;
Возврат ДанныеОтвета;
КонецФункции
@@ -465,6 +526,24 @@
КонецПроцедуры
Процедура ДобавитьДополнительныеЗаголовки(Запрос, Знач Заголовки)
Если Не ЗначениеЗаполнено(Заголовки) Тогда
Возврат;
КонецЕсли;
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Заголовки);
Если ТипЗнч(Заголовки) = Тип("Массив") Тогда
ВызватьИсключение "Ошибка установки дополнительных заголовков";
КонецЕсли;
Для Каждого Заголовок Из Заголовки Цикл
Запрос.Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#КонецОбласти
@@ -1,4 +1,4 @@
// OneScript: ./OInt/tools/Modules/internal/Modules/OPI_Инструменты.os
// OneScript: ./OInt/tools/Modules/internal/Modules/OPI_Инструменты.os
// MIT License
@@ -684,8 +684,52 @@
КонецФункции
Функция ОбработатьXML(XML) Экспорт
НачалоОбработкиXML(XML);
ВозвращаемоеЗначение = Новый Соответствие;
Пока XML.Прочитать() Цикл
ТипУзла = XML.ТипУзла;
ИмяУзла = XML.Имя;
СуществующееЗначение = ВозвращаемоеЗначение.Получить(ИмяУзла);
Если ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если СуществующееЗначение = Неопределено Тогда
ВозвращаемоеЗначение.Вставить(ИмяУзла, ОбработатьXML(XML));
Иначе
ЗначениеВМассив(СуществующееЗначение);
СуществующееЗначение.Добавить(ОбработатьXML(XML));
ВозвращаемоеЗначение.Вставить(ИмяУзла, СуществующееЗначение);
КонецЕсли;
Иначе
Если Не ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
ВозвращаемоеЗначение = XML.Значение;
XML.Прочитать();
КонецЕсли;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат ВозвращаемоеЗначение;
КонецФункции
Процедура ЗначениеВМассив(Значение) Экспорт
Если ТипЗнч(Значение) = Тип("Массив") Тогда
Возврат;
КонецЕсли;
Значение_ = Новый Массив;
Значение_.Добавить(Значение);
Значение = Значение_;
@@ -1267,6 +1311,16 @@
КонецПроцедуры
Процедура НачалоОбработкиXML(XML)
Если Не ТипЗнч(XML) = Тип("ЧтениеXML") Тогда
XML_ = XML;
XML = Новый ЧтениеXML;
XML.УстановитьСтроку(XML_);
КонецЕсли;
КонецПроцедуры
#Область GZip
// Описание структур см. здесь https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT
@@ -1,4 +1,4 @@
// OneScript: ./OInt/tests/Modules/internal/OPI_Тесты.os
// OneScript: ./OInt/tests/Modules/internal/OPI_Тесты.os
// MIT License
@@ -2111,6 +2111,7 @@
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("S3_URL" , ПараметрыТеста);
S3_СоздатьБакет(ПараметрыТеста);
S3_ПолучитьСписокБакетов(ПараметрыТеста);
S3_УдалитьБакет(ПараметрыТеста);
КонецПроцедуры
@@ -14615,11 +14616,11 @@
SecretKey = ПараметрыФункции["S3_SecretKey"];
Region = "BTC";
Авторизация = OPI_S3.ПолучитьСтруктуруДанных(URL, AccessKey, SecretKey, Region);
ОсновныеДанные = OPI_S3.ПолучитьСтруктуруДанных(URL, AccessKey, SecretKey, Region);
Имя = "newbucket2";
Имя = "opi-newbucket2";
Результат = OPI_S3.СоздатьБакет(Имя, Авторизация);
Результат = OPI_S3.СоздатьБакет(Имя, ОсновныеДанные);
// END
@@ -14635,11 +14636,11 @@
SecretKey = ПараметрыФункции["S3_SecretKey"];
Region = "BTC";
Авторизация = OPI_S3.ПолучитьСтруктуруДанных(URL, AccessKey, SecretKey, Region);
ОсновныеДанные = OPI_S3.ПолучитьСтруктуруДанных(URL, AccessKey, SecretKey, Region);
Имя = "newbucket2";
Имя = "opi-newbucket2";
Результат = OPI_S3.УдалитьБакет(Имя, Авторизация);
Результат = OPI_S3.УдалитьБакет(Имя, ОсновныеДанные);
// END
@@ -14648,6 +14649,24 @@
КонецПроцедуры
Процедура S3_ПолучитьСписокБакетов(ПараметрыФункции)
URL = ПараметрыФункции["S3_URL"];
AccessKey = ПараметрыФункции["S3_AccessKey"];
SecretKey = ПараметрыФункции["S3_SecretKey"];
Region = "BTC";
ОсновныеДанные = OPI_S3.ПолучитьСтруктуруДанных(URL, AccessKey, SecretKey, Region);
Результат = OPI_S3.ПолучитьСписокБакетов(ОсновныеДанные);
// END
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокБакетов", "S3");
OPI_ПолучениеДанныхТестов.Проверка_S3Успех(Результат);
КонецПроцедуры
#КонецОбласти
#КонецОбласти