@@ -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 }
0 commit comments