1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2025-03-25 21:39:21 +02:00
This commit is contained in:
Anton Titovets 2025-02-04 19:55:05 +03:00
parent d28ef45a9b
commit 7cd56951be
7 changed files with 6695 additions and 6776 deletions

File diff suppressed because it is too large Load Diff

View File

@ -60,12 +60,24 @@
Результат = ОбработатьЗапрос(Контекст);
Исключение
Ошибка = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
Информация = ИнформацияОбОшибке();
Результат = Новый Структура("result,error", Ложь, Информация.Описание);
Если СтрНайти(Информация.ИсходнаяСтрока, "ВызватьИсключение") = 0 Тогда
ФайлМодуля = Новый Файл(Информация.ИмяМодуля);
СтруктураИсключения = Новый Структура;
СтруктураИсключения.Вставить("module", ФайлМодуля.Имя);
СтруктураИсключения.Вставить("row" , Информация.НомерСтроки);
СтруктураИсключения.Вставить("code" , СокрЛП(Информация.ИсходнаяСтрока));
Результат.Вставить("exception", СтруктураИсключения);
КонецЕсли;
Контекст.Ответ.КодСостояния = 500;
Результат = Новый Структура("result,error", Ложь, "Исключение OneScript: " + Ошибка);
КонецПопытки;
JSON = OPI_Инструменты.JSONСтрокой(Результат);
@ -74,6 +86,7 @@
Контекст.Ответ.Записать(JSON);
#КонецЕсли
КонецПроцедуры
Функция ОбработатьЗапрос(Контекст)
@ -168,10 +181,11 @@
Запрос = Контекст.Запрос;
Тело = Запрос.Тело;
Заголовки = Запрос.Заголовки;
Если Не ЗначениеЗаполнено(Запрос.Форма) Тогда
ВызватьИсключение "Не найдены данные в формате multipart/form-data!";
КонецЕсли;
Параметры = OPI_Инструменты.РазобратьMultipart(Тело, Заголовки);
Параметры = OPI_Инструменты.РазобратьMultipart(Запрос.Форма);
Возврат ВыполнитьУниверсальнуюОбработку(Контекст, Обработчик, Параметры);
@ -207,9 +221,25 @@
КотелПараметров.Вставить(ТекущийКлюч, ИВФ);
ИначеЕсли ТипЗнч(ТекущееЗначение) = Тип("ФайлФормы") Тогда
ИВФ = ПолучитьИмяВременногоФайла();
ПотокФайла = ТекущееЗначение.ОткрытьПотокЧтения();
ПотокЗаписи = Новый ФайловыйПоток(ИВФ, РежимОткрытияФайла.ОткрытьИлиСоздать);
ПотокФайла.КопироватьВ(ПотокЗаписи);
ПотокФайла.Закрыть();
ПотокЗаписи.Закрыть();
МассивВФ.Добавить(ИВФ);
КотелПараметров.Вставить(ТекущийКлюч, ИВФ);
Иначе
OPI_ПреобразованиеТипов.ПолучитьСтроку(ТекущееЗначение);
КотелПараметров.Вставить(ТекущееЗначение, ИВФ);
КотелПараметров.Вставить(ТекущийКлюч, ТекущееЗначение);
КонецЕсли;
КонецЦикла;
@ -223,9 +253,9 @@
Иначе
ТекстВыполнения = СтруктураВыполнения["Результат"];
Выполнить(ТекстВыполнения);
Ответ = Новый Структура("result,data", Истина, Ответ);

View File

@ -2169,9 +2169,9 @@
КонецФункции
Функция ПолучитьОбщийМодуль(Знач Имя)
Модуль = Вычислить(Имя);
Возврат Модуль;
КонецФункции

View File

