1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2025-01-14 04:35:49 +02:00

S3: Оптимизация дополнения заголовков и проверка доступности бакета

This commit is contained in:
Anton Titovets 2024-11-14 11:02:21 +03:00
parent dee806fc16
commit e3cb6ccb0e
9 changed files with 5844 additions and 5595 deletions

File diff suppressed because it is too large Load Diff

View File

@ -117,15 +117,16 @@
// Метод в документации AWS: [CreateBucket](@docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html)
//
// Параметры:
// Наименование - Строка - Наименование бакета - name
// ОсновныеДанные - Структура Из КлючИЗначение - Основные данные запроса. См. ПолучитьСтруктуруДанных - data
// Заголовки - Соответствие Из КлючИЗначение - Дополнительные заголовки запроса, если необходимо - headers
// Наименование - Строка - Наименование бакета - name
// ОсновныеДанные - Структура Из КлючИЗначение - Основные данные запроса. См. ПолучитьСтруктуруДанных - data
// Каталог - Булево - Истина > Directory Bucket, Ложь > General Purpose Bucket - dir
// Заголовки - Соответствие Из КлючИЗначение - Дополнительные заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от хранилища
Функция СоздатьБакет(Знач Наименование, Знач ОсновныеДанные, Знач Заголовки = Неопределено) Экспорт
Функция СоздатьБакет(Знач Наименование, Знач ОсновныеДанные, Знач Каталог = Истина, Знач Заголовки = Неопределено) Экспорт
Ответ = УправлениеБакетом(Наименование, ОсновныеДанные, "PUT", Заголовки);
Ответ = УправлениеБакетом(Наименование, ОсновныеДанные, Каталог, "PUT", Заголовки);
Возврат Ответ;
КонецФункции
@ -137,19 +138,54 @@
// Метод в документации AWS: [DeleteBucket](@docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html)
//
// Параметры:
// Наименование - Строка - Наименование бакета - name
// ОсновныеДанные - Структура Из КлючИЗначение - Основные данные запроса. См. ПолучитьСтруктуруДанных - data
// Заголовки - Соответствие Из КлючИЗначение - Дополнительные заголовки запроса, если необходимо - headers
// Наименование - Строка - Наименование бакета - name
// ОсновныеДанные - Структура Из КлючИЗначение - Основные данные запроса. См. ПолучитьСтруктуруДанных - data
// Каталог - Булево - Истина > Directory Bucket, Ложь > General Purpose Bucket - dir
// Заголовки - Соответствие Из КлючИЗначение - Дополнительные заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от хранилища
Функция УдалитьБакет(Знач Наименование, Знач ОсновныеДанные, Знач Заголовки = Неопределено) Экспорт
Функция УдалитьБакет(Знач Наименование, Знач ОсновныеДанные, Знач Каталог = Истина, Знач Заголовки = Неопределено) Экспорт
Ответ = УправлениеБакетом(Наименование, ОсновныеДанные, "DELETE", Заголовки);
Ответ = УправлениеБакетом(Наименование, ОсновныеДанные, Каталог, "DELETE", Заголовки);
Возврат Ответ;
КонецФункции
// Проверить доступность бакета
// Проверяет доступность бакета для текущего аккаунта или аккаунта по ID
//
// Примечание:
// Метод в документации AWS: [HeadBucket](@docs.aws.amazon.com/AmazonS3/latest/API/API_HeadBucket.html)
//
// Параметры:
// Наименование - Строка - Наименование бакета - name
// ОсновныеДанные - Структура Из КлючИЗначение - Основные данные запроса. См. ПолучитьСтруктуруДанных - data
// Каталог - Булево - Истина > Directory Bucket, Ложь > General Purpose Bucket - dir
// IDАккаунта - Строка - ID аккаунта для проверки, что бакет принадлежит ему - account
// Заголовки - Соответствие Из КлючИЗначение - Дополнительные заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от хранилища
Функция ПроверитьДоступностьБакета(Знач Наименование
, Знач ОсновныеДанные
, Знач Каталог = Истина
, Знач IDАккаунта = ""
, Знач Заголовки = Неопределено) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(IDАккаунта);
Если ЗначениеЗаполнено(IDАккаунта) Тогда
ЗаголовокАккаунта = Новый Соответствие();
ЗаголовокАккаунта.Вставить("x-amz-expected-bucket-owner", IDАккаунта);
ДобавитьДополнительныеЗаголовки(Заголовки, ЗаголовокАккаунта);
КонецЕсли;
Ответ = УправлениеБакетом(Наименование, ОсновныеДанные, Каталог, "HEAD", Заголовки);
Возврат Ответ;
КонецФункции
// Получить список бакетов
// Получает список бакетов. Возможно использование отборов, если они поддерживаются сервисом
//
@ -216,8 +252,7 @@
Сигнатура = OPI_Криптография.HMACSHA256(КлючПодписи, СтрокаДляПодписи);
Сигнатура = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(Сигнатура));
КлючиЗаголовков = ПолучитьСтрокуКлючейЗаголовков(Запрос);
КлючиЗаголовков = ПолучитьСтрокуКлючейЗаголовков(Запрос);
ЗаголовокАвторизации = СформироватьЗаголовокАвторизации(AccessKey, Скоуп, Сигнатура, КлючиЗаголовков);
Возврат ЗаголовокАвторизации;
@ -307,8 +342,10 @@
КаноническийЗапрос = OPI_Криптография.Хеш(КаноническийЗапрос, ХешФункция.SHA256);
КаноническийЗапрос = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(КаноническийЗапрос));
Для Н = 1 По 4 Цикл
Для Н = 1 По 4 Цикл
ШаблонСтроки = ШаблонСтроки + "%" + Строка(Н) + ?(Н = 4, "", Символы.ПС);
КонецЦикла;
СтрокаПодписи = СтрШаблон(ШаблонСтроки, Алгоритм, ДатаISO, Скоуп, КаноническийЗапрос);
@ -379,8 +416,9 @@
СписокЗаголовков.СортироватьПоЗначению();
СтрокаЗаголовков = СтрСоединить(СписокЗаголовков.ВыгрузитьЗначения(), Символы.ПС);
СтрокаЗаголовков = СтрокаЗаголовков + Символы.ПС;
Возврат СтрокаЗаголовков + Символы.ПС;
Возврат СтрокаЗаголовков;
КонецФункции
@ -448,12 +486,24 @@
#Область Прочее
Функция УправлениеБакетом(Знач Имя, Знач ОсновныеДанные, Знач Метод, Знач Заголовки)
Функция УправлениеБакетом(Знач Имя, Знач ОсновныеДанные, Знач Каталог, Знач Метод, Знач Заголовки)
OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя);
OPI_ПреобразованиеТипов.ПолучитьБулево(Каталог);
URL = ПолучитьURLСервиса(ОсновныеДанные);
URL = URL + Имя;
Если Каталог Тогда
URL = URL + Имя;
Иначе
Если СтрНайти(URL, "://") Тогда
URL = СтрЗаменить(URL, "://", "://" + Имя + ".");
Иначе
URL = Имя + "." + URL;
КонецЕсли;
КонецЕсли;
ОсновныеДанные.Вставить("URL", URL);
@ -494,22 +544,10 @@
КонецФункции
Функция ПоддерживаемыйОтвет(Знач Ответ)
Возврат ТипЗнч(Ответ) = Тип("Строка")
Или ТипЗнч(Ответ) = Тип("Структура")
Или ТипЗнч(Ответ) = Тип("Соответствие")
Или ТипЗнч(Ответ) = Тип("Массив");
КонецФункции
Процедура ПроверитьОсновныеДанные(ОсновныеДанные)
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(ОсновныеДанные);
Если ТипЗнч(ОсновныеДанные) = Тип("Массив") Тогда
ВызватьИсключение "Ошибка получения авторизационных данных из структуры";
КонецЕсли;
ТекстОшибки = "Ошибка получения авторизационных данных из структуры";
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(ОсновныеДанные, ТекстОшибки);
МассивНеобходимыхПолей = Новый Массив;
МассивНеобходимыхПолей.Добавить("AccessKey");
@ -526,22 +564,36 @@
КонецПроцедуры
Процедура ДобавитьДополнительныеЗаголовки(Запрос, Знач Заголовки)
Процедура ДобавитьДополнительныеЗаголовки(Приемник, Знач Заголовки)
Если Не ЗначениеЗаполнено(Заголовки) Тогда
Возврат;
КонецЕсли;
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Заголовки);
ТипПриемника = ТипЗнч(Приемник);
ТекстОшибки = "Ошибка установки дополнительных заголовков";
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(Заголовки, ТекстОшибки);
Если ТипПриемника = Тип("HTTPЗапрос") Тогда
Если ТипЗнч(Заголовки) = Тип("Массив") Тогда
ВызватьИсключение "Ошибка установки дополнительных заголовков";
КонецЕсли;
Для Каждого Заголовок Из Заголовки Цикл
Приемник.Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
КонецЦикла;
Для Каждого Заголовок Из Заголовки Цикл
Запрос.Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
КонецЦикла;
Иначе
Если Не ЗначениеЗаполнено(Приемник) Тогда
Приемник = Новый Соответствие;
Иначе
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(Заголовки, ТекстОшибки);
КонецЕсли;
Для Каждого Заголовок Из Заголовки Цикл
Приемник.Вставить(Заголовок.Ключ, Заголовок.Значение);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
#КонецОбласти

