Skip to content

Commit 579d119

Browse files
committed
Сырая альфа HTTPСоединения
1 parent bd435bb commit 579d119

2 files changed

Lines changed: 93 additions & 5 deletions

File tree

src/ScriptEngine.HostedScript/Library/Http/HttpConnectionContext.cs

Lines changed: 88 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,16 +101,21 @@ public HttpResponseContext Put(HttpRequestContext request)
101101
[ContextMethod("ОтправитьДляОбработки", "Post")]
102102
public HttpResponseContext Post(HttpRequestContext request, string output = null)
103103
{
104-
return GetResponse(request, "POST");
104+
return GetResponse(request, "POST", output);
105+
}
106+
107+
[ContextMethod("Удалить", "Delete")]
108+
public HttpResponseContext Delete(HttpRequestContext request, string output = null)
109+
{
110+
return GetResponse(request, "DELETE");
105111
}
106112

107113
private HttpWebRequest CreateRequest(string resource)
108114
{
109115
var uriBuilder = new UriBuilder(_hostUri);
110116
if(Port != 0)
111117
uriBuilder.Port = Port;
112-
uriBuilder.Scheme = "http";
113-
118+
114119
var resourceUri = new Uri(uriBuilder.Uri, resource);
115120

116121
var request = (HttpWebRequest)HttpWebRequest.Create(resourceUri);
@@ -131,6 +136,7 @@ private HttpResponseContext GetResponse(HttpRequestContext request, string metho
131136
{
132137
var webRequest = CreateRequest(request.ResourceAddress);
133138
webRequest.Method = method;
139+
webRequest.KeepAlive = false;
134140
SetRequestHeaders(request, webRequest);
135141
SetRequestBody(request, webRequest);
136142

@@ -169,7 +175,18 @@ private static void SetRequestBody(HttpRequestContext request, HttpWebRequest we
169175

170176
using(var requestStream = webRequest.GetRequestStream())
171177
{
172-
stream.CopyTo(requestStream);
178+
const int CHUNK_SIZE = 4096;
179+
byte[] buf = new byte[CHUNK_SIZE];
180+
181+
while(true)
182+
{
183+
int bytesRead = stream.Read(buf, 0, CHUNK_SIZE);
184+
if (bytesRead == 0)
185+
break;
186+
187+
requestStream.Write(buf, 0, bytesRead);
188+
189+
}
173190
}
174191
}
175192
}
@@ -182,8 +199,74 @@ private static void SetRequestHeaders(HttpRequestContext request, HttpWebRequest
182199

183200
var key = item.Key.AsString();
184201
var value = item.Value.AsString();
202+
203+
switch(key.ToUpperInvariant())
204+
{
205+
case "CONTENT-TYPE":
206+
webRequest.ContentType = value;
207+
break;
208+
case "CONTENT-LENGTH":
209+
try
210+
{
211+
webRequest.ContentLength = Int32.Parse(value);
212+
}
213+
catch (FormatException)
214+
{
215+
throw new RuntimeException("Заголовок Content-Length задан неправильно");
216+
}
217+
break;
218+
case "ACCEPT":
219+
webRequest.Accept = value;
220+
break;
221+
case "EXPECT":
222+
webRequest.Expect = value;
223+
break;
224+
case "TRANSFER-ENCODING":
225+
webRequest.TransferEncoding = value;
226+
break;
227+
case "CONNECTION":
228+
webRequest.Connection = value;
229+
break;
230+
case "DATE":
231+
try
232+
{
233+
webRequest.Date = DateTime.Parse(value);
234+
}
235+
catch (FormatException)
236+
{
237+
throw new RuntimeException("Заголовок Date задан неправильно");
238+
}
239+
break;
240+
case "HOST":
241+
webRequest.Host = value;
242+
break;
243+
case "IF-MODIFIED-SINCE":
244+
try
245+
{
246+
webRequest.IfModifiedSince = DateTime.Parse(value);
247+
}
248+
catch (FormatException)
249+
{
250+
throw new RuntimeException("Заголовок If-Modified-Since задан неправильно");
251+
}
252+
break;
253+
case "RANGE":
254+
throw new NotImplementedException();
255+
case "REFERER":
256+
webRequest.Referer = value;
257+
break;
258+
case "USER-AGENT":
259+
webRequest.UserAgent = value;
260+
break;
261+
case "PROXY-CONNECTION":
262+
throw new NotImplementedException();
263+
default:
264+
webRequest.Headers.Set(key, value);
265+
break;
266+
267+
}
268+
185269

186-
webRequest.Headers.Set(key, value);
187270

188271
}
189272
}

src/ScriptEngine.HostedScript/Library/Http/HttpResponseContext.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,12 @@ public IValue GetBodyAsString(IValue encoding = null)
8282

8383
Encoding enc;
8484
if (encoding == null)
85+
{
86+
if (String.IsNullOrEmpty(_defaultCharset))
87+
_defaultCharset = "utf-8";
88+
8589
enc = Encoding.GetEncoding(_defaultCharset);
90+
}
8691
else
8792
enc = TextEncodingEnum.GetEncoding(encoding);
8893

0 commit comments

Comments
 (0)