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:
parent
3687dab26a
commit
4ec224d366
12502
service/dictionaries/en.json
vendored
12502
service/dictionaries/en.json
vendored
File diff suppressed because it is too large
Load Diff
4
src/en/OInt/core/Modules/OPI_Telegram.os
vendored
4
src/en/OInt/core/Modules/OPI_Telegram.os
vendored
@ -283,9 +283,9 @@ Function ProcessTMAData(Val DataString, Val Token) Export
|
||||
|
||||
Return ReturnMapping;
|
||||
|
||||
#Else
|
||||
|
||||
Return Undefined;
|
||||
#EndIf
|
||||
|
||||
|
||||
EndFunction
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
138
src/en/OPI/src/CommonModules/OPI_Tools/Module.bsl
vendored
138
src/en/OPI/src/CommonModules/OPI_Tools/Module.bsl
vendored
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
4
src/ru/OInt/core/Modules/OPI_Telegram.os
vendored
4
src/ru/OInt/core/Modules/OPI_Telegram.os
vendored
@ -283,9 +283,9 @@
|
||||
|
||||
Возврат СоответствиеВозврата;
|
||||
|
||||
|
||||
|
||||
Возврат Неопределено;
|
||||
|
||||
|
||||
|
||||
КонецФункции
|
||||
|
||||
|
@ -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 @@
|
||||
Для Каждого Аргумент Из АргументыСтрогие Цикл
|
||||
КотелПараметров.Вставить(Аргумент.Ключ, Аргумент.Значение);
|
||||
КонецЦикла;
|
||||
|
||||
|
||||
Возврат КотелПараметров;
|
||||
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ОшибкаОбработки(Контекст, Код, Текст)
|
||||
|
@ -2169,9 +2169,9 @@
|
||||
КонецФункции
|
||||
|
||||
Функция ПолучитьОбщийМодуль(Знач Имя)
|
||||
|
||||
|
||||
Модуль = Вычислить(Имя);
|
||||
|
||||
|
||||
Возврат Модуль;
|
||||
КонецФункции
|
||||
|
||||
|
@ -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]);
|
||||
Прервать;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Если Не ЗначениеЗаполнено(Имя) Тогда
|
||||
ВызватьИсключение ТекстИсключения;
|
||||
Иначе
|
||||
Возврат Имя;
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
@ -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]);
|
||||
Прервать;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Если Не ЗначениеЗаполнено(Имя) Тогда
|
||||
ВызватьИсключение ТекстИсключения;
|
||||
Иначе
|
||||
Возврат Имя;
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
@ -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 @@
|
||||
Для Каждого Аргумент Из АргументыСтрогие Цикл
|
||||
КотелПараметров.Вставить(Аргумент.Ключ, Аргумент.Значение);
|
||||
КонецЦикла;
|
||||
|
||||
|
||||
Возврат КотелПараметров;
|
||||
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ОшибкаОбработки(Контекст, Код, Текст)
|
||||
|
Loading…
x
Reference in New Issue
Block a user