1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2025-04-21 12:17:20 +02:00

Main build (Jenkins)

This commit is contained in:
Vitaly the Alpaca (bot) 2024-12-04 16:33:15 +03:00
parent bd79958e60
commit b715f60a2d
13 changed files with 5958 additions and 5864 deletions

File diff suppressed because it is too large Load Diff

View File

@ -60,12 +60,14 @@
// Structure of KeyAndValue - Basic request data structure // Structure of KeyAndValue - Basic request data structure
Function GetBasicDataStructure(Val URL, Val AccessKey, Val SecretKey, Val Region, Val Service = "s3") Export Function GetBasicDataStructure(Val URL, Val AccessKey, Val SecretKey, Val Region, Val Service = "s3") Export
String_ = "String";
AuthStructure = New Structure; AuthStructure = New Structure;
OPI_Tools.AddField("URL" , URL , "String", AuthStructure); OPI_Tools.AddField("URL" , URL , String_, AuthStructure);
OPI_Tools.AddField("AccessKey", AccessKey, "String", AuthStructure); OPI_Tools.AddField("AccessKey", AccessKey, String_, AuthStructure);
OPI_Tools.AddField("SecretKey", SecretKey, "String", AuthStructure); OPI_Tools.AddField("SecretKey", SecretKey, String_, AuthStructure);
OPI_Tools.AddField("Region" , Region , "String", AuthStructure); OPI_Tools.AddField("Region" , Region , String_, AuthStructure);
OPI_Tools.AddField("Service" , Service , "String", AuthStructure); OPI_Tools.AddField("Service" , Service , String_, AuthStructure);
Return AuthStructure; Return AuthStructure;
@ -502,13 +504,15 @@ Function ListBuckets(Val BasicData
, Val PageToken = "" , Val PageToken = ""
, Val Headers = Undefined) Export , Val Headers = Undefined) Export
String_ = "String";
BasicData_ = OPI_Tools.CopyCollection(BasicData); BasicData_ = OPI_Tools.CopyCollection(BasicData);
Parameters = New Map; Parameters = New Map;
OPI_Tools.AddField("bucket-region" , Region , "String", Parameters); OPI_Tools.AddField("bucket-region" , Region , String_, Parameters);
OPI_Tools.AddField("continuation-token", PageToken, "String", Parameters); OPI_Tools.AddField("continuation-token", PageToken, String_, Parameters);
OPI_Tools.AddField("max-buckets" , 250 , "String", Parameters); OPI_Tools.AddField("max-buckets" , 250 , String_, Parameters);
OPI_Tools.AddField("prefix" , Prefix , "String", Parameters); OPI_Tools.AddField("prefix" , Prefix , String_, Parameters);
URL = GetServiceURL(BasicData_); URL = GetServiceURL(BasicData_);
URL = URL + OPI_Tools.RequestParametersToString(Parameters); URL = URL + OPI_Tools.RequestParametersToString(Parameters);
@ -555,7 +559,8 @@ Function PutObject(Val Name
OPI_TypeConversion.GetBinaryData(Entity); OPI_TypeConversion.GetBinaryData(Entity);
FileSize = GetContentSize(Entity); FileSize = GetContentSize(Entity);
MinPartSize = FileSize / 10000; Divider = 10000;
MinPartSize = FileSize / Divider;
MinPartSize = Max(MinPartSize, 5242880); MinPartSize = Max(MinPartSize, 5242880);
If OPI_Tools.CollectionFieldExist(BasicData_, "ChunkSize") Then If OPI_Tools.CollectionFieldExist(BasicData_, "ChunkSize") Then
@ -1107,16 +1112,18 @@ Function ListObjects(Val Bucket
, Val PageToken = "" , Val PageToken = ""
, Val Headers = Undefined) Export , Val Headers = Undefined) Export
String_ = "String";
BasicData_ = OPI_Tools.CopyCollection(BasicData); BasicData_ = OPI_Tools.CopyCollection(BasicData);
URL = GetServiceURL(BasicData_); URL = GetServiceURL(BasicData_);
URL = FormBucketURL(URL, Bucket, False); URL = FormBucketURL(URL, Bucket, False);
Parameters = New Map; Parameters = New Map;
OPI_Tools.AddField("list-type" , 2 , "String", Parameters); OPI_Tools.AddField("list-type" , 2 , String_, Parameters);
OPI_Tools.AddField("max-keys" , 250 , "String", Parameters); OPI_Tools.AddField("max-keys" , 250 , String_, Parameters);
OPI_Tools.AddField("continuation-token", PageToken, "String", Parameters); OPI_Tools.AddField("continuation-token", PageToken, String_, Parameters);
OPI_Tools.AddField("prefix" , Prefix , "String", Parameters); OPI_Tools.AddField("prefix" , Prefix , String_, Parameters);
URL = URL + OPI_Tools.RequestParametersToString(Parameters); URL = URL + OPI_Tools.RequestParametersToString(Parameters);
BasicData_.Insert("URL", URL); BasicData_.Insert("URL", URL);
@ -1148,6 +1155,8 @@ Function ListObjectVersions(Val Bucket
, Val Version = "" , Val Version = ""
, Val Headers = Undefined) Export , Val Headers = Undefined) Export
String_ = "String";
BasicData_ = OPI_Tools.CopyCollection(BasicData); BasicData_ = OPI_Tools.CopyCollection(BasicData);
URL = GetServiceURL(BasicData_); URL = GetServiceURL(BasicData_);
@ -1155,9 +1164,9 @@ Function ListObjectVersions(Val Bucket
URL = URL + "?versions"; URL = URL + "?versions";
Parameters = New Map; Parameters = New Map;
OPI_Tools.AddField("max-keys" , 250 , "String", Parameters); OPI_Tools.AddField("max-keys" , 250 , String_, Parameters);
OPI_Tools.AddField("version-id-marker", Version , "String", Parameters); OPI_Tools.AddField("version-id-marker", Version , String_, Parameters);
OPI_Tools.AddField("prefix" , Prefix , "String", Parameters); OPI_Tools.AddField("prefix" , Prefix , String_, Parameters);
URL = URL + OPI_Tools.RequestParametersToString(Parameters, , False); URL = URL + OPI_Tools.RequestParametersToString(Parameters, , False);
BasicData_.Insert("URL", URL); BasicData_.Insert("URL", URL);
@ -1301,10 +1310,11 @@ Function CreateURLSignature(Val DataStructure, Val Name, Val Method, Val Expire,
ParametersString = OPI_Tools.RequestParametersToString(URLParameters); ParametersString = OPI_Tools.RequestParametersToString(URLParameters);
ParametersString = Right(ParametersString, StrLen(ParametersString) - 1); ParametersString = Right(ParametersString, StrLen(ParametersString) - 1);
RequestTemplate = ""; RequestTemplate = "";
PartsAmount = 6;
For N = 1 To 6 Do For N = 1 To PartsAmount Do
RequestTemplate = RequestTemplate + "%" + String(N) + ?(N = 6, "", Chars.LF); RequestTemplate = RequestTemplate + "%" + String(N) + ?(N = PartsAmount, "", Chars.LF);
EndDo; EndDo;
@ -1382,12 +1392,13 @@ Function CreateCanonicalRequest(Val Request, Val Connection, Val Method)
RequestTemplate = ""; RequestTemplate = "";
RequestBody = OPI_Tools.GetRequestBody(Request); RequestBody = OPI_Tools.GetRequestBody(Request);
HashSum = OPI_Cryptography.Hash(RequestBody, HashFunction.SHA256); HashSum = OPI_Cryptography.Hash(RequestBody, HashFunction.SHA256);
PartsAmount = 6;
Request.Headers.Insert("x-amz-content-sha256", Lower(ПолучитьHexСтрокуИзДвоичныхДанных(HashSum))); Request.Headers.Insert("x-amz-content-sha256", Lower(ПолучитьHexСтрокуИзДвоичныхДанных(HashSum)));
For N = 1 To 6 Do For N = 1 To PartsAmount Do
RequestTemplate = RequestTemplate + "%" + String(N) + ?(N = 6, "", Chars.LF); RequestTemplate = RequestTemplate + "%" + String(N) + ?(N = PartsAmount, "", Chars.LF);
EndDo; EndDo;
@ -1432,14 +1443,15 @@ Function CreateSignatureString(Val CanonicalRequest, Val Scope, Val CurrentDate)
StringTemplate = ""; StringTemplate = "";
Algorithm = "AWS4-HMAC-SHA256"; Algorithm = "AWS4-HMAC-SHA256";
DateISO = OPI_Tools.ISOTimestamp(CurrentDate); DateISO = OPI_Tools.ISOTimestamp(CurrentDate);
PartsAmount = 4;
CanonicalRequest = ПолучитьДвоичныеДанныеИзСтроки(CanonicalRequest); CanonicalRequest = ПолучитьДвоичныеДанныеИзСтроки(CanonicalRequest);
CanonicalRequest = OPI_Cryptography.Hash(CanonicalRequest, HashFunction.SHA256); CanonicalRequest = OPI_Cryptography.Hash(CanonicalRequest, HashFunction.SHA256);
CanonicalRequest = Lower(ПолучитьHexСтрокуИзДвоичныхДанных(CanonicalRequest)); CanonicalRequest = Lower(ПолучитьHexСтрокуИзДвоичныхДанных(CanonicalRequest));
For N = 1 To 4 Do For N = 1 To PartsAmount Do
StringTemplate = StringTemplate + "%" + String(N) + ?(N = 4, "", Chars.LF); StringTemplate = StringTemplate + "%" + String(N) + ?(N = PartsAmount, "", Chars.LF);
EndDo; EndDo;
@ -1658,6 +1670,7 @@ Function GetObjectInChunks(Val BasicData
ChunkSize = Sizes["chunk"]; ChunkSize = Sizes["chunk"];
HeaderTemplate = "bytes=%1-%2"; HeaderTemplate = "bytes=%1-%2";
ChunkStart = 0; ChunkStart = 0;
Attempts = 3;
HeadersArray = New Array; HeadersArray = New Array;
@ -1684,17 +1697,12 @@ Function GetObjectInChunks(Val BasicData
EndIf; EndIf;
If ValueIsFilled(SavePath) Then StreamOfFile = OPI_Tools.CreateStream(SavePath);
StreamOfFile = New FileStream(SavePath, FileOpenMode.Create); FileWriter = New DataWriter(StreamOfFile);
Else
StreamOfFile = New MemoryStream();
EndIf;
FileWriter = New DataWriter(StreamOfFile);
For Each CurrentSet In HeadersArray Do For Each CurrentSet In HeadersArray Do
For N = 1 To 3 Do For N = 1 To Attempts Do
Try Try
@ -1719,13 +1727,13 @@ Function GetObjectInChunks(Val BasicData
Except Except
If N = 3 Then If N = Attempts Then
Message(ErrorDescription()); Message(ErrorDescription());
Raise "Failed to retrieve the file!"; Raise "Failed to retrieve the file!";
Else Else
Message("Chunk upload error " + String(N) + "/3"); Message("Chunk upload error " + String(N) + "/" + String(Attempts));
Continue; Continue;
EndIf; EndIf;
@ -1737,13 +1745,9 @@ Function GetObjectInChunks(Val BasicData
FileWriter.Close(); FileWriter.Close();
If TypeOf(StreamOfFile) = Type("MemoryStream") Then ReceivedObject = CloseStreamReceiveData(StreamOfFile, SavePath);
Return StreamOfFile.CloseAndGetBinaryData();
Else Return ReceivedObject;
StreamOfFile.Close();
ResponseFile = New File(SavePath);
Return ResponseFile.FullName;
EndIf;
EndFunction EndFunction
@ -1781,7 +1785,6 @@ Function UploadObjectInParts(Val Name
BytesRead = 0; BytesRead = 0;
PartNumber = 1; PartNumber = 1;
If Not OPI_Tools.CollectionFieldExist(UploadStart, FieldID, UploadID) Then If Not OPI_Tools.CollectionFieldExist(UploadStart, FieldID, UploadID) Then
Return UploadStart; Return UploadStart;
EndIf; EndIf;
@ -1790,13 +1793,16 @@ Function UploadObjectInParts(Val Name
SourceStream = DataReader.SourceStream(); SourceStream = DataReader.SourceStream();
Response = New Map; Response = New Map;
TagsArray = New Array; TagsArray = New Array;
Error = False;
Error = False;
Attempts = 3;
LastSuccessCode = 299;
WHile BytesRead < TotalSize Do WHile BytesRead < TotalSize Do
Try For N = 1 To Attempts Do
For N = 1 To 3 Do Try
Result = DataReader.Read(ChunkSize); Result = DataReader.Read(ChunkSize);
CurrentData = Result.GetBinaryData(); CurrentData = Result.GetBinaryData();
@ -1812,7 +1818,7 @@ Function UploadObjectInParts(Val Name
, PartNumber , PartNumber
, CurrentData); , CurrentData);
If Response["status"] > 299 Then If Response["status"] > LastSuccessCode Then
Raise "The server returned the status " + String(Response["status"]); Raise "The server returned the status " + String(Response["status"]);
EndIf; EndIf;
@ -1832,27 +1838,27 @@ Function UploadObjectInParts(Val Name
Break; Break;
EndDo; Except
Except If N = Attempts Then
If N = 3 Then Message(OPI_Tools.JSONString(Response));
Message("Failed to upload part of the file! Abort upload wiht ID:" + UploadID + "...");
Message(OPI_Tools.JSONString(Response)); Error = True;
Message("Failed to upload part of the file! Abort upload wiht ID:" + UploadID + "..."); Break;
Error = True; Else
Break;
Else Message("Chunk upload error " + String(N) + "/" + String(Attempts));
Message(ErrorDescription());
Continue;
Message("Chunk upload error " + String(N) + "/3"); EndIf;
Message(ErrorDescription());
Continue;
EndIf; EndTry;
EndTry; EndDo;
PartNumber = PartNumber + 1; PartNumber = PartNumber + 1;
@ -1870,10 +1876,11 @@ EndFunction
Function FormResponse(Val Response, Val ExpectedBinary = False) Function FormResponse(Val Response, Val ExpectedBinary = False)
Status = Response.StatusCode; Status = Response.StatusCode;
Headers = Response.Headers; Headers = Response.Headers;
LastSuccessCode = 299;
If Not ExpectedBinary Or Status > 299 Then If Not ExpectedBinary Or Status > LastSuccessCode Then
ResponseData = New Structure; ResponseData = New Structure;
BodyData = New Structure; BodyData = New Structure;
@ -1909,12 +1916,14 @@ Function FormBucketURL(Val URL, Val Name, Val Directory)
OPI_TypeConversion.GetLine(Name); OPI_TypeConversion.GetLine(Name);
OPI_TypeConversion.GetBoolean(Directory); OPI_TypeConversion.GetBoolean(Directory);
Indication = "://";
If Directory Then If Directory Then
URL = URL + Name; URL = URL + Name;
Else Else
If StrFind(URL, "://") Then If StrFind(URL, Indication) Then
URL = StrReplace(URL, "://", "://" + Name + "."); URL = StrReplace(URL, Indication, Indication + Name + ".");
Else Else
URL = Name + "." + URL; URL = Name + "." + URL;
EndIf; EndIf;
@ -1995,6 +2004,18 @@ Function GetContentSize(Val Entity)
EndFunction EndFunction
Function CloseStreamReceiveData(Val StreamOfFile, Val SavePath)
If TypeOf(StreamOfFile) = Type("MemoryStream") Then
Return StreamOfFile.CloseAndGetBinaryData();
Else
StreamOfFile.Close();
ResponseFile = New File(SavePath);
Return ResponseFile.FullName;
EndIf;
EndFunction
Procedure CheckBasicData(BasicData) Procedure CheckBasicData(BasicData)
ErrorText = "Error of obtaining authorization data from the structure"; ErrorText = "Error of obtaining authorization data from the structure";

View File

@ -32,6 +32,7 @@
// BSLLS:UsingServiceTag-off // BSLLS:UsingServiceTag-off
// BSLLS:ExecuteExternalCodeInCommonModule-off // BSLLS:ExecuteExternalCodeInCommonModule-off
// BSLLS:DuplicateStringLiteral-off // BSLLS:DuplicateStringLiteral-off
// BSLLS:MagicNumber-off
//@skip-check use-non-recommended-method //@skip-check use-non-recommended-method
//@skip-check module-structure-top-region //@skip-check module-structure-top-region
@ -2046,6 +2047,7 @@ Function GetCommonModule(Val Name)
Return Module; Return Module;
EndFunction EndFunction
// BSLLS:CognitiveComplexity-off
Function GetCLIFormedValue(Val Value, Val Embedded = False) Function GetCLIFormedValue(Val Value, Val Embedded = False)
CurrentType = TypeOf(Value); CurrentType = TypeOf(Value);
@ -2081,8 +2083,12 @@ Function GetCLIFormedValue(Val Value, Val Embedded = False)
Else Else
// BSLLS:MissingTemporaryFileDeletion-off
//@skip-check missing-temporary-file-deletion //@skip-check missing-temporary-file-deletion
TFN = GetTempFileName("json"); TFN = GetTempFileName("json");
// BSLLS:MissingTemporaryFileDeletion-on
Stream = New FileStream(TFN, FileOpenMode.Create); Stream = New FileStream(TFN, FileOpenMode.Create);
JSONWriter.OpenStream(Stream); JSONWriter.OpenStream(Stream);
@ -2118,6 +2124,7 @@ Function GetCLIFormedValue(Val Value, Val Embedded = False)
Return Value; Return Value;
EndFunction EndFunction
// BSLLS:CognitiveComplexity-on
Function FormOption(Val Value, Val Name, Val Embedded = False) Function FormOption(Val Value, Val Name, Val Embedded = False)

View File

@ -191,7 +191,11 @@ Function CreateRequest(Val Address, Val AdditionalHeaders = "", Val DataType = "
EndFunction EndFunction
Function CreateConnection(Val Host, Val Safe = True, Val User = "", Val Password = "", Val Port = "") Export Function CreateConnection(Val Host
, Val Safe = True
, Val User = ""
, Val Password = ""
, Val Port = "") Export
If Not ValueIsFilled(Port) Then If Not ValueIsFilled(Port) Then
Port = ?(Safe, 443, 80); Port = ?(Safe, 443, 80);
@ -408,7 +412,10 @@ Function JsonToStructure(Val Text) Export
EndFunction EndFunction
Function JSONString(Val Data, Val Escaping = "None", Val LineBreaks = True, Val DoubleQuotes = True) Export Function JSONString(Val Data
, Val Escaping = "None"
, Val LineBreaks = True
, Val DoubleQuotes = True) Export
LineBreak = ?(LineBreaks, JSONLineBreak.Windows, JSONLineBreak.None); LineBreak = ?(LineBreaks, JSONLineBreak.Windows, JSONLineBreak.None);
@ -825,6 +832,18 @@ Function GetRequestBody(Val Request) Export
EndFunction EndFunction
Function CreateStream(Val FilePath = Undefined) Export
If ValueIsFilled(FilePath) Then
StreamOfFile = New FileStream(FilePath, FileOpenMode.Create);
Else
StreamOfFile = New MemoryStream();
EndIf;
Return StreamOfFile;
EndFunction
Procedure ValueToArray(Value) Export Procedure ValueToArray(Value) Export
If TypeOf(Value) = Type("Array") Then If TypeOf(Value) = Type("Array") Then

View File

@ -60,12 +60,14 @@
// Structure of KeyAndValue - Basic request data structure // Structure of KeyAndValue - Basic request data structure
Function GetBasicDataStructure(Val URL, Val AccessKey, Val SecretKey, Val Region, Val Service = "s3") Export Function GetBasicDataStructure(Val URL, Val AccessKey, Val SecretKey, Val Region, Val Service = "s3") Export
String_ = "String";
AuthStructure = New Structure; AuthStructure = New Structure;
OPI_Tools.AddField("URL" , URL , "String", AuthStructure); OPI_Tools.AddField("URL" , URL , String_, AuthStructure);
OPI_Tools.AddField("AccessKey", AccessKey, "String", AuthStructure); OPI_Tools.AddField("AccessKey", AccessKey, String_, AuthStructure);
OPI_Tools.AddField("SecretKey", SecretKey, "String", AuthStructure); OPI_Tools.AddField("SecretKey", SecretKey, String_, AuthStructure);
OPI_Tools.AddField("Region" , Region , "String", AuthStructure); OPI_Tools.AddField("Region" , Region , String_, AuthStructure);
OPI_Tools.AddField("Service" , Service , "String", AuthStructure); OPI_Tools.AddField("Service" , Service , String_, AuthStructure);
Return AuthStructure; Return AuthStructure;
@ -502,13 +504,15 @@ Function ListBuckets(Val BasicData
, Val PageToken = "" , Val PageToken = ""
, Val Headers = Undefined) Export , Val Headers = Undefined) Export
String_ = "String";
BasicData_ = OPI_Tools.CopyCollection(BasicData); BasicData_ = OPI_Tools.CopyCollection(BasicData);
Parameters = New Map; Parameters = New Map;
OPI_Tools.AddField("bucket-region" , Region , "String", Parameters); OPI_Tools.AddField("bucket-region" , Region , String_, Parameters);
OPI_Tools.AddField("continuation-token", PageToken, "String", Parameters); OPI_Tools.AddField("continuation-token", PageToken, String_, Parameters);
OPI_Tools.AddField("max-buckets" , 250 , "String", Parameters); OPI_Tools.AddField("max-buckets" , 250 , String_, Parameters);
OPI_Tools.AddField("prefix" , Prefix , "String", Parameters); OPI_Tools.AddField("prefix" , Prefix , String_, Parameters);
URL = GetServiceURL(BasicData_); URL = GetServiceURL(BasicData_);
URL = URL + OPI_Tools.RequestParametersToString(Parameters); URL = URL + OPI_Tools.RequestParametersToString(Parameters);
@ -555,7 +559,8 @@ Function PutObject(Val Name
OPI_TypeConversion.GetBinaryData(Entity); OPI_TypeConversion.GetBinaryData(Entity);
FileSize = GetContentSize(Entity); FileSize = GetContentSize(Entity);
MinPartSize = FileSize / 10000; Divider = 10000;
MinPartSize = FileSize / Divider;
MinPartSize = Max(MinPartSize, 5242880); MinPartSize = Max(MinPartSize, 5242880);
If OPI_Tools.CollectionFieldExists(BasicData_, "ChunkSize") Then If OPI_Tools.CollectionFieldExists(BasicData_, "ChunkSize") Then
@ -1107,16 +1112,18 @@ Function ListObjects(Val Bucket
, Val PageToken = "" , Val PageToken = ""
, Val Headers = Undefined) Export , Val Headers = Undefined) Export
String_ = "String";
BasicData_ = OPI_Tools.CopyCollection(BasicData); BasicData_ = OPI_Tools.CopyCollection(BasicData);
URL = GetServiceURL(BasicData_); URL = GetServiceURL(BasicData_);
URL = FormBucketURL(URL, Bucket, False); URL = FormBucketURL(URL, Bucket, False);
Parameters = New Map; Parameters = New Map;
OPI_Tools.AddField("list-type" , 2 , "String", Parameters); OPI_Tools.AddField("list-type" , 2 , String_, Parameters);
OPI_Tools.AddField("max-keys" , 250 , "String", Parameters); OPI_Tools.AddField("max-keys" , 250 , String_, Parameters);
OPI_Tools.AddField("continuation-token", PageToken, "String", Parameters); OPI_Tools.AddField("continuation-token", PageToken, String_, Parameters);
OPI_Tools.AddField("prefix" , Prefix , "String", Parameters); OPI_Tools.AddField("prefix" , Prefix , String_, Parameters);
URL = URL + OPI_Tools.RequestParametersToString(Parameters); URL = URL + OPI_Tools.RequestParametersToString(Parameters);
BasicData_.Insert("URL", URL); BasicData_.Insert("URL", URL);
@ -1148,6 +1155,8 @@ Function ListObjectVersions(Val Bucket
, Val Version = "" , Val Version = ""
, Val Headers = Undefined) Export , Val Headers = Undefined) Export
String_ = "String";
BasicData_ = OPI_Tools.CopyCollection(BasicData); BasicData_ = OPI_Tools.CopyCollection(BasicData);
URL = GetServiceURL(BasicData_); URL = GetServiceURL(BasicData_);
@ -1155,9 +1164,9 @@ Function ListObjectVersions(Val Bucket
URL = URL + "?versions"; URL = URL + "?versions";
Parameters = New Map; Parameters = New Map;
OPI_Tools.AddField("max-keys" , 250 , "String", Parameters); OPI_Tools.AddField("max-keys" , 250 , String_, Parameters);
OPI_Tools.AddField("version-id-marker", Version , "String", Parameters); OPI_Tools.AddField("version-id-marker", Version , String_, Parameters);
OPI_Tools.AddField("prefix" , Prefix , "String", Parameters); OPI_Tools.AddField("prefix" , Prefix , String_, Parameters);
URL = URL + OPI_Tools.RequestParametersToString(Parameters, , False); URL = URL + OPI_Tools.RequestParametersToString(Parameters, , False);
BasicData_.Insert("URL", URL); BasicData_.Insert("URL", URL);
@ -1301,10 +1310,11 @@ Function CreateURLSignature(Val DataStructure, Val Name, Val Method, Val Expire,
ParametersString = OPI_Tools.RequestParametersToString(URLParameters); ParametersString = OPI_Tools.RequestParametersToString(URLParameters);
ParametersString = Right(ParametersString, StrLen(ParametersString) - 1); ParametersString = Right(ParametersString, StrLen(ParametersString) - 1);
RequestTemplate = ""; RequestTemplate = "";
PartsAmount = 6;
For N = 1 To 6 Do For N = 1 To PartsAmount Do
RequestTemplate = RequestTemplate + "%" + String(N) + ?(N = 6, "", Chars.LF); RequestTemplate = RequestTemplate + "%" + String(N) + ?(N = PartsAmount, "", Chars.LF);
EndDo; EndDo;
@ -1382,12 +1392,13 @@ Function CreateCanonicalRequest(Val Request, Val Connection, Val Method)
RequestTemplate = ""; RequestTemplate = "";
RequestBody = OPI_Tools.GetRequestBody(Request); RequestBody = OPI_Tools.GetRequestBody(Request);
HashSum = OPI_Cryptography.Hash(RequestBody, HashFunction.SHA256); HashSum = OPI_Cryptography.Hash(RequestBody, HashFunction.SHA256);
PartsAmount = 6;
Request.Headers.Insert("x-amz-content-sha256", Lower(GetHexStringFromBinaryData(HashSum))); Request.Headers.Insert("x-amz-content-sha256", Lower(GetHexStringFromBinaryData(HashSum)));
For N = 1 To 6 Do For N = 1 To PartsAmount Do
RequestTemplate = RequestTemplate + "%" + String(N) + ?(N = 6, "", Chars.LF); RequestTemplate = RequestTemplate + "%" + String(N) + ?(N = PartsAmount, "", Chars.LF);
EndDo; EndDo;
@ -1432,14 +1443,15 @@ Function CreateSignatureString(Val CanonicalRequest, Val Scope, Val CurrentDate)
StringTemplate = ""; StringTemplate = "";
Algorithm = "AWS4-HMAC-SHA256"; Algorithm = "AWS4-HMAC-SHA256";
DateISO = OPI_Tools.ISOTimestamp(CurrentDate); DateISO = OPI_Tools.ISOTimestamp(CurrentDate);
PartsAmount = 4;
CanonicalRequest = GetBinaryDataFromString(CanonicalRequest); CanonicalRequest = GetBinaryDataFromString(CanonicalRequest);
CanonicalRequest = OPI_Cryptography.Hash(CanonicalRequest, HashFunction.SHA256); CanonicalRequest = OPI_Cryptography.Hash(CanonicalRequest, HashFunction.SHA256);
CanonicalRequest = Lower(GetHexStringFromBinaryData(CanonicalRequest)); CanonicalRequest = Lower(GetHexStringFromBinaryData(CanonicalRequest));
For N = 1 To 4 Do For N = 1 To PartsAmount Do
StringTemplate = StringTemplate + "%" + String(N) + ?(N = 4, "", Chars.LF); StringTemplate = StringTemplate + "%" + String(N) + ?(N = PartsAmount, "", Chars.LF);
EndDo; EndDo;
@ -1658,6 +1670,7 @@ Function GetObjectInChunks(Val BasicData
ChunkSize = Sizes["chunk"]; ChunkSize = Sizes["chunk"];
HeaderTemplate = "bytes=%1-%2"; HeaderTemplate = "bytes=%1-%2";
ChunkStart = 0; ChunkStart = 0;
Attempts = 3;
HeadersArray = New Array; HeadersArray = New Array;
@ -1684,17 +1697,12 @@ Function GetObjectInChunks(Val BasicData
EndIf; EndIf;
If ValueIsFilled(SavePath) Then StreamOfFile = OPI_Tools.CreateStream(SavePath);
StreamOfFile = New FileStream(SavePath, FileOpenMode.Create); FileWriter = New DataWriter(StreamOfFile);
Else
StreamOfFile = New MemoryStream();
EndIf;
FileWriter = New DataWriter(StreamOfFile);
For Each CurrentSet In HeadersArray Do For Each CurrentSet In HeadersArray Do
For N = 1 To 3 Do For N = 1 To Attempts Do
Try Try
@ -1719,13 +1727,13 @@ Function GetObjectInChunks(Val BasicData
Except Except
If N = 3 Then If N = Attempts Then
// !OInt Message(ErrorDescription()); // !OInt Message(ErrorDescription());
Raise "Failed to retrieve the file!"; Raise "Failed to retrieve the file!";
Else Else
// !OInt Message("Chunk upload error " + String(N) + "/3"); // !OInt Message("Chunk upload error " + String(N) + "/" + String(Attempts));
Continue; Continue;
EndIf; EndIf;
@ -1737,13 +1745,9 @@ Function GetObjectInChunks(Val BasicData
FileWriter.Close(); FileWriter.Close();
If TypeOf(StreamOfFile) = Type("MemoryStream") Then ReceivedObject = CloseStreamReceiveData(StreamOfFile, SavePath);
Return StreamOfFile.CloseAndGetBinaryData();
Else Return ReceivedObject;
StreamOfFile.Close();
ResponseFile = New File(SavePath);
Return ResponseFile.FullName;
EndIf;
EndFunction EndFunction
@ -1781,7 +1785,6 @@ Function UploadObjectInParts(Val Name
BytesRead = 0; BytesRead = 0;
PartNumber = 1; PartNumber = 1;
If Not OPI_Tools.CollectionFieldExists(UploadStart, FieldID, UploadID) Then If Not OPI_Tools.CollectionFieldExists(UploadStart, FieldID, UploadID) Then
Return UploadStart; Return UploadStart;
EndIf; EndIf;
@ -1790,13 +1793,16 @@ Function UploadObjectInParts(Val Name
SourceStream = DataReader.SourceStream(); SourceStream = DataReader.SourceStream();
Response = New Map; Response = New Map;
TagsArray = New Array; TagsArray = New Array;
Error = False;
Error = False;
Attempts = 3;
LastSuccessCode = 299;
WHile BytesRead < TotalSize Do WHile BytesRead < TotalSize Do
Try For N = 1 To Attempts Do
For N = 1 To 3 Do Try
Result = DataReader.Read(ChunkSize); Result = DataReader.Read(ChunkSize);
CurrentData = Result.GetBinaryData(); CurrentData = Result.GetBinaryData();
@ -1812,7 +1818,7 @@ Function UploadObjectInParts(Val Name
, PartNumber , PartNumber
, CurrentData); , CurrentData);
If Response["status"] > 299 Then If Response["status"] > LastSuccessCode Then
Raise "The server returned the status " + String(Response["status"]); Raise "The server returned the status " + String(Response["status"]);
EndIf; EndIf;
@ -1832,27 +1838,27 @@ Function UploadObjectInParts(Val Name
Break; Break;
EndDo; Except
Except If N = Attempts Then
If N = 3 Then // !OInt Message(OPI_Tools.JSONString(Response));
// !OInt Message("Failed to upload part of the file! Aborted upload wiht ID:" + UploadID + "...");
// !OInt Message(OPI_Tools.JSONString(Response)); Error = True;
// !OInt Message("Failed to upload part of the file! Aborted upload wiht ID:" + UploadID + "..."); Break;
Error = True; Else
Break;
Else // !OInt Message("Chunk upload error " + String(N) + "/" + String(Attempts));
// !OInt Message(ErrorDescription());
Continue;
// !OInt Message("Chunk upload error " + String(N) + "/3"); EndIf;
// !OInt Message(ErrorDescription());
Continue;
EndIf; EndTry;
EndTry; EndDo;
PartNumber = PartNumber + 1; PartNumber = PartNumber + 1;
@ -1870,10 +1876,11 @@ EndFunction
Function FormResponse(Val Response, Val ExpectedBinary = False) Function FormResponse(Val Response, Val ExpectedBinary = False)
Status = Response.StatusCode; Status = Response.StatusCode;
Headers = Response.Headers; Headers = Response.Headers;
LastSuccessCode = 299;
If Not ExpectedBinary Or Status > 299 Then If Not ExpectedBinary Or Status > LastSuccessCode Then
ResponseData = New Structure; ResponseData = New Structure;
BodyData = New Structure; BodyData = New Structure;
@ -1909,12 +1916,14 @@ Function FormBucketURL(Val URL, Val Name, Val Directory)
OPI_TypeConversion.GetLine(Name); OPI_TypeConversion.GetLine(Name);
OPI_TypeConversion.GetBoolean(Directory); OPI_TypeConversion.GetBoolean(Directory);
Indication = "://";
If Directory Then If Directory Then
URL = URL + Name; URL = URL + Name;
Else Else
If StrFind(URL, "://") Then If StrFind(URL, Indication) Then
URL = StrReplace(URL, "://", "://" + Name + "."); URL = StrReplace(URL, Indication, Indication + Name + ".");
Else Else
URL = Name + "." + URL; URL = Name + "." + URL;
EndIf; EndIf;
@ -1995,6 +2004,18 @@ Function GetContentSize(Val Entity)
EndFunction EndFunction
Function CloseStreamReceiveData(Val StreamOfFile, Val SavePath)
If TypeOf(StreamOfFile) = Type("MemoryStream") Then
Return StreamOfFile.CloseAndGetBinaryData();
Else
StreamOfFile.Close();
ResponseFile = New File(SavePath);
Return ResponseFile.FullName;
EndIf;
EndFunction
Procedure CheckBasicData(BasicData) Procedure CheckBasicData(BasicData)
ErrorText = "Error of obtaining authorization data from the structure"; ErrorText = "Error of obtaining authorization data from the structure";

View File

@ -32,6 +32,7 @@
// BSLLS:UsingServiceTag-off // BSLLS:UsingServiceTag-off
// BSLLS:ExecuteExternalCodeInCommonModule-off // BSLLS:ExecuteExternalCodeInCommonModule-off
// BSLLS:DuplicateStringLiteral-off // BSLLS:DuplicateStringLiteral-off
// BSLLS:MagicNumber-off
//@skip-check use-non-recommended-method //@skip-check use-non-recommended-method
//@skip-check module-structure-top-region //@skip-check module-structure-top-region
@ -2046,6 +2047,7 @@ Function GetCommonModule(Val Name)
Return Module; Return Module;
EndFunction EndFunction
// BSLLS:CognitiveComplexity-off
Function GetCLIFormedValue(Val Value, Val Embedded = False) Function GetCLIFormedValue(Val Value, Val Embedded = False)
CurrentType = TypeOf(Value); CurrentType = TypeOf(Value);
@ -2081,8 +2083,12 @@ Function GetCLIFormedValue(Val Value, Val Embedded = False)
Else Else
// BSLLS:MissingTemporaryFileDeletion-off
//@skip-check missing-temporary-file-deletion //@skip-check missing-temporary-file-deletion
TFN = GetTempFileName("json"); TFN = GetTempFileName("json");
// BSLLS:MissingTemporaryFileDeletion-on
Stream = New FileStream(TFN, FileOpenMode.Create); Stream = New FileStream(TFN, FileOpenMode.Create);
JSONWriter.OpenStream(Stream); JSONWriter.OpenStream(Stream);
@ -2118,6 +2124,7 @@ Function GetCLIFormedValue(Val Value, Val Embedded = False)
Return Value; Return Value;
EndFunction EndFunction
// BSLLS:CognitiveComplexity-on
Function FormOption(Val Value, Val Name, Val Embedded = False) Function FormOption(Val Value, Val Name, Val Embedded = False)

View File

@ -191,7 +191,11 @@ Function CreateRequest(Val Address, Val AdditionalHeaders = "", Val DataType = "
EndFunction EndFunction
Function CreateConnection(Val Host, Val Safe = True, Val User = "", Val Password = "", Val Port = "") Export Function CreateConnection(Val Host
, Val Safe = True
, Val User = ""
, Val Password = ""
, Val Port = "") Export
If Not ValueIsFilled(Port) Then If Not ValueIsFilled(Port) Then
Port = ?(Safe, 443, 80); Port = ?(Safe, 443, 80);
@ -408,7 +412,10 @@ Function JsonToStructure(Val Text) Export
EndFunction EndFunction
Function JSONString(Val Data, Val Escaping = "None", Val LineBreaks = True, Val DoubleQuotes = True) Export Function JSONString(Val Data
, Val Escaping = "None"
, Val LineBreaks = True
, Val DoubleQuotes = True) Export
LineBreak = ?(LineBreaks, JSONLineBreak.Windows, JSONLineBreak.None); LineBreak = ?(LineBreaks, JSONLineBreak.Windows, JSONLineBreak.None);
@ -825,6 +832,18 @@ Function GetRequestBody(Val Request) Export
EndFunction EndFunction
Function CreateStream(Val FilePath = Undefined) Export
If ValueIsFilled(FilePath) Then
StreamOfFile = New FileStream(FilePath, FileOpenMode.Create);
Else
StreamOfFile = New MemoryStream();
EndIf;
Return StreamOfFile;
EndFunction
Procedure ValueToArray(Value) Export Procedure ValueToArray(Value) Export
If TypeOf(Value) = Type("Array") Then If TypeOf(Value) = Type("Array") Then

View File

@ -1666,11 +1666,11 @@
, Знач ПутьСохранения , Знач ПутьСохранения
, Знач Размеры) , Знач Размеры)
ОбщийРазмер = Размеры["object"]; ОбщийРазмер = Размеры["object"];
РазмерУчастка = Размеры["chunk"]; РазмерУчастка = Размеры["chunk"];
ШаблонЗаголовка = "bytes=%1-%2"; ШаблонЗаголовка = "bytes=%1-%2";
НачалоУчастка = 0; НачалоУчастка = 0;
Попытки = 3; Попытки = 3;
МассивЗаголовков = Новый Массив; МассивЗаголовков = Новый Массив;

View File

@ -2083,7 +2083,7 @@
Иначе Иначе
// BSLLS:MissingTemporaryFileDeletion-off // BSLLS:MissingTemporaryFileDeletion-off
//@skip-check missing-temporary-file-deletion //@skip-check missing-temporary-file-deletion
ИВТ = ПолучитьИмяВременногоФайла("json"); ИВТ = ПолучитьИмяВременногоФайла("json");

View File

@ -192,10 +192,10 @@
КонецФункции КонецФункции
Функция СоздатьСоединение(Знач Сервер Функция СоздатьСоединение(Знач Сервер
, Знач Защищенное = Истина , Знач Защищенное = Истина
, Знач Пользователь = "" , Знач Пользователь = ""
, Знач Пароль = "" , Знач Пароль = ""
, Знач Порт = "") Экспорт , Знач Порт = "") Экспорт
Если Не ЗначениеЗаполнено(Порт) Тогда Если Не ЗначениеЗаполнено(Порт) Тогда
Порт = ?(Защищенное, 443, 80); Порт = ?(Защищенное, 443, 80);
@ -413,8 +413,8 @@
КонецФункции КонецФункции
Функция JSONСтрокой(Знач Данные Функция JSONСтрокой(Знач Данные
, Знач Экранирование = "Нет" , Знач Экранирование = "Нет"
, Знач ПереносСтрок = Истина , Знач ПереносСтрок = Истина
, Знач ДвойныеКавычки = Истина) Экспорт , Знач ДвойныеКавычки = Истина) Экспорт
Перенос = ?(ПереносСтрок, ПереносСтрокJSON.Windows, ПереносСтрокJSON.Нет); Перенос = ?(ПереносСтрок, ПереносСтрокJSON.Windows, ПереносСтрокJSON.Нет);

View File

@ -1666,11 +1666,11 @@
, Знач ПутьСохранения , Знач ПутьСохранения
, Знач Размеры) , Знач Размеры)
ОбщийРазмер = Размеры["object"]; ОбщийРазмер = Размеры["object"];
РазмерУчастка = Размеры["chunk"]; РазмерУчастка = Размеры["chunk"];
ШаблонЗаголовка = "bytes=%1-%2"; ШаблонЗаголовка = "bytes=%1-%2";
НачалоУчастка = 0; НачалоУчастка = 0;
Попытки = 3; Попытки = 3;
МассивЗаголовков = Новый Массив; МассивЗаголовков = Новый Массив;

View File

@ -192,10 +192,10 @@
КонецФункции КонецФункции
Функция СоздатьСоединение(Знач Сервер Функция СоздатьСоединение(Знач Сервер
, Знач Защищенное = Истина , Знач Защищенное = Истина
, Знач Пользователь = "" , Знач Пользователь = ""
, Знач Пароль = "" , Знач Пароль = ""
, Знач Порт = "") Экспорт , Знач Порт = "") Экспорт
Если Не ЗначениеЗаполнено(Порт) Тогда Если Не ЗначениеЗаполнено(Порт) Тогда
Порт = ?(Защищенное, 443, 80); Порт = ?(Защищенное, 443, 80);
@ -413,8 +413,8 @@
КонецФункции КонецФункции
Функция JSONСтрокой(Знач Данные Функция JSONСтрокой(Знач Данные
, Знач Экранирование = "Нет" , Знач Экранирование = "Нет"
, Знач ПереносСтрок = Истина , Знач ПереносСтрок = Истина
, Знач ДвойныеКавычки = Истина) Экспорт , Знач ДвойныеКавычки = Истина) Экспорт
Перенос = ?(ПереносСтрок, ПереносСтрокJSON.Windows, ПереносСтрокJSON.Нет); Перенос = ?(ПереносСтрок, ПереносСтрокJSON.Windows, ПереносСтрокJSON.Нет);

View File

@ -2083,7 +2083,7 @@
Иначе Иначе
// BSLLS:MissingTemporaryFileDeletion-off // BSLLS:MissingTemporaryFileDeletion-off
//@skip-check missing-temporary-file-deletion //@skip-check missing-temporary-file-deletion
ИВТ = ПолучитьИмяВременногоФайла("json"); ИВТ = ПолучитьИмяВременногоФайла("json");