1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2025-04-09 07:14:16 +02:00

Main build (Jenkins)

This commit is contained in:
Vitaly the Alpaca (bot) 2025-02-03 16:17:56 +03:00
parent 3687dab26a
commit 4ec224d366
12 changed files with 6895 additions and 6541 deletions

File diff suppressed because it is too large Load Diff

View File

@ -283,9 +283,9 @@ Function ProcessTMAData(Val DataString, Val Token) Export
Return ReturnMapping;
#Else
Return Undefined;
#EndIf
EndFunction

View File

@ -52,6 +52,8 @@ Var OPIObject Export;
Procedure MainHandler(Context, NexHandler) Export
Try
Result = ProcessRequest(Context);
Except
@ -60,7 +62,7 @@ Procedure MainHandler(Context, NexHandler) Export
Context.Response.StatusCode = 500;
Result = New Structure("result,error", False, "OneScript exception: " + Error);
Result = New Structure("result,error", False, "OneScript exception " + Error);
EndTry;
@ -69,6 +71,10 @@ Procedure MainHandler(Context, NexHandler) Export
Context.Response.ContentType = "application/json;charset=UTF8";
Context.Response.Write(JSON);
Raise "The method is not available on the client!";
EndProcedure
Function ProcessRequest(Context)
@ -101,16 +107,20 @@ EndFunction
Function ExecuteProcessing(Context, Handler)
Method = Upper(Context.Request.Method);
Method = Upper(Context.Request.Method);
HandlerMethod = Upper(Handler["method"]);
MethodForCheck = ?(HandlerMethod = "MULTIPART", "POST", HandlerMethod);
If Not Method = Upper(Handler["method"]) Then
Return ProcessingError(Context, 405, "Method not allowed for this handler");
If Not Method = MethodForCheck Then
Return ProcessingError(Context, 405, "Method " + Method + " is not available for this handler!");
EndIf;
If Method = "GET" Then
Result = ExecuteProcessingGet(Context, Handler);
If HandlerMethod = "GET" Then
Result = ExecuteProcessingGet(Context, Handler);
ElsIf HandlerMethod = "POST" Then
Result = ExecuteProcessinPost(Context, Handler);
Else
Result = ProcessingError(Context, 405, "Method not allowed for this handler");
Result = ProcessingError(Context, 405, "Method " + Method + " is not available for this handler!");
EndIf;
Return Result;
@ -123,6 +133,61 @@ Function ExecuteProcessingGet(Context, Handler)
Parameters = Request.Parameters;
Arguments = Handler["args"];
ParametersBoiler = FormParametersBoiler(Arguments, Parameters);
Return ExecuteUniversalProcessing(Context
, Handler["library"]
, Handler["function"]
, ParametersBoiler);
EndFunction
Function ExecuteProcessinPost(Context, Handler)
Request = Context.Request;
Arguments = Handler["args"];
Body = Request.Body;
JSONReader = New JSONReader();
JSONReader.OpenStream(Body);
Parameters = ReadJSON(JSONReader, True);
JSONReader.Close();
ParametersBoiler = FormParametersBoiler(Arguments, Parameters);
Return ExecuteUniversalProcessing(Context
, Handler["library"]
, Handler["function"]
, ParametersBoiler);
EndFunction
Function ExecuteUniversalProcessing(Context, Command, Method, Parameters)
ExecutionStructure = OPIObject.FormMethodCallString(Parameters, Command, Method);
Response = Undefined;
If ExecutionStructure["Error"] Then
Response = New Structure("result,error", False, "Error in the name of a command or handler function!");
Else
ExecutionText = ExecutionStructure["Result"];
Execute(ExecutionText);
Response = New Structure("result,data", True, Response);
EndIf;
Return Response;
EndFunction
Function FormParametersBoiler(Arguments, Parameters)
StrictArguments = New Map;
NonStrictArguments = New Map;
@ -157,33 +222,7 @@ Function ExecuteProcessingGet(Context, Handler)
ParametersBoiler.Insert(Argument.Key, Argument.Value);
EndDo;
Return ExecuteUniversalProcessing(Context
, Handler["library"]
, Handler["function"]
, ParametersBoiler);
EndFunction
Function ExecuteUniversalProcessing(Context, Command, Method, Parameters)
ExecutionStructure = OPIObject.FormMethodCallString(Parameters, Command, Method);
Response = Undefined;
If ExecutionStructure["Error"] Then
Response = New Structure("result,error", False, "Error in a handler command or method");
Else
ExecutionText = ExecutionStructure["Result"];
Execute(ExecutionText);
Response = New Structure("result,data", True, Response);
EndIf;
Return Response;
Return ParametersBoiler;
EndFunction

View File

@ -1168,6 +1168,144 @@ EndFunction
#EndRegion
#Region Multipart
// by Vitaly Cherkasov (cherkasovvitalik)
// https://infostart.ru/1c/articles/1522786/
Function ParseMultipart(Val Headers, Val Body) Export
DataMap = New Map;
Delimiter = GetMultipartMessageSeparator(Headers);
Markers = New Array();
Markers.Add(ПолучитьБуферДвоичныхДанныхИзСтроки("==" + Delimiter));
Markers.Add(ПолучитьБуферДвоичныхДанныхИзСтроки("==" + Delimiter + Chars.LF));
Markers.Add(ПолучитьБуферДвоичныхДанныхИзСтроки("==" + Delimiter + Chars.CR));
Markers.Add(ПолучитьБуферДвоичныхДанныхИзСтроки("==" + Delimiter + Chars.CR + Chars.LF));
Markers.Add(ПолучитьБуферДвоичныхДанныхИзСтроки("==" + Delimiter + "=="));
DataReader = New DataReader(Body);
DataReader.SkipTo(Markers);
CommonBinaryDataBuffer = DataReader.ReadIntoBinaryDataBuffer();
BinaryBuffers = CommonBinaryDataBuffer.Split(Markers);
For Each Buffer In BinaryBuffers Do
Stream = New MemoryStream(Buffer);
PartReading = New DataReader(Stream);
PartHeaders = ReadHeaders(PartReading);
PartName = GetMessageName(PartHeaders);
CurrentData = PartReading.Read().GetBinaryData();
DataMap.Insert(PartName, CurrentData);
PartReading.Close();
Stream.Close();
EndDo;
Return DataMap;
EndFunction
Function ReadHeaders(Reading)
Headers = New Map;
While True Do
CurrentRow = Reading.ReadLine();
If CurrentRow = "" Then
Break;
EndIf;
Parts = StrSplit(CurrentRow, ":");
HeaderName = TrimAll(Parts[0]);
Value = TrimAll(Parts[1]);
Headers.Insert(HeaderName, Value);
EndDo;
Return Headers;
EndFunction
Function GetMultipartMessageSeparator(Headers)
ExceptionText = "For Multipart requests correct Content-Type with boundary is required!";
ContentType = Headers.Get("Content-Type");
If Not ValueIsFilled(ContentType) Then
Raise ExceptionText;
EndIf;
Properties = StrSplit(ContentType, ";", False);
Border = Undefined;
For Each Property In Properties Do
Parts = StrSplit(Property, "=", False);
PropertyName = TrimAll(Parts[0]);
If PropertyName <> "boundary" Then
Continue;
EndIf;
Border = TrimAll(Parts[1]);
Break;
EndDo;
If Not ValueIsFilled(Border) Then
Raise ExceptionText;
Else
Return Border;
EndIf;
EndFunction
Function GetMessageName(Headers)
ExceptionText = "Content-Disposition of one of the parts is not found or has invalid format!";
Description = Headers.Get("Content-Disposition");
If Not ValueIsFilled(Description) Then
Raise ExceptionText;
EndIf;
Properties = StrSplit(Description, ";", False);
Name = Undefined;
For Each Property In Properties Do
Parts = StrSplit(Property, "=", False);
PropertyName = TrimAll(Parts[0]);
If PropertyName <> "name" And PropertyName <> "Name" Then
Continue;
EndIf;
Name = TrimAll(Parts[1]);
Break;
EndDo;
If Not ValueIsFilled(Name) Then
Raise ExceptionText;
Else
Return Name;
EndIf;
EndFunction
#EndRegion
#EndRegion
#Region Private

View File

@ -1168,6 +1168,144 @@ EndFunction
#EndRegion
#Region Multipart
// by Vitaly Cherkasov (cherkasovvitalik)
// https://infostart.ru/1c/articles/1522786/
Function ParseMultipart(Val Headers, Val Body) Export
DataMap = New Map;
Delimiter = GetMultipartMessageSeparator(Headers);
Markers = New Array();
Markers.Add(GetBinaryDataBufferFromString("==" + Delimiter));
Markers.Add(GetBinaryDataBufferFromString("==" + Delimiter + Chars.LF));
Markers.Add(GetBinaryDataBufferFromString("==" + Delimiter + Chars.CR));
Markers.Add(GetBinaryDataBufferFromString("==" + Delimiter + Chars.CR + Chars.LF));
Markers.Add(GetBinaryDataBufferFromString("==" + Delimiter + "=="));
DataReader = New DataReader(Body);
DataReader.SkipTo(Markers);
CommonBinaryDataBuffer = DataReader.ReadIntoBinaryDataBuffer();
BinaryBuffers = CommonBinaryDataBuffer.Split(Markers);
For Each Buffer In BinaryBuffers Do
Stream = New MemoryStream(Buffer);
PartReading = New DataReader(Stream);
PartHeaders = ReadHeaders(PartReading);
PartName = GetMessageName(PartHeaders);
CurrentData = PartReading.Read().GetBinaryData();
DataMap.Insert(PartName, CurrentData);
PartReading.Close();
Stream.Close();
EndDo;
Return DataMap;
EndFunction
Function ReadHeaders(Reading)
Headers = New Map;
While True Do
CurrentRow = Reading.ReadLine();
If CurrentRow = "" Then
Break;
EndIf;
Parts = StrSplit(CurrentRow, ":");
HeaderName = TrimAll(Parts[0]);
Value = TrimAll(Parts[1]);
Headers.Insert(HeaderName, Value);
EndDo;
Return Headers;
EndFunction
Function GetMultipartMessageSeparator(Headers)
ExceptionText = "For Multipart requests correct Content-Type with boundary is required!";
ContentType = Headers.Get("Content-Type");
If Not ValueIsFilled(ContentType) Then
Raise ExceptionText;
EndIf;
Properties = StrSplit(ContentType, ";", False);
Border = Undefined;
For Each Property In Properties Do
Parts = StrSplit(Property, "=", False);
PropertyName = TrimAll(Parts[0]);
If PropertyName <> "boundary" Then
Continue;
EndIf;
Border = TrimAll(Parts[1]);
Break;
EndDo;
If Not ValueIsFilled(Border) Then
Raise ExceptionText;
Else
Return Border;
EndIf;
EndFunction
Function GetMessageName(Headers)
ExceptionText = "Content-Disposition of one of the parts is not found or has invalid format!";
Description = Headers.Get("Content-Disposition");
If Not ValueIsFilled(Description) Then
Raise ExceptionText;
EndIf;
Properties = StrSplit(Description, ";", False);
Name = Undefined;
For Each Property In Properties Do
Parts = StrSplit(Property, "=", False);
PropertyName = TrimAll(Parts[0]);
If PropertyName <> "name" And PropertyName <> "Name" Then
Continue;
EndIf;
Name = TrimAll(Parts[1]);
Break;
EndDo;
If Not ValueIsFilled(Name) Then
Raise ExceptionText;
Else
Return Name;
EndIf;
EndFunction
#EndRegion
#EndRegion
#Region Private

View File

@ -52,6 +52,8 @@ Var OPIObject Export;
Procedure MainHandler(Context, NexHandler) Export
#If Host Or ThickClientOrdinaryApplication Or ExternalConnection Then
Try
Result = ProcessRequest(Context);
Except
@ -60,7 +62,7 @@ Procedure MainHandler(Context, NexHandler) Export
Context.Response.StatusCode = 500;
Result = New Structure("result,error", False, "OneScript exception: " + Error);
Result = New Structure("result,error", False, "OneScript exception " + Error);
EndTry;
@ -69,6 +71,10 @@ Procedure MainHandler(Context, NexHandler) Export
Context.Response.ContentType = "application/json;charset=UTF8";
Context.Response.Write(JSON);
#Else
Raise "The method is not available on the client!";
#EndIf
EndProcedure
Function ProcessRequest(Context)
@ -101,16 +107,20 @@ EndFunction
Function ExecuteProcessing(Context, Handler)
Method = Upper(Context.Request.Method);
Method = Upper(Context.Request.Method);
HandlerMethod = Upper(Handler["method"]);
MethodForCheck = ?(HandlerMethod = "MULTIPART", "POST", HandlerMethod);
If Not Method = Upper(Handler["method"]) Then
Return ProcessingError(Context, 405, "Method not allowed for this handler");
If Not Method = MethodForCheck Then
Return ProcessingError(Context, 405, "Method " + Method + " is not available for this handler!");
EndIf;
If Method = "GET" Then
Result = ExecuteProcessingGet(Context, Handler);
If HandlerMethod = "GET" Then
Result = ExecuteProcessingGet(Context, Handler);
ElsIf HandlerMethod = "POST" Then
Result = ExecuteProcessinPost(Context, Handler);
Else
Result = ProcessingError(Context, 405, "Method not allowed for this handler");
Result = ProcessingError(Context, 405, "Method " + Method + " is not available for this handler!");
EndIf;
Return Result;
@ -123,6 +133,61 @@ Function ExecuteProcessingGet(Context, Handler)
Parameters = Request.Parameters;
Arguments = Handler["args"];
ParametersBoiler = FormParametersBoiler(Arguments, Parameters);
Return ExecuteUniversalProcessing(Context
, Handler["library"]
, Handler["function"]
, ParametersBoiler);
EndFunction
Function ExecuteProcessinPost(Context, Handler)
Request = Context.Request;
Arguments = Handler["args"];
Body = Request.Body;
JSONReader = New JSONReader();
JSONReader.OpenStream(Body);
Parameters = ReadJSON(JSONReader, True);
JSONReader.Close();
ParametersBoiler = FormParametersBoiler(Arguments, Parameters);
Return ExecuteUniversalProcessing(Context
, Handler["library"]
, Handler["function"]
, ParametersBoiler);
EndFunction
Function ExecuteUniversalProcessing(Context, Command, Method, Parameters)
ExecutionStructure = OPIObject.FormMethodCallString(Parameters, Command, Method);
Response = Undefined;
If ExecutionStructure["Error"] Then
Response = New Structure("result,error", False, "Error in the name of a command or handler function!");
Else
ExecutionText = ExecutionStructure["Result"];
SetSafeMode(True);
Execute(ExecutionText);
SetSafeMode(False);
Response = New Structure("result,data", True, Response);
EndIf;
Return Response;
EndFunction
Function FormParametersBoiler(Arguments, Parameters)
StrictArguments = New Map;
NonStrictArguments = New Map;
@ -157,33 +222,7 @@ Function ExecuteProcessingGet(Context, Handler)
ParametersBoiler.Insert(Argument.Key, Argument.Value);
EndDo;
Return ExecuteUniversalProcessing(Context
, Handler["library"]
, Handler["function"]
, ParametersBoiler);
EndFunction
Function ExecuteUniversalProcessing(Context, Command, Method, Parameters)
ExecutionStructure = OPIObject.FormMethodCallString(Parameters, Command, Method);
Response = Undefined;
If ExecutionStructure["Error"] Then
Response = New Structure("result,error", False, "Error in a handler command or method");
Else
ExecutionText = ExecutionStructure["Result"];
SetSafeMode(True);
Execute(ExecutionText);
SetSafeMode(False);
Response = New Structure("result,data", True, Response);
EndIf;
Return Response;
Return ParametersBoiler;
EndFunction

View File

@ -283,9 +283,9 @@
Возврат СоответствиеВозврата;
Возврат Неопределено;
КонецФункции

View File

@ -52,8 +52,8 @@
Процедура ОсновнаяОбработка(Контекст, СледующийОбработчик) Экспорт
Попытка
Результат = ОбработатьЗапрос(Контекст);
Исключение
@ -70,10 +70,10 @@
Контекст.Ответ.ТипКонтента = "application/json;charset=UTF8";
Контекст.Ответ.Записать(JSON);
ВызватьИсключение "Метод недоступен на клиенте!";
КонецПроцедуры
@ -143,24 +143,24 @@
КонецФункции
Функция ВыполнитьОбработкуPost(Контекст, Обработчик)
Запрос = Контекст.Запрос;
Аргументы = Обработчик["args"];
Тело = Запрос.Тело;
Тело = Запрос.Тело;
ЧтениеJSON = Новый ЧтениеJSON();
ЧтениеJSON.ОткрытьПоток(Тело);
Параметры = ПрочитатьJSON(ЧтениеJSON, Истина);
ЧтениеJSON.Закрыть();
КотелПараметров = СформироватьКотелПараметров(Аргументы, Параметры);
Возврат ВыполнитьУниверсальнуюОбработку(Контекст
, Обработчик["library"]
, Обработчик["function"]
, КотелПараметров);
КонецФункции
Функция ВыполнитьУниверсальнуюОбработку(Контекст, Команда, Метод, Параметры)
@ -174,9 +174,9 @@
Иначе
ТекстВыполнения = СтруктураВыполнения["Результат"];
Выполнить(ТекстВыполнения);
Ответ = Новый Структура("result,data", Истина, Ответ);
@ -221,9 +221,9 @@
Для Каждого Аргумент Из АргументыСтрогие Цикл
КотелПараметров.Вставить(Аргумент.Ключ, Аргумент.Значение);
КонецЦикла;
Возврат КотелПараметров;
КонецФункции
Функция ОшибкаОбработки(Контекст, Код, Текст)

View File

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

View File

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

View File

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

View File

@ -53,7 +53,7 @@
Процедура ОсновнаяОбработка(Контекст, СледующийОбработчик) Экспорт
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
Попытка
Результат = ОбработатьЗапрос(Контекст);
Исключение
@ -70,7 +70,7 @@
Контекст.Ответ.ТипКонтента = "application/json;charset=UTF8";
Контекст.Ответ.Записать(JSON);
#Иначе
ВызватьИсключение "Метод недоступен на клиенте!";
#КонецЕсли
@ -143,24 +143,24 @@
КонецФункции
Функция ВыполнитьОбработкуPost(Контекст, Обработчик)
Запрос = Контекст.Запрос;
Аргументы = Обработчик["args"];
Тело = Запрос.Тело;
Тело = Запрос.Тело;
ЧтениеJSON = Новый ЧтениеJSON();
ЧтениеJSON.ОткрытьПоток(Тело);
Параметры = ПрочитатьJSON(ЧтениеJSON, Истина);
ЧтениеJSON.Закрыть();
КотелПараметров = СформироватьКотелПараметров(Аргументы, Параметры);
Возврат ВыполнитьУниверсальнуюОбработку(Контекст
, Обработчик["library"]
, Обработчик["function"]
, КотелПараметров);
КонецФункции
Функция ВыполнитьУниверсальнуюОбработку(Контекст, Команда, Метод, Параметры)
@ -221,9 +221,9 @@
Для Каждого Аргумент Из АргументыСтрогие Цикл
КотелПараметров.Вставить(Аргумент.Ключ, Аргумент.Значение);
КонецЦикла;
Возврат КотелПараметров;
КонецФункции
Функция ОшибкаОбработки(Контекст, Код, Текст)