You've already forked OpenIntegrations
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:
+3389
-3366
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
|
||||
@@ -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Успех(Результат);
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
Reference in New Issue
Block a user