@ -1166,52 +1166,20 @@
КонецФункции
#КонецОбласти
#Область Multipart
// by Виталий Черкасов (cherkasovvitalik)
// https://infostart.ru/1c/articles/1522786/
Функция РазобратьMultipart(Знач Заголовки, Знач Тело) Экспорт
Функция РазобратьMultipart(Знач Форма) Экспорт
СоответствиеДанных = Новый Соответствие;
Разделитель = ПолучитьРазделительСоставногоСообщения(Заголовки);
Файлы = Форма.Файлы;
Для Каждого Поле Из Форма Цикл
Маркеры = Новый Массив();
Маркеры.Добавить(ПолучитьБуферДвоичныхДанныхИзСтроки("==" + Разделитель));
Маркеры.Добавить(ПолучитьБуферДвоичныхДанныхИзСтроки("==" + Разделитель + Символы.ПС));
Маркеры.Добавить(ПолучитьБуферДвоичныхДанныхИзСтроки("==" + Разделитель + Символы.ВК));
Маркеры.Добавить(ПолучитьБуферДвоичныхДанныхИзСтроки("==" + Разделитель + Символы.ВК + Символы.ПС));
Маркеры.Добавить(ПолучитьБуферДвоичныхДанныхИзСтроки("==" + Разделитель + "=="));
СоответствиеДанных.Вставить(Поле.Ключ, Поле.Значение);
ЧтениеДанных = Новый ЧтениеДанных(Тело);
ЧтениеДанных.ПропуститьДо(Маркеры);
КонецЦикла;
ОбщийБуферДвоичныхДанных = ЧтениеДанных.ПрочитатьВБуферДвоичныхДанных();
БуферыДвоичныхДанных = ОбщийБуферДвоичныхДанных.Разделить(Маркеры);
Для Каждого Файл Из Файлы Цикл
Для Каждого Буфер Из БуферыДвоичныхДанных Цикл
Поток = Новый ПотокВПамяти(Буфер);
ЧтениеЧасти = Новый ЧтениеДанных(Поток);
ЗаголовкиЧасти = ПрочитатьЗаголовки(ЧтениеЧасти);
ДанныеЧасти = ПолучитьИмяСообщения(ЗаголовкиЧасти);
ИмяЧасти = ДанныеЧасти["name"];
ИмяФайла = ДанныеЧасти["filename"];
ТекущиеДанные = ЧтениеЧасти.Прочитать().ПолучитьДвоичныеДанные();
Если Не ЗначениеЗаполнено(ИмяФайла) Тогда
ТекущиеДанные = ПолучитьСтрокуИзДвоичныхДанных(ТекущиеДанные);
КонецЕсли;
СоответствиеДанных.Вставить(ИмяЧасти, ТекущиеДанные);
ЧтениеЧасти.Закрыть();
Поток.Закрыть();
СоответствиеДанных.Вставить(Файл.Имя, Файл);
КонецЦикла;
@ -1219,106 +1187,6 @@
КонецФункции
Функция ПрочитатьЗаголовки(Чтение)
Заголовки = Новый Соответствие;
Пока Истина Цикл
ТекущаяСтрока = Чтение.ПрочитатьСтроку();
Если ТекущаяСтрока = "" Тогда
Прервать;
КонецЕсли;
Части = СтрРазделить(ТекущаяСтрока, ":");
ИмяЗаголовка = СокрЛП(Части[0]);
Значение = СокрЛП(Части[1]);
Заголовки.Вставить(ИмяЗаголовка, Значение);
КонецЦикла;
Возврат Заголовки;
КонецФункции
Функция ПолучитьРазделительСоставногоСообщения(Заголовки)
ТекстИсключения = "Для Multipart-запросов обязательно указание корректного Content-Type с boundary!";
ТипСодержимого = Заголовки.Получить("Content-Type");
Если Не ЗначениеЗаполнено(ТипСодержимого) Тогда
ВызватьИсключение ТекстИсключения;
КонецЕсли;
Свойства = СтрРазделить(ТипСодержимого, ";", Ложь);
Граница = Неопределено;
Для Каждого Свойство Из Свойства Цикл
Части = СтрРазделить(Свойство, "=", Ложь);
ИмяСвойства = СокрЛП(Части[0]);
Если ИмяСвойства <> "boundary" Тогда
Продолжить;
КонецЕсли;
Граница = СокрЛП(Части[1]);
Прервать;
КонецЦикла;
Если Не ЗначениеЗаполнено(Граница) Тогда
ВызватьИсключение ТекстИсключения;
Иначе
Возврат Граница;
КонецЕсли;
КонецФункции
Функция ПолучитьИмяСообщения(Заголовки)
ТекстИсключения = "Content-Disposition одной из частей не найден или имеет неверный формат!";
Описание = Заголовки.Получить("Content-Disposition");
СтруктураВозврата = Новый Структура("name,filename");
Если Не ЗначениеЗаполнено(Описание) Тогда
ВызватьИсключение ТекстИсключения;
КонецЕсли;
Свойства = СтрРазделить(Описание, ";", Ложь);
Имя = Неопределено;
Для Каждого Свойство Из Свойства Цикл
Части = СтрРазделить(Свойство, "=", Ложь);
ИмяСвойства = СокрЛП(Части[0]);
ИмяСвойства = нРег(ИмяСвойства);
Если ИмяСвойства = "name" Тогда
СтруктураВозврата["name"] = СокрЛП(Части[1]);
ИначеЕсли ИмяСвойства = "filename"Тогда
СтруктураВозврата["filename"] = СокрЛП(Части[1]);
Иначе
Продолжить;
КонецЕсли;
КонецЦикла;
Если Не ЗначениеЗаполнено(СтруктураВозврата["name"]) Тогда
ВызватьИсключение ТекстИсключения;
Иначе
Возврат СтруктураВозврата;
КонецЕсли;
КонецФункции
#КонецОбласти
#КонецОбласти

View File

@ -1166,7 +1166,7 @@
КонецФункции
Функция РазобратьMultipart(Знач Форма) Экспорт
Функция РазобратьFormData(Знач Форма) Экспорт
СоответствиеДанных = Новый Соответствие;
Файлы = Форма.Файлы;

View File

@ -113,10 +113,10 @@
// Добавляет новый обработчик в проект
//
// Параметры:
// Проект - Строка - Путь к файлу проекта - proj
// БиблиотекаОПИ - Строка - Имя библиотеки в CLI формате - lib
// ФункцияОПИ - Строка - Имя функции Открытого пакета интеграций - func
// Метод - Строка - HTTP метод, который будет обрабатывать обработчик: GET, POST, MULTIPART - method
// Проект - Строка - Путь к файлу проекта - proj
// БиблиотекаОПИ - Строка - Имя библиотеки в CLI формате - lib
// ФункцияОПИ - Строка - Имя функции Открытого пакета интеграций - func
// Метод - Строка - HTTP метод, который будет обрабатывать обработчик: GET, POST, FORM - method
//
// Возвращаемое значение:
// Структура Из КлючИЗначение - Результат добавления обработчика
@ -126,6 +126,7 @@
OPI_ПреобразованиеТипов.ПолучитьСтроку(ФункцияОПИ);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Метод);
Метод = вРег(Метод);
Результат = ПроверитьСуществованиеПроекта(Проект);
Если Не Результат["result"] Тогда
@ -133,11 +134,15 @@
Иначе
Проект = Результат["path"];
КонецЕсли;
Если Не Метод = "GET" И Не Метод = "POST" И Не Метод = "FORM" Тогда
Возврат СформироватьОтвет(Ложь, СтрШаблон("Неподдерживаемый метод %1!", Метод));
КонецЕсли;
СекретныйКлюч = ПолучитьУникальныйКлючОбработчика(Проект);
Если ТипЗнч(СекретныйКлюч) = Тип("Соответствие") Тогда
СекретныйКлюч.Вставить("message", "Failed to generate a handler UID. Try again");
СекретныйКлюч.Вставить("message", "Не удалось сформировать UID обработчика. Попробуйте еще раз!");
Возврат СекретныйКлюч;
КонецЕсли;
@ -241,7 +246,7 @@
Иначе
Если КоличествоЗаписей = 0 Тогда
Результат = СформироватьОтвет(Ложь, "Handler not found");
Результат = СформироватьОтвет(Ложь, "Обработчик не найден!");
КонецЕсли;
КонецЕсли;
@ -509,16 +514,16 @@
OPI_Инструменты.ВернутьУправляющиеПоследовательности(Путь);
ФайлПроекта = Новый Файл(Путь);
Текст = "The project file exists";
Текст = "Файл проекта существует!";
Результат = Истина;
Если Не ФайлПроекта.Существует() Тогда
Текст = "Project file not found at the specified path";
Текст = "Файл проекта по указанному пути не найден!";
Результат = Ложь;
КонецЕсли;
Если ФайлПроекта.ЭтоКаталог() Тогда
Текст = "A directory path was passed, not a project file";
Текст = "Передан путь к каталогу, а не к файлу проекта!";
Результат = Ложь;
КонецЕсли;
@ -557,7 +562,7 @@
Результат = СоздатьНовыйПроект(ПолныйПуть);
Если Результат["result"] Тогда
Текст = "The project file was created successfully";
Текст = "Файл проекта успешно создан!";
Ответ = СформироватьОтвет(Истина, Текст, ПолныйПуть);
Иначе
Ответ = Результат;
@ -565,7 +570,7 @@
Иначе
Текст = "The project file at the specified path already exists";
Текст = "Файл проекта по указанному пути уже существует!";
Ответ = СформироватьОтвет(Ложь, Текст, ПолныйПуть);
КонецЕсли;
@ -717,7 +722,7 @@
, Проект);
Иначе
Результат = СформироватьОтвет(Ложь, "Nothing to change");
Результат = СформироватьОтвет(Ложь, "Ничего не изменилось!");
КонецЕсли;
Возврат Результат;

View File

@ -121,7 +121,7 @@
Метод = вРег(Контекст.Запрос.Метод);
МетодОбработчика = вРег(Обработчик["method"]);
МетодПроверки = ?(МетодОбработчика = "MULTIPART", "POST", МетодОбработчика);
МетодПроверки = ?(МетодОбработчика = "FORM", "POST", МетодОбработчика);
Если Не Метод = МетодПроверки Тогда
Возврат ОшибкаОбработки(Контекст, 405, "Метод " + Метод + " недоступен для этого обработчика!");
@ -135,9 +135,9 @@
Результат = ВыполнитьОбработкуPost(Контекст, Обработчик);
ИначеЕсли МетодОбработчика = "MULTIPART" Тогда
ИначеЕсли МетодОбработчика = "FORM" Тогда
Результат = ВыполнитьОбработкуMultipart(Контекст, Обработчик);
Результат = ВыполнитьОбработкуFormData(Контекст, Обработчик);
Иначе
@ -173,7 +173,7 @@
КонецФункции
Функция ВыполнитьОбработкуMultipart(Контекст, Обработчик)
Функция ВыполнитьОбработкуFormData(Контекст, Обработчик)
#Если Клиент Тогда
ВызватьИсключение "Метод недоступен на клиенте!";
@ -182,10 +182,10 @@
Запрос = Контекст.Запрос;
Если Не ЗначениеЗаполнено(Запрос.Форма) Тогда
ВызватьИсключение "Не найдены данные в формате multipart/form-data!";
ВызватьИсключение "Не найдены данные формы в запросе!";
КонецЕсли;
Параметры = OPI_Инструменты.РазобратьMultipart(Запрос.Форма);
Параметры = OPI_Инструменты.РазобратьFormData(Запрос.Форма);
Возврат ВыполнитьУниверсальнуюОбработку(Контекст, Обработчик, Параметры);
@ -223,6 +223,7 @@
ИначеЕсли ТипЗнч(ТекущееЗначение) = Тип("ФайлФормы") Тогда
//@skip-check missing-temporary-file-deletion
ИВФ = ПолучитьИмяВременногоФайла();
ПотокФайла = ТекущееЗначение.ОткрытьПотокЧтения();