mirror of
https://github.com/Bayselonarrend/OpenIntegrations.git
synced 2025-01-14 04:35:49 +02:00
S3: Оптимизация дополнения заголовков и проверка доступности бакета
This commit is contained in:
parent
dee806fc16
commit
e3cb6ccb0e
File diff suppressed because it is too large
Load Diff
@ -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_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(Заголовки, ТекстОшибки);
|
||||
КонецЕсли;
|
||||
|
||||
Для Каждого Заголовок Из Заголовки Цикл
|
||||
Приемник.Вставить(Заголовок.Ключ, Заголовок.Значение);
|
||||
КонецЦикла;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
||||
|
@ -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НеНайдено(Результат);
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#КонецОбласти
|
||||
|
@ -1954,6 +1954,13 @@
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура Проверка_S3НеНайдено(Знач Результат) Экспорт
|
||||
|
||||
НеНайдено = Результат["status"] = 404;
|
||||
ОжидаетЧто(НеНайдено).Равно(Истина);
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#КонецОбласти
|
||||
@ -1990,9 +1997,9 @@
|
||||
КонецФункции
|
||||
|
||||
Функция ПолучитьОбщийМодуль(Знач Имя)
|
||||
|
||||
|
||||
Модуль = Вычислить(Имя);
|
||||
|
||||
|
||||
Возврат Модуль;
|
||||
КонецФункции
|
||||
|
||||
|
@ -151,6 +151,16 @@
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ПолучитьКоллекциюКлючИЗначение(Значение, Знач СообщениеОшибки) Экспорт
|
||||
|
||||
ПолучитьКоллекцию(Значение);
|
||||
|
||||
Если ТипЗнч(Значение) = Тип("Массив") Тогда
|
||||
ВызватьИсключение СообщениеОшибки;
|
||||
КонецЕсли;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ПолучитьМассив(Значение) Экспорт
|
||||
|
||||
Если ТипЗнч(Значение) = Тип("Массив") Тогда
|
||||
|
@ -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_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(Заголовки, ТекстОшибки);
|
||||
КонецЕсли;
|
||||
|
||||
Для Каждого Заголовок Из Заголовки Цикл
|
||||
Приемник.Вставить(Заголовок.Ключ, Заголовок.Значение);
|
||||
КонецЦикла;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
||||
|
@ -1954,6 +1954,13 @@
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура Проверка_S3НеНайдено(Знач Результат) Экспорт
|
||||
|
||||
НеНайдено = Результат["status"] = 404;
|
||||
ОжидаетЧто(НеНайдено).Равно(Истина);
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#КонецОбласти
|
||||
|
@ -151,6 +151,16 @@
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ПолучитьКоллекциюКлючИЗначение(Значение, Знач СообщениеОшибки) Экспорт
|
||||
|
||||
ПолучитьКоллекцию(Значение);
|
||||
|
||||
Если ТипЗнч(Значение) = Тип("Массив") Тогда
|
||||
ВызватьИсключение СообщениеОшибки;
|
||||
КонецЕсли;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ПолучитьМассив(Значение) Экспорт
|
||||
|
||||
Если ТипЗнч(Значение) = Тип("Массив") Тогда
|
||||
|
@ -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НеНайдено(Результат);
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#КонецОбласти
|
||||
|
Loading…
Reference in New Issue
Block a user