Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 28 additions & 23 deletions src/OneScript.StandardLibrary/Http/HttpConnectionContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ This Source Code Form is subject to the terms of the
using System.Text;
using OneScript.Contexts;
using OneScript.Exceptions;
using OneScript.Execution;
using OneScript.StandardLibrary.Collections;
using OneScript.Types;
using RegExp = System.Text.RegularExpressions;
Expand Down Expand Up @@ -130,9 +131,9 @@ public int Timeout
/// <param name="output">Строка. Имя файла, в который нужно записать ответ. Необязательный параметр.</param>
/// <returns>HTTPОтвет. Ответ сервера.</returns>
[ContextMethod("Получить", "Get")]
public HttpResponseContext Get(HttpRequestContext request, string output = null)
public HttpResponseContext Get(IBslProcess process, HttpRequestContext request, string output = null)
{
return GetResponse(request, "GET", output);
return GetResponse(process, request, "GET", output);
}

/// <summary>
Expand All @@ -141,9 +142,9 @@ public HttpResponseContext Get(HttpRequestContext request, string output = null)
/// <param name="request">HTTPЗапрос. Данные и заголовки запроса http</param>
/// <returns>HTTPОтвет. Ответ сервера.</returns>
[ContextMethod("Записать", "Put")]
public HttpResponseContext Put(HttpRequestContext request)
public HttpResponseContext Put(IBslProcess process, HttpRequestContext request)
{
return GetResponse(request, "PUT");
return GetResponse(process, request, "PUT", null);
}

/// <summary>
Expand All @@ -153,9 +154,9 @@ public HttpResponseContext Put(HttpRequestContext request)
/// <param name="output">Строка. Имя файла, в который нужно записать ответ. Необязательный параметр.</param>
/// <returns>HTTPОтвет. Ответ сервера.</returns>
[ContextMethod("ОтправитьДляОбработки", "Post")]
public HttpResponseContext Post(HttpRequestContext request, string output = null)
public HttpResponseContext Post(IBslProcess process, HttpRequestContext request, string output = null)
{
return GetResponse(request, "POST", output);
return GetResponse(process, request, "POST", output);
}

/// <summary>
Expand All @@ -164,9 +165,9 @@ public HttpResponseContext Post(HttpRequestContext request, string output = null
/// <param name="request">HTTPЗапрос. Данные и заголовки запроса http</param>
/// <returns>HTTPОтвет. Ответ сервера.</returns>
[ContextMethod("Удалить", "Delete")]
public HttpResponseContext Delete(HttpRequestContext request)
public HttpResponseContext Delete(IBslProcess process, HttpRequestContext request)
{
return GetResponse(request, "DELETE");
return GetResponse(process, request, "DELETE");
}

/// <summary>
Expand All @@ -175,9 +176,9 @@ public HttpResponseContext Delete(HttpRequestContext request)
/// <param name="request">HTTPЗапрос. Данные и заголовки запроса http</param>
/// <returns>HTTPОтвет. Ответ сервера.</returns>
[ContextMethod("Изменить", "Patch")]
public HttpResponseContext Patch(HttpRequestContext request)
public HttpResponseContext Patch(IBslProcess process, HttpRequestContext request)
{
return GetResponse(request, "PATCH");
return GetResponse(process, request, "PATCH");
}

/// <summary>
Expand All @@ -186,9 +187,9 @@ public HttpResponseContext Patch(HttpRequestContext request)
/// <param name="request">HTTPЗапрос. Данные и заголовки запроса http</param>
/// <returns>HTTPОтвет. Ответ сервера.</returns>
[ContextMethod("ПолучитьЗаголовки", "Head")]
public HttpResponseContext Head(HttpRequestContext request)
public HttpResponseContext Head(IBslProcess process, HttpRequestContext request)
{
return GetResponse(request, "HEAD");
return GetResponse(process, request, "HEAD");
}

/// <summary>
Expand All @@ -199,9 +200,9 @@ public HttpResponseContext Head(HttpRequestContext request)
/// <param name="output">Строка. Имя выходного файла</param>
/// <returns>HTTPОтвет. Ответ сервера.</returns>
[ContextMethod("ВызватьHTTPМетод", "CallHTTPMethod")]
public HttpResponseContext Patch(string method, HttpRequestContext request, string output = null)
public HttpResponseContext CallHTTPMethod(IBslProcess process, string method, HttpRequestContext request, string output = null)
{
return GetResponse(request, method, output);
return GetResponse(process, request, method, output);
}

private HttpWebRequest CreateRequest(string resource)
Expand Down Expand Up @@ -335,12 +336,12 @@ private static List<Range> ParseRange(string rangeHeader)
return range;
}

private HttpResponseContext GetResponse(HttpRequestContext request, string method, string output = null)
private HttpResponseContext GetResponse(IBslProcess process, HttpRequestContext request, string method, string output = null)
{
var webRequest = CreateRequest(request.ResourceAddress);
webRequest.AllowAutoRedirect = AllowAutoRedirect;
webRequest.Method = method;
SetRequestHeaders(request, webRequest);
SetRequestHeaders(request, webRequest, process);

if (ContentBodyAllowed(method))
SetRequestBody(request, webRequest);
Expand Down Expand Up @@ -385,7 +386,7 @@ private static void SetRequestBody(HttpRequestContext request, HttpWebRequest we
}
}

private static void SetRequestHeaders(HttpRequestContext request, HttpWebRequest webRequest)
private static void SetRequestHeaders(HttpRequestContext request, HttpWebRequest webRequest, IBslProcess process)
{
foreach (var item in request.Headers.Select(x => x.GetRawValue() as KeyAndValueImpl))
{
Expand Down Expand Up @@ -483,15 +484,19 @@ private static void SetRequestHeaders(HttpRequestContext request, HttpWebRequest
default:
webRequest.Headers.Set(key, value);
break;

}
}

// fix #1151
if (webRequest.UserAgent == default)
{
webRequest.UserAgent = $"1Script v${Assembly.GetExecutingAssembly().GetName().Version}";
}
// fix #1151
if (webRequest.UserAgent == default)
{
webRequest.UserAgent = $"1Script v${Assembly.GetExecutingAssembly().GetName().Version}";
}

if (request.AccessToken != null)
{
string token = request.AccessToken.ToString(process);
Copy link
Owner

@EvilBeaver EvilBeaver Aug 19, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Упадет, если null. (везде в методах он необязательный со значением null по умолчанию)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сделал обязательным process

webRequest.Headers.Set(HttpRequestHeader.Authorization, $"Bearer {token}");
}
}

Expand Down
13 changes: 13 additions & 0 deletions src/OneScript.StandardLibrary/Http/HttpRequestContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ This Source Code Form is subject to the terms of the
using OneScript.Exceptions;
using OneScript.StandardLibrary.Binary;
using OneScript.StandardLibrary.Collections;
using OneScript.StandardLibrary.Security.Tokens;
using OneScript.StandardLibrary.Text;
using ScriptEngine.Machine;
using ScriptEngine.Machine.Contexts;
Expand Down Expand Up @@ -44,6 +45,8 @@ private void SetBody(IHttpRequestBody newBody)

public Stream Body => _body?.GetDataStream();

public AccessTokenContext AccessToken { get; private set; }

/// <summary>
/// Относительный путь к ресурсу на сервере (не включает имя сервера)
/// </summary>
Expand Down Expand Up @@ -115,6 +118,16 @@ public GenericStream GetBodyAsStream()
return new GenericStream(_body.GetDataStream());
}

/// <summary>
/// Добавляет токен доступа к HTTP-запросу. Устанавливает заголовок Authorization.
/// </summary>
/// <param name="accessToken">Токен доступа</param>
[ContextMethod("ДобавитьТокенДоступа", "AddAccessToken")]
public void AddAccessToken(AccessTokenContext accessToken)
{
AccessToken = accessToken;
}

[ScriptConstructor(Name = "Формирование неинициализированного объекта")]
public static HttpRequestContext Constructor()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
<PackageReference Include="ProDotNetZip" Version="1.20.0" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="8.14.0" />
</ItemGroup>

<ItemGroup>
Expand Down
Loading