You've already forked OpenIntegrations
mirror of
https://github.com/Bayselonarrend/OpenIntegrations.git
synced 2026-05-22 10:05:29 +02:00
S3: Оптимизация дополнения заголовков и проверка доступности бакета
This commit is contained in:
+5523
-5508
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)
|
// Метод в документации AWS: [CreateBucket](@docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html)
|
||||||
//
|
//
|
||||||
// Параметры:
|
// Параметры:
|
||||||
// Наименование - Строка - Наименование бакета - name
|
// Наименование - Строка - Наименование бакета - name
|
||||||
// ОсновныеДанные - Структура Из КлючИЗначение - Основные данные запроса. См. ПолучитьСтруктуруДанных - data
|
// ОсновныеДанные - Структура Из КлючИЗначение - Основные данные запроса. См. ПолучитьСтруктуруДанных - data
|
||||||
// Заголовки - Соответствие Из КлючИЗначение - Дополнительные заголовки запроса, если необходимо - headers
|
// Каталог - Булево - Истина > Directory Bucket, Ложь > General Purpose Bucket - dir
|
||||||
|
// Заголовки - Соответствие Из КлючИЗначение - Дополнительные заголовки запроса, если необходимо - headers
|
||||||
//
|
//
|
||||||
// Возвращаемое значение:
|
// Возвращаемое значение:
|
||||||
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от хранилища
|
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от хранилища
|
||||||
Функция СоздатьБакет(Знач Наименование, Знач ОсновныеДанные, Знач Заголовки = Неопределено) Экспорт
|
Функция СоздатьБакет(Знач Наименование, Знач ОсновныеДанные, Знач Каталог = Истина, Знач Заголовки = Неопределено) Экспорт
|
||||||
|
|
||||||
Ответ = УправлениеБакетом(Наименование, ОсновныеДанные, "PUT", Заголовки);
|
Ответ = УправлениеБакетом(Наименование, ОсновныеДанные, Каталог, "PUT", Заголовки);
|
||||||
Возврат Ответ;
|
Возврат Ответ;
|
||||||
|
|
||||||
КонецФункции
|
КонецФункции
|
||||||
@@ -137,19 +138,54 @@
|
|||||||
// Метод в документации AWS: [DeleteBucket](@docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html)
|
// Метод в документации AWS: [DeleteBucket](@docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html)
|
||||||
//
|
//
|
||||||
// Параметры:
|
// Параметры:
|
||||||
// Наименование - Строка - Наименование бакета - name
|
// Наименование - Строка - Наименование бакета - name
|
||||||
// ОсновныеДанные - Структура Из КлючИЗначение - Основные данные запроса. См. ПолучитьСтруктуруДанных - data
|
// ОсновныеДанные - Структура Из КлючИЗначение - Основные данные запроса. См. ПолучитьСтруктуруДанных - data
|
||||||
// Заголовки - Соответствие Из КлючИЗначение - Дополнительные заголовки запроса, если необходимо - headers
|
// Каталог - Булево - Истина > Directory Bucket, Ложь > General Purpose Bucket - dir
|
||||||
|
// Заголовки - Соответствие Из КлючИЗначение - Дополнительные заголовки запроса, если необходимо - headers
|
||||||
//
|
//
|
||||||
// Возвращаемое значение:
|
// Возвращаемое значение:
|
||||||
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от хранилища
|
// Соответствие Из КлючИЗначение - сериализованный 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(КлючПодписи, СтрокаДляПодписи);
|
Сигнатура = OPI_Криптография.HMACSHA256(КлючПодписи, СтрокаДляПодписи);
|
||||||
Сигнатура = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(Сигнатура));
|
Сигнатура = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(Сигнатура));
|
||||||
|
|
||||||
КлючиЗаголовков = ПолучитьСтрокуКлючейЗаголовков(Запрос);
|
КлючиЗаголовков = ПолучитьСтрокуКлючейЗаголовков(Запрос);
|
||||||
|
|
||||||
ЗаголовокАвторизации = СформироватьЗаголовокАвторизации(AccessKey, Скоуп, Сигнатура, КлючиЗаголовков);
|
ЗаголовокАвторизации = СформироватьЗаголовокАвторизации(AccessKey, Скоуп, Сигнатура, КлючиЗаголовков);
|
||||||
|
|
||||||
Возврат ЗаголовокАвторизации;
|
Возврат ЗаголовокАвторизации;
|
||||||
@@ -307,8 +342,10 @@
|
|||||||
КаноническийЗапрос = OPI_Криптография.Хеш(КаноническийЗапрос, ХешФункция.SHA256);
|
КаноническийЗапрос = OPI_Криптография.Хеш(КаноническийЗапрос, ХешФункция.SHA256);
|
||||||
КаноническийЗапрос = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(КаноническийЗапрос));
|
КаноническийЗапрос = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(КаноническийЗапрос));
|
||||||
|
|
||||||
Для Н = 1 По 4 Цикл
|
Для Н = 1 По 4 Цикл
|
||||||
|
|
||||||
ШаблонСтроки = ШаблонСтроки + "%" + Строка(Н) + ?(Н = 4, "", Символы.ПС);
|
ШаблонСтроки = ШаблонСтроки + "%" + Строка(Н) + ?(Н = 4, "", Символы.ПС);
|
||||||
|
|
||||||
КонецЦикла;
|
КонецЦикла;
|
||||||
|
|
||||||
СтрокаПодписи = СтрШаблон(ШаблонСтроки, Алгоритм, ДатаISO, Скоуп, КаноническийЗапрос);
|
СтрокаПодписи = СтрШаблон(ШаблонСтроки, Алгоритм, ДатаISO, Скоуп, КаноническийЗапрос);
|
||||||
@@ -379,8 +416,9 @@
|
|||||||
СписокЗаголовков.СортироватьПоЗначению();
|
СписокЗаголовков.СортироватьПоЗначению();
|
||||||
|
|
||||||
СтрокаЗаголовков = СтрСоединить(СписокЗаголовков.ВыгрузитьЗначения(), Символы.ПС);
|
СтрокаЗаголовков = СтрСоединить(СписокЗаголовков.ВыгрузитьЗначения(), Символы.ПС);
|
||||||
|
СтрокаЗаголовков = СтрокаЗаголовков + Символы.ПС;
|
||||||
|
|
||||||
Возврат СтрокаЗаголовков + Символы.ПС;
|
Возврат СтрокаЗаголовков;
|
||||||
|
|
||||||
КонецФункции
|
КонецФункции
|
||||||
|
|
||||||
@@ -448,12 +486,24 @@
|
|||||||
|
|
||||||
#Область Прочее
|
#Область Прочее
|
||||||
|
|
||||||
Функция УправлениеБакетом(Знач Имя, Знач ОсновныеДанные, Знач Метод, Знач Заголовки)
|
Функция УправлениеБакетом(Знач Имя, Знач ОсновныеДанные, Знач Каталог, Знач Метод, Знач Заголовки)
|
||||||
|
|
||||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя);
|
OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя);
|
||||||
|
OPI_ПреобразованиеТипов.ПолучитьБулево(Каталог);
|
||||||
|
|
||||||
URL = ПолучитьURLСервиса(ОсновныеДанные);
|
URL = ПолучитьURLСервиса(ОсновныеДанные);
|
||||||
URL = URL + Имя;
|
|
||||||
|
Если Каталог Тогда
|
||||||
|
URL = URL + Имя;
|
||||||
|
Иначе
|
||||||
|
|
||||||
|
Если СтрНайти(URL, "://") Тогда
|
||||||
|
URL = СтрЗаменить(URL, "://", "://" + Имя + ".");
|
||||||
|
Иначе
|
||||||
|
URL = Имя + "." + URL;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
ОсновныеДанные.Вставить("URL", URL);
|
ОсновныеДанные.Вставить("URL", URL);
|
||||||
|
|
||||||
@@ -494,22 +544,10 @@
|
|||||||
|
|
||||||
КонецФункции
|
КонецФункции
|
||||||
|
|
||||||
Функция ПоддерживаемыйОтвет(Знач Ответ)
|
|
||||||
|
|
||||||
Возврат ТипЗнч(Ответ) = Тип("Строка")
|
|
||||||
Или ТипЗнч(Ответ) = Тип("Структура")
|
|
||||||
Или ТипЗнч(Ответ) = Тип("Соответствие")
|
|
||||||
Или ТипЗнч(Ответ) = Тип("Массив");
|
|
||||||
|
|
||||||
КонецФункции
|
|
||||||
|
|
||||||
Процедура ПроверитьОсновныеДанные(ОсновныеДанные)
|
Процедура ПроверитьОсновныеДанные(ОсновныеДанные)
|
||||||
|
|
||||||
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(ОсновныеДанные);
|
ТекстОшибки = "Ошибка получения авторизационных данных из структуры";
|
||||||
|
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(ОсновныеДанные, ТекстОшибки);
|
||||||
Если ТипЗнч(ОсновныеДанные) = Тип("Массив") Тогда
|
|
||||||
ВызватьИсключение "Ошибка получения авторизационных данных из структуры";
|
|
||||||
КонецЕсли;
|
|
||||||
|
|
||||||
МассивНеобходимыхПолей = Новый Массив;
|
МассивНеобходимыхПолей = Новый Массив;
|
||||||
МассивНеобходимыхПолей.Добавить("AccessKey");
|
МассивНеобходимыхПолей.Добавить("AccessKey");
|
||||||
@@ -526,22 +564,36 @@
|
|||||||
|
|
||||||
КонецПроцедуры
|
КонецПроцедуры
|
||||||
|
|
||||||
Процедура ДобавитьДополнительныеЗаголовки(Запрос, Знач Заголовки)
|
Процедура ДобавитьДополнительныеЗаголовки(Приемник, Знач Заголовки)
|
||||||
|
|
||||||
Если Не ЗначениеЗаполнено(Заголовки) Тогда
|
Если Не ЗначениеЗаполнено(Заголовки) Тогда
|
||||||
Возврат;
|
Возврат;
|
||||||
КонецЕсли;
|
КонецЕсли;
|
||||||
|
|
||||||
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Заголовки);
|
ТипПриемника = ТипЗнч(Приемник);
|
||||||
|
ТекстОшибки = "Ошибка установки дополнительных заголовков";
|
||||||
|
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(Заголовки, ТекстОшибки);
|
||||||
|
|
||||||
|
Если ТипПриемника = Тип("HTTPЗапрос") Тогда
|
||||||
|
|
||||||
Если ТипЗнч(Заголовки) = Тип("Массив") Тогда
|
Для Каждого Заголовок Из Заголовки Цикл
|
||||||
ВызватьИсключение "Ошибка установки дополнительных заголовков";
|
Приемник.Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
|
||||||
КонецЕсли;
|
КонецЦикла;
|
||||||
|
|
||||||
Для Каждого Заголовок Из Заголовки Цикл
|
Иначе
|
||||||
Запрос.Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
|
|
||||||
КонецЦикла;
|
Если Не ЗначениеЗаполнено(Приемник) Тогда
|
||||||
|
Приемник = Новый Соответствие;
|
||||||
|
Иначе
|
||||||
|
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(Заголовки, ТекстОшибки);
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
Для Каждого Заголовок Из Заголовки Цикл
|
||||||
|
Приемник.Вставить(Заголовок.Ключ, Заголовок.Значение);
|
||||||
|
КонецЦикла;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
КонецПроцедуры
|
КонецПроцедуры
|
||||||
|
|
||||||
#КонецОбласти
|
#КонецОбласти
|
||||||
|
|||||||
@@ -2112,6 +2112,7 @@
|
|||||||
|
|
||||||
S3_СоздатьБакет(ПараметрыТеста);
|
S3_СоздатьБакет(ПараметрыТеста);
|
||||||
S3_ПолучитьСписокБакетов(ПараметрыТеста);
|
S3_ПолучитьСписокБакетов(ПараметрыТеста);
|
||||||
|
S3_ПроверитьДоступностьБакета(ПараметрыТеста);
|
||||||
S3_УдалитьБакет(ПараметрыТеста);
|
S3_УдалитьБакет(ПараметрыТеста);
|
||||||
|
|
||||||
КонецПроцедуры
|
КонецПроцедуры
|
||||||
@@ -14618,9 +14619,21 @@
|
|||||||
|
|
||||||
ОсновныеДанные = OPI_S3.ПолучитьСтруктуруДанных(URL, AccessKey, SecretKey, Region);
|
ОсновныеДанные = 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
|
// END
|
||||||
|
|
||||||
@@ -14638,10 +14651,21 @@
|
|||||||
|
|
||||||
ОсновныеДанные = OPI_S3.ПолучитьСтруктуруДанных(URL, AccessKey, SecretKey, Region);
|
ОсновныеДанные = OPI_S3.ПолучитьСтруктуруДанных(URL, AccessKey, SecretKey, Region);
|
||||||
|
|
||||||
Имя = "opi-newbucket2";
|
// Directory bucket
|
||||||
|
|
||||||
|
Имя = "opi-dirbucket1";
|
||||||
|
|
||||||
Результат = OPI_S3.УдалитьБакет(Имя, ОсновныеДанные);
|
Результат = OPI_S3.УдалитьБакет(Имя, ОсновныеДанные);
|
||||||
|
|
||||||
|
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьБакет (DB)", "S3"); // SKIP
|
||||||
|
OPI_ПолучениеДанныхТестов.Проверка_S3Успех(Результат); // SKIP
|
||||||
|
|
||||||
|
// General purpose bucket
|
||||||
|
|
||||||
|
Имя = "opi-gpbucket1";
|
||||||
|
|
||||||
|
Результат = OPI_S3.УдалитьБакет(Имя, ОсновныеДанные, Ложь);
|
||||||
|
|
||||||
// END
|
// END
|
||||||
|
|
||||||
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьБакет", "S3");
|
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)
|
// Метод в документации AWS: [CreateBucket](@docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html)
|
||||||
//
|
//
|
||||||
// Параметры:
|
// Параметры:
|
||||||
// Наименование - Строка - Наименование бакета - name
|
// Наименование - Строка - Наименование бакета - name
|
||||||
// ОсновныеДанные - Структура Из КлючИЗначение - Основные данные запроса. См. ПолучитьСтруктуруДанных - data
|
// ОсновныеДанные - Структура Из КлючИЗначение - Основные данные запроса. См. ПолучитьСтруктуруДанных - data
|
||||||
// Заголовки - Соответствие Из КлючИЗначение - Дополнительные заголовки запроса, если необходимо - headers
|
// Каталог - Булево - Истина > Directory Bucket, Ложь > General Purpose Bucket - dir
|
||||||
|
// Заголовки - Соответствие Из КлючИЗначение - Дополнительные заголовки запроса, если необходимо - headers
|
||||||
//
|
//
|
||||||
// Возвращаемое значение:
|
// Возвращаемое значение:
|
||||||
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от хранилища
|
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от хранилища
|
||||||
Функция СоздатьБакет(Знач Наименование, Знач ОсновныеДанные, Знач Заголовки = Неопределено) Экспорт
|
Функция СоздатьБакет(Знач Наименование, Знач ОсновныеДанные, Знач Каталог = Истина, Знач Заголовки = Неопределено) Экспорт
|
||||||
|
|
||||||
Ответ = УправлениеБакетом(Наименование, ОсновныеДанные, "PUT", Заголовки);
|
Ответ = УправлениеБакетом(Наименование, ОсновныеДанные, Каталог, "PUT", Заголовки);
|
||||||
Возврат Ответ;
|
Возврат Ответ;
|
||||||
|
|
||||||
КонецФункции
|
КонецФункции
|
||||||
@@ -137,19 +138,54 @@
|
|||||||
// Метод в документации AWS: [DeleteBucket](@docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html)
|
// Метод в документации AWS: [DeleteBucket](@docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html)
|
||||||
//
|
//
|
||||||
// Параметры:
|
// Параметры:
|
||||||
// Наименование - Строка - Наименование бакета - name
|
// Наименование - Строка - Наименование бакета - name
|
||||||
// ОсновныеДанные - Структура Из КлючИЗначение - Основные данные запроса. См. ПолучитьСтруктуруДанных - data
|
// ОсновныеДанные - Структура Из КлючИЗначение - Основные данные запроса. См. ПолучитьСтруктуруДанных - data
|
||||||
// Заголовки - Соответствие Из КлючИЗначение - Дополнительные заголовки запроса, если необходимо - headers
|
// Каталог - Булево - Истина > Directory Bucket, Ложь > General Purpose Bucket - dir
|
||||||
|
// Заголовки - Соответствие Из КлючИЗначение - Дополнительные заголовки запроса, если необходимо - headers
|
||||||
//
|
//
|
||||||
// Возвращаемое значение:
|
// Возвращаемое значение:
|
||||||
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от хранилища
|
// Соответствие Из КлючИЗначение - сериализованный 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(КлючПодписи, СтрокаДляПодписи);
|
Сигнатура = OPI_Криптография.HMACSHA256(КлючПодписи, СтрокаДляПодписи);
|
||||||
Сигнатура = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(Сигнатура));
|
Сигнатура = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(Сигнатура));
|
||||||
|
|
||||||
КлючиЗаголовков = ПолучитьСтрокуКлючейЗаголовков(Запрос);
|
КлючиЗаголовков = ПолучитьСтрокуКлючейЗаголовков(Запрос);
|
||||||
|
|
||||||
ЗаголовокАвторизации = СформироватьЗаголовокАвторизации(AccessKey, Скоуп, Сигнатура, КлючиЗаголовков);
|
ЗаголовокАвторизации = СформироватьЗаголовокАвторизации(AccessKey, Скоуп, Сигнатура, КлючиЗаголовков);
|
||||||
|
|
||||||
Возврат ЗаголовокАвторизации;
|
Возврат ЗаголовокАвторизации;
|
||||||
@@ -307,8 +342,10 @@
|
|||||||
КаноническийЗапрос = OPI_Криптография.Хеш(КаноническийЗапрос, ХешФункция.SHA256);
|
КаноническийЗапрос = OPI_Криптография.Хеш(КаноническийЗапрос, ХешФункция.SHA256);
|
||||||
КаноническийЗапрос = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(КаноническийЗапрос));
|
КаноническийЗапрос = нРег(ПолучитьHexСтрокуИзДвоичныхДанных(КаноническийЗапрос));
|
||||||
|
|
||||||
Для Н = 1 По 4 Цикл
|
Для Н = 1 По 4 Цикл
|
||||||
|
|
||||||
ШаблонСтроки = ШаблонСтроки + "%" + Строка(Н) + ?(Н = 4, "", Символы.ПС);
|
ШаблонСтроки = ШаблонСтроки + "%" + Строка(Н) + ?(Н = 4, "", Символы.ПС);
|
||||||
|
|
||||||
КонецЦикла;
|
КонецЦикла;
|
||||||
|
|
||||||
СтрокаПодписи = СтрШаблон(ШаблонСтроки, Алгоритм, ДатаISO, Скоуп, КаноническийЗапрос);
|
СтрокаПодписи = СтрШаблон(ШаблонСтроки, Алгоритм, ДатаISO, Скоуп, КаноническийЗапрос);
|
||||||
@@ -379,8 +416,9 @@
|
|||||||
СписокЗаголовков.СортироватьПоЗначению();
|
СписокЗаголовков.СортироватьПоЗначению();
|
||||||
|
|
||||||
СтрокаЗаголовков = СтрСоединить(СписокЗаголовков.ВыгрузитьЗначения(), Символы.ПС);
|
СтрокаЗаголовков = СтрСоединить(СписокЗаголовков.ВыгрузитьЗначения(), Символы.ПС);
|
||||||
|
СтрокаЗаголовков = СтрокаЗаголовков + Символы.ПС;
|
||||||
|
|
||||||
Возврат СтрокаЗаголовков + Символы.ПС;
|
Возврат СтрокаЗаголовков;
|
||||||
|
|
||||||
КонецФункции
|
КонецФункции
|
||||||
|
|
||||||
@@ -448,12 +486,24 @@
|
|||||||
|
|
||||||
#Область Прочее
|
#Область Прочее
|
||||||
|
|
||||||
Функция УправлениеБакетом(Знач Имя, Знач ОсновныеДанные, Знач Метод, Знач Заголовки)
|
Функция УправлениеБакетом(Знач Имя, Знач ОсновныеДанные, Знач Каталог, Знач Метод, Знач Заголовки)
|
||||||
|
|
||||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя);
|
OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя);
|
||||||
|
OPI_ПреобразованиеТипов.ПолучитьБулево(Каталог);
|
||||||
|
|
||||||
URL = ПолучитьURLСервиса(ОсновныеДанные);
|
URL = ПолучитьURLСервиса(ОсновныеДанные);
|
||||||
URL = URL + Имя;
|
|
||||||
|
Если Каталог Тогда
|
||||||
|
URL = URL + Имя;
|
||||||
|
Иначе
|
||||||
|
|
||||||
|
Если СтрНайти(URL, "://") Тогда
|
||||||
|
URL = СтрЗаменить(URL, "://", "://" + Имя + ".");
|
||||||
|
Иначе
|
||||||
|
URL = Имя + "." + URL;
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
|
КонецЕсли;
|
||||||
|
|
||||||
ОсновныеДанные.Вставить("URL", URL);
|
ОсновныеДанные.Вставить("URL", URL);
|
||||||
|
|
||||||
@@ -494,22 +544,10 @@
|
|||||||
|
|
||||||
КонецФункции
|
КонецФункции
|
||||||
|
|
||||||
Функция ПоддерживаемыйОтвет(Знач Ответ)
|
|
||||||
|
|
||||||
Возврат ТипЗнч(Ответ) = Тип("Строка")
|
|
||||||
Или ТипЗнч(Ответ) = Тип("Структура")
|
|
||||||
Или ТипЗнч(Ответ) = Тип("Соответствие")
|
|
||||||
Или ТипЗнч(Ответ) = Тип("Массив");
|
|
||||||
|
|
||||||
КонецФункции
|
|
||||||
|
|
||||||
Процедура ПроверитьОсновныеДанные(ОсновныеДанные)
|
Процедура ПроверитьОсновныеДанные(ОсновныеДанные)
|
||||||
|
|
||||||
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(ОсновныеДанные);
|
ТекстОшибки = "Ошибка получения авторизационных данных из структуры";
|
||||||
|
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(ОсновныеДанные, ТекстОшибки);
|
||||||
Если ТипЗнч(ОсновныеДанные) = Тип("Массив") Тогда
|
|
||||||
ВызватьИсключение "Ошибка получения авторизационных данных из структуры";
|
|
||||||
КонецЕсли;
|
|
||||||
|
|
||||||
МассивНеобходимыхПолей = Новый Массив;
|
МассивНеобходимыхПолей = Новый Массив;
|
||||||
МассивНеобходимыхПолей.Добавить("AccessKey");
|
МассивНеобходимыхПолей.Добавить("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
|
// MIT License
|
||||||
|
|
||||||
@@ -2112,6 +2112,7 @@
|
|||||||
|
|
||||||
S3_СоздатьБакет(ПараметрыТеста);
|
S3_СоздатьБакет(ПараметрыТеста);
|
||||||
S3_ПолучитьСписокБакетов(ПараметрыТеста);
|
S3_ПолучитьСписокБакетов(ПараметрыТеста);
|
||||||
|
S3_ПроверитьДоступностьБакета(ПараметрыТеста);
|
||||||
S3_УдалитьБакет(ПараметрыТеста);
|
S3_УдалитьБакет(ПараметрыТеста);
|
||||||
|
|
||||||
КонецПроцедуры
|
КонецПроцедуры
|
||||||
@@ -14618,9 +14619,21 @@
|
|||||||
|
|
||||||
ОсновныеДанные = OPI_S3.ПолучитьСтруктуруДанных(URL, AccessKey, SecretKey, Region);
|
ОсновныеДанные = 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
|
// END
|
||||||
|
|
||||||
@@ -14638,10 +14651,21 @@
|
|||||||
|
|
||||||
ОсновныеДанные = OPI_S3.ПолучитьСтруктуруДанных(URL, AccessKey, SecretKey, Region);
|
ОсновныеДанные = OPI_S3.ПолучитьСтруктуруДанных(URL, AccessKey, SecretKey, Region);
|
||||||
|
|
||||||
Имя = "opi-newbucket2";
|
// Directory bucket
|
||||||
|
|
||||||
|
Имя = "opi-dirbucket1";
|
||||||
|
|
||||||
Результат = OPI_S3.УдалитьБакет(Имя, ОсновныеДанные);
|
Результат = OPI_S3.УдалитьБакет(Имя, ОсновныеДанные);
|
||||||
|
|
||||||
|
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьБакет (DB)", "S3"); // SKIP
|
||||||
|
OPI_ПолучениеДанныхТестов.Проверка_S3Успех(Результат); // SKIP
|
||||||
|
|
||||||
|
// General purpose bucket
|
||||||
|
|
||||||
|
Имя = "opi-gpbucket1";
|
||||||
|
|
||||||
|
Результат = OPI_S3.УдалитьБакет(Имя, ОсновныеДанные, Ложь);
|
||||||
|
|
||||||
// END
|
// END
|
||||||
|
|
||||||
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьБакет", "S3");
|
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НеНайдено(Результат);
|
||||||
|
|
||||||
|
КонецПроцедуры
|
||||||
|
|
||||||
#КонецОбласти
|
#КонецОбласти
|
||||||
|
|
||||||
#КонецОбласти
|
#КонецОбласти
|
||||||
|
|||||||
Reference in New Issue
Block a user