diff --git a/src/OneScript.StandardLibrary/Http/HttpConnectionContext.cs b/src/OneScript.StandardLibrary/Http/HttpConnectionContext.cs index 78472bfbc..553bdfc6a 100644 --- a/src/OneScript.StandardLibrary/Http/HttpConnectionContext.cs +++ b/src/OneScript.StandardLibrary/Http/HttpConnectionContext.cs @@ -1,4 +1,4 @@ -/*---------------------------------------------------------- +/*---------------------------------------------------------- This Source Code Form is subject to the terms of the Mozilla Public License, v.2.0. If a copy of the MPL was not distributed with this file, You can obtain one @@ -199,11 +199,23 @@ public HttpResponseContext Head(HttpRequestContext request) /// Строка. Имя выходного файла /// HTTPОтвет. Ответ сервера. [ContextMethod("ВызватьHTTPМетод", "CallHTTPMethod")] - public HttpResponseContext Patch(string method, HttpRequestContext request, string output = null) + public HttpResponseContext CallHTTPMethod(string method, HttpRequestContext request, string output = null) { return GetResponse(request, method, output); } + /// + /// Вызвать произвольный HTTP-метод с потоком ответа + /// + /// Строка. Имя метода HTTP + /// HTTPЗапрос. Данные и заголовки запроса http + /// HTTPОтвет. Ответ сервера. + [ContextMethod("ВызватьHTTPМетодПоток", "CallHTTPMethodStream")] + public HttpResponseContext CallHTTPMethodStream(string method, HttpRequestContext request) + { + return GetResponse(request, method, null, true); + } + private HttpWebRequest CreateRequest(string resource) { var uriBuilder = new UriBuilder(_hostUri); @@ -335,7 +347,7 @@ private static List ParseRange(string rangeHeader) return range; } - private HttpResponseContext GetResponse(HttpRequestContext request, string method, string output = null) + private HttpResponseContext GetResponse(HttpRequestContext request, string method, string output = null, bool rawStream = false) { var webRequest = CreateRequest(request.ResourceAddress); webRequest.AllowAutoRedirect = AllowAutoRedirect; @@ -359,7 +371,7 @@ private HttpResponseContext GetResponse(HttpRequestContext request, string metho throw; } - var responseContext = new HttpResponseContext(response, output); + var responseContext = new HttpResponseContext(response, output, rawStream); return responseContext; diff --git a/src/OneScript.StandardLibrary/Http/HttpResponseContext.cs b/src/OneScript.StandardLibrary/Http/HttpResponseContext.cs index 6f4f0fcbb..8e613ed02 100644 --- a/src/OneScript.StandardLibrary/Http/HttpResponseContext.cs +++ b/src/OneScript.StandardLibrary/Http/HttpResponseContext.cs @@ -1,4 +1,4 @@ -/*---------------------------------------------------------- +/*---------------------------------------------------------- This Source Code Form is subject to the terms of the Mozilla Public License, v.2.0. If a copy of the MPL was not distributed with this file, You can obtain one @@ -28,18 +28,27 @@ public class HttpResponseContext : AutoContext, IDisposable // TODO: Нельзя выделить массив размером больше чем 2GB // поэтому функционал сохранения в файл не должен использовать промежуточный буфер _body private HttpResponseBody _body; - + private Stream _rawStream; + private string _defaultCharset; private string _filename; - public HttpResponseContext(HttpWebResponse response) + public HttpResponseContext(HttpWebResponse response, string dumpToFile, bool rawStream) { - RetrieveResponseData(response, null); - } - public HttpResponseContext(HttpWebResponse response, string dumpToFile) - { - RetrieveResponseData(response, dumpToFile); + if (!rawStream) + { + + RetrieveResponseData(response, dumpToFile); + } + else + { + StatusCode = (int)response.StatusCode; + _defaultCharset = response.CharacterSet; + + ProcessHeaders(response.Headers); + _rawStream = response.GetResponseStream(); + } } private void RetrieveResponseData(HttpWebResponse response, string dumpToFile) @@ -151,6 +160,9 @@ public IValue GetBodyAsBinaryData() [ContextMethod("ПолучитьТелоКакПоток", "GetBodyAsStream")] public IValue GetBodyAsStream() { + if(_rawStream != null) + return new GenericStream(_rawStream, true); + if (_body == null) return ValueFactory.Create();