View File

@ -2112,6 +2112,7 @@
S3_СоздатьБакет(ПараметрыТеста);
S3_ПолучитьСписокБакетов(ПараметрыТеста);
S3_ПроверитьДоступностьБакета(ПараметрыТеста);
S3_УдалитьБакет(ПараметрыТеста);
КонецПроцедуры
@ -14618,9 +14619,21 @@
ОсновныеДанные = OPI_S3.ПолучитьСтруктуруДанных(URL, AccessKey, SecretKey, Region);
Имя = "opi-newbucket2";
// Directory bucket
Результат = OPI_S3.СоздатьБакет(Имя, ОсновныеДанные);
Наименование = "opi-dirbucket1";
Результат = OPI_S3.СоздатьБакет(Наименование, ОсновныеДанные);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБакет (DB)", "S3"); // SKIP
OPI_ПолучениеДанныхТестов.Проверка_S3Успех(Результат); // SKIP
ОсновныеДанные.Вставить("URL", ПараметрыФункции["S3_URL"]); // SKIP
// General purpose bucket
Наименование = "opi-gpbucket1";
Результат = OPI_S3.СоздатьБакет(Наименование, ОсновныеДанные, Ложь);
// END
@ -14638,10 +14651,21 @@
ОсновныеДанные = OPI_S3.ПолучитьСтруктуруДанных(URL, AccessKey, SecretKey, Region);
Имя = "opi-newbucket2";
// Directory bucket
Имя = "opi-dirbucket1";
Результат = OPI_S3.УдалитьБакет(Имя, ОсновныеДанные);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьБакет (DB)", "S3"); // SKIP
OPI_ПолучениеДанныхТестов.Проверка_S3Успех(Результат); // SKIP
// General purpose bucket
Имя = "opi-gpbucket1";
Результат = OPI_S3.УдалитьБакет(Имя, ОсновныеДанные, Ложь);
// END
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьБакет", "S3");
@ -14667,6 +14691,30 @@
КонецПроцедуры
Процедура S3_ПроверитьДоступностьБакета(ПараметрыФункции)
URL = ПараметрыФункции["S3_URL"];
AccessKey = ПараметрыФункции["S3_AccessKey"];
SecretKey = ПараметрыФункции["S3_SecretKey"];
Region = "BTC";
ОсновныеДанные = OPI_S3.ПолучитьСтруктуруДанных(URL, AccessKey, SecretKey, Region);
Наименование = "opi-dirbucket1";
Результат = OPI_S3.ПроверитьДоступностьБакета(Наименование, ОсновныеДанные, Истина);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПроверитьДоступностьБакета", "S3"); // SKIP
OPI_ПолучениеДанныхТестов.Проверка_S3Успех(Результат); // SKIP
Результат = OPI_S3.ПроверитьДоступностьБакета(Наименование, ОсновныеДанные, Истина, "1234");
// END
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПроверитьДоступностьБакета (аккаунт)", "S3");
OPI_ПолучениеДанныхТестов.Проверка_S3НеНайдено(Результат);
КонецПроцедуры
#КонецОбласти
#КонецОбласти

View File

@ -1954,6 +1954,13 @@
КонецПроцедуры
Процедура Проверка_S3НеНайдено(Знач Результат) Экспорт
НеНайдено = Результат["status"] = 404;
ОжидаетЧто(НеНайдено).Равно(Истина);
КонецПроцедуры
#КонецОбласти
#КонецОбласти
@ -1990,9 +1997,9 @@
КонецФункции
Функция ПолучитьОбщийМодуль(Знач Имя)
Модуль = Вычислить(Имя);
Возврат Модуль;
КонецФункции

View File

@ -151,6 +151,16 @@
КонецПроцедуры
Процедура ПолучитьКоллекциюКлючИЗначение(Значение, Знач СообщениеОшибки) Экспорт
ПолучитьКоллекцию(Значение);
Если ТипЗнч(Значение) = Тип("Массив") Тогда
ВызватьИсключение СообщениеОшибки;
КонецЕсли;
КонецПроцедуры
Процедура ПолучитьМассив(Значение) Экспорт
Если ТипЗнч(Значение) = Тип("Массив") Тогда

View File

@ -117,15 +117,16 @@
// Метод в документации AWS: [CreateBucket](@docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html)
//
// Параметры:
// Наименование - Строка - Наименование бакета - name
// ОсновныеДанные - Структура Из КлючИЗначение - Основные данные запроса. См. ПолучитьСтруктуруДанных - data
// Заголовки - Соответствие Из КлючИЗначение - Дополнительные заголовки запроса, если необходимо - headers
// Наименование - Строка - Наименование бакета - name
// ОсновныеДанные - Структура Из КлючИЗначение - Основные данные запроса. См. ПолучитьСтруктуруДанных - data
// Каталог - Булево - Истина > Directory Bucket, Ложь > General Purpose Bucket - dir
// Заголовки - Соответствие Из КлючИЗначение - Дополнительные заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от хранилища
Функция СоздатьБакет(Знач Наименование, Знач ОсновныеДанные, Знач Заголовки = Неопределено) Экспорт
Функция СоздатьБакет(Знач Наименование, Знач ОсновныеДанные, Знач Каталог = Истина, Знач Заголовки = Неопределено) Экспорт
Ответ = УправлениеБакетом(Наименование, ОсновныеДанные, "PUT", Заголовки);
Ответ = УправлениеБакетом(Наименование, ОсновныеДанные, Каталог, "PUT", Заголовки);
Возврат Ответ;
КонецФункции
@ -137,19 +138,54 @@
// Метод в документации AWS: [DeleteBucket](@docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html)
//
// Параметры:
// Наименование - Строка - Наименование бакета - name
// ОсновныеДанные - Структура Из КлючИЗначение - Основные данные запроса. См. ПолучитьСтруктуруДанных - data
// Заголовки - Соответствие Из КлючИЗначение - Дополнительные заголовки запроса, если необходимо - headers
// Наименование - Строка - Наименование бакета - name
// ОсновныеДанные - Структура Из КлючИЗначение - Основные данные запроса. См. ПолучитьСтруктуруДанных - data
// Каталог - Булево - Истина > Directory Bucket, Ложь > General Purpose Bucket - dir
// Заголовки - Соответствие Из КлючИЗначение - Дополнительные заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от хранилища
Функция УдалитьБакет(Знач Наименование, Знач ОсновныеДанные, Знач Заголовки = Неопределено) Экспорт
Функция УдалитьБакет(Знач Наименование, Знач ОсновныеДанные, Знач Каталог = Истина, Знач Заголовки = Неопределено) Экспорт
Ответ = УправлениеБакетом(Наименование, ОсновныеДанные, "DELETE", Заголовки);
Ответ = УправлениеБакетом(Наименование, ОсновныеДанные, Каталог, "DELETE", Заголовки);
Возврат Ответ;
КонецФункции
// Проверить доступность бакета
// Проверяет доступность бакета для текущего аккаунта или аккаунта по ID
//
// Примечание:
// Метод в документации AWS: [HeadBucket](@docs.aws.amazon.com/AmazonS3/latest/API/API_HeadBucket.html)
//
// Параметры:
// Наименование - Строка - Наименование бакета - name
// ОсновныеДанные - Структура Из КлючИЗначение - Основные данные запроса. См. ПолучитьСтруктуруДанных - data
// Каталог - Булево - Истина > Directory Bucket, Ложь > General Purpose Bucket - dir
// IDАккаунта - Строка - ID аккаунта для проверки, что бакет принадлежит ему - account
// Заголовки - Соответствие Из КлючИЗначение - Дополнительные заголовки запроса, если необходимо - headers
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от хранилища
Функция ПроверитьДоступностьБакета(Знач Наименование
, Знач ОсновныеДанные
, Знач Каталог = Истина
, Знач IDАккаунта = ""
, Знач Заголовки = Неопределено) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(IDАккаунта);
Если ЗначениеЗаполнено(IDАккаунта) Тогда
ЗаголовокАккаунта = Новый Соответствие();
ЗаголовокАккаунта.Вставить("x-amz-expected-bucket-owner", IDАккаунта);
ДобавитьДополнительныеЗаголовки(Заголовки, ЗаголовокАккаунта);
КонецЕсли;
Ответ = УправлениеБакетом(Наименование, ОсновныеДанные, Каталог, "HEAD", Заголовки);
Возврат Ответ;
КонецФункции
// Получить список бакетов
// Получает список бакетов. Возможно использование отборов, если они поддерживаются сервисом
//
@ -216,8 +252,7 @@
Сигнатура = OPI_Криптография.HMACSHA256(КлючПодписи, СтрокаДляПодписи);
Сигнатура = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(Сигнатура));
КлючиЗаголовков = ПолучитьСтрокуКлючейЗаголовков(Запрос);
КлючиЗаголовков = ПолучитьСтрокуКлючейЗаголовков(Запрос);
ЗаголовокАвторизации = СформироватьЗаголовокАвторизации(AccessKey, Скоуп, Сигнатура, КлючиЗаголовков);
Возврат ЗаголовокАвторизации;
@ -307,8 +342,10 @@
КаноническийЗапрос = OPI_Криптография.Хеш(КаноническийЗапрос, ХешФункция.SHA256);
КаноническийЗапрос = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(КаноническийЗапрос));
Для Н = 1 По 4 Цикл
Для Н = 1 По 4 Цикл
ШаблонСтроки = ШаблонСтроки + "%" + Строка(Н) + ?(Н = 4, "", Символы.ПС);
КонецЦикла;
СтрокаПодписи = СтрШаблон(ШаблонСтроки, Алгоритм, ДатаISO, Скоуп, КаноническийЗапрос);
@ -379,8 +416,9 @@
СписокЗаголовков.СортироватьПоЗначению();
СтрокаЗаголовков = СтрСоединить(СписокЗаголовков.ВыгрузитьЗначения(), Символы.ПС);
СтрокаЗаголовков = СтрокаЗаголовков + Символы.ПС;
Возврат СтрокаЗаголовков + Символы.ПС;
Возврат СтрокаЗаголовков;
КонецФункции
@ -448,12 +486,24 @@
#Область Прочее
Функция УправлениеБакетом(Знач Имя, Знач ОсновныеДанные, Знач Метод, Знач Заголовки)
Функция УправлениеБакетом(Знач Имя, Знач ОсновныеДанные, Знач Каталог, Знач Метод, Знач Заголовки)
OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя);
OPI_ПреобразованиеТипов.ПолучитьБулево(Каталог);
URL = ПолучитьURLСервиса(ОсновныеДанные);
URL = URL + Имя;
Если Каталог Тогда
URL = URL + Имя;
Иначе
Если СтрНайти(URL, "://") Тогда
URL = СтрЗаменить(URL, "://", "://" + Имя + ".");
Иначе
URL = Имя + "." + URL;
КонецЕсли;
КонецЕсли;
ОсновныеДанные.Вставить("URL", URL);
@ -494,22 +544,10 @@
КонецФункции
Функция ПоддерживаемыйОтвет(Знач Ответ)
Возврат ТипЗнч(Ответ) = Тип("Строка")
Или ТипЗнч(Ответ) = Тип("Структура")
Или ТипЗнч(Ответ) = Тип("Соответствие")
Или ТипЗнч(Ответ) = Тип("Массив");
КонецФункции
Процедура ПроверитьОсновныеДанные(ОсновныеДанные)
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(ОсновныеДанные);
Если ТипЗнч(ОсновныеДанные) = Тип("Массив") Тогда
ВызватьИсключение "Ошибка получения авторизационных данных из структуры";
КонецЕсли;
ТекстОшибки = "Ошибка получения авторизационных данных из структуры";
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(ОсновныеДанные, ТекстОшибки);
МассивНеобходимыхПолей = Новый Массив;
МассивНеобходимыхПолей.Добавить("AccessKey");
@ -526,22 +564,36 @@
КонецПроцедуры
Процедура ДобавитьДополнительныеЗаголовки(Запрос, Знач Заголовки)
Процедура ДобавитьДополнительныеЗаголовки(Приемник, Знач Заголовки)
Если Не ЗначениеЗаполнено(Заголовки) Тогда
Возврат;
КонецЕсли;
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Заголовки);
ТипПриемника = ТипЗнч(Приемник);
ТекстОшибки = "Ошибка установки дополнительных заголовков";
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(Заголовки, ТекстОшибки);
Если ТипПриемника = Тип("HTTPЗапрос") Тогда
Если ТипЗнч(Заголовки) = Тип("Массив") Тогда
ВызватьИсключение "Ошибка установки дополнительных заголовков";
КонецЕсли;
Для Каждого Заголовок Из Заголовки Цикл
Приемник.Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
КонецЦикла;
Для Каждого Заголовок Из Заголовки Цикл
Запрос.Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
КонецЦикла;
Иначе
Если Не ЗначениеЗаполнено(Приемник) Тогда
Приемник = Новый Соответствие;
Иначе
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(Заголовки, ТекстОшибки);
КонецЕсли;
Для Каждого Заголовок Из Заголовки Цикл
Приемник.Вставить(Заголовок.Ключ, Заголовок.Значение);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
#КонецОбласти

View File

@ -1954,6 +1954,13 @@
КонецПроцедуры
Процедура Проверка_S3НеНайдено(Знач Результат) Экспорт
НеНайдено = Результат["status"] = 404;
ОжидаетЧто(НеНайдено).Равно(Истина);
КонецПроцедуры
#КонецОбласти
#КонецОбласти

View File

@ -151,6 +151,16 @@
КонецПроцедуры
Процедура ПолучитьКоллекциюКлючИЗначение(Значение, Знач СообщениеОшибки) Экспорт
ПолучитьКоллекцию(Значение);
Если ТипЗнч(Значение) = Тип("Массив") Тогда
ВызватьИсключение СообщениеОшибки;
КонецЕсли;
КонецПроцедуры
Процедура ПолучитьМассив(Значение) Экспорт
Если ТипЗнч(Значение) = Тип("Массив") Тогда

View File

@ -1,4 +1,4 @@
// OneScript: ./OInt/tests/Modules/internal/OPI_Тесты.os
// OneScript: ./OInt/tests/Modules/internal/OPI_Тесты.os
// MIT License
@ -2112,6 +2112,7 @@
S3_СоздатьБакет(ПараметрыТеста);
S3_ПолучитьСписокБакетов(ПараметрыТеста);
S3_ПроверитьДоступностьБакета(ПараметрыТеста);
S3_УдалитьБакет(ПараметрыТеста);
КонецПроцедуры
@ -14618,9 +14619,21 @@
ОсновныеДанные = OPI_S3.ПолучитьСтруктуруДанных(URL, AccessKey, SecretKey, Region);
Имя = "opi-newbucket2";
// Directory bucket
Результат = OPI_S3.СоздатьБакет(Имя, ОсновныеДанные);
Наименование = "opi-dirbucket1";
Результат = OPI_S3.СоздатьБакет(Наименование, ОсновныеДанные);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБакет (DB)", "S3"); // SKIP
OPI_ПолучениеДанныхТестов.Проверка_S3Успех(Результат); // SKIP
ОсновныеДанные.Вставить("URL", ПараметрыФункции["S3_URL"]); // SKIP
// General purpose bucket
Наименование = "opi-gpbucket1";
Результат = OPI_S3.СоздатьБакет(Наименование, ОсновныеДанные, Ложь);
// END
@ -14638,10 +14651,21 @@
ОсновныеДанные = OPI_S3.ПолучитьСтруктуруДанных(URL, AccessKey, SecretKey, Region);
Имя = "opi-newbucket2";
// Directory bucket
Имя = "opi-dirbucket1";
Результат = OPI_S3.УдалитьБакет(Имя, ОсновныеДанные);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьБакет (DB)", "S3"); // SKIP
OPI_ПолучениеДанныхТестов.Проверка_S3Успех(Результат); // SKIP
// General purpose bucket
Имя = "opi-gpbucket1";
Результат = OPI_S3.УдалитьБакет(Имя, ОсновныеДанные, Ложь);
// END
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьБакет", "S3");
@ -14667,6 +14691,30 @@
КонецПроцедуры
Процедура S3_ПроверитьДоступностьБакета(ПараметрыФункции)
URL = ПараметрыФункции["S3_URL"];
AccessKey = ПараметрыФункции["S3_AccessKey"];
SecretKey = ПараметрыФункции["S3_SecretKey"];
Region = "BTC";
ОсновныеДанные = OPI_S3.ПолучитьСтруктуруДанных(URL, AccessKey, SecretKey, Region);
Наименование = "opi-dirbucket1";
Результат = OPI_S3.ПроверитьДоступностьБакета(Наименование, ОсновныеДанные, Истина);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПроверитьДоступностьБакета", "S3"); // SKIP
OPI_ПолучениеДанныхТестов.Проверка_S3Успех(Результат); // SKIP
Результат = OPI_S3.ПроверитьДоступностьБакета(Наименование, ОсновныеДанные, Истина, "1234");
// END
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПроверитьДоступностьБакета (аккаунт)", "S3");
OPI_ПолучениеДанныхТестов.Проверка_S3НеНайдено(Результат);
КонецПроцедуры
#КонецОбласти
#КонецОбласти