1010using  Titanium . Web . Proxy . Http . Responses ; 
1111using  Titanium . Web . Proxy . Models ; 
1212using  Titanium . Web . Proxy . Network ; 
13+ using  Titanium . Web . Proxy . Network . Tcp ; 
1314using  Titanium . Web . Proxy . StreamExtended . Network ; 
1415
1516namespace  Titanium . Web . Proxy . EventArguments 
@@ -22,8 +23,6 @@ namespace Titanium.Web.Proxy.EventArguments
2223    /// </summary> 
2324    public  class  SessionEventArgs  :  SessionEventArgsBase 
2425    { 
25-         private  static readonly  byte [ ]  emptyData  =  new  byte [ 0 ] ; 
26- 
2726        /// <summary> 
2827        /// Backing field for corresponding public property 
2928        /// </summary> 
@@ -37,8 +36,8 @@ public class SessionEventArgs : SessionEventArgsBase
3736        /// <summary> 
3837        /// Constructor to initialize the proxy 
3938        /// </summary> 
40-         internal  SessionEventArgs ( ProxyServer  server ,  ProxyEndPoint  endPoint ,  ProxyClient   proxyClient ,  ConnectRequest ?  connectRequest ,  CancellationTokenSource  cancellationTokenSource ) 
41-             :  base ( server ,  endPoint ,  proxyClient ,  connectRequest ,  new  Request ( ) ,  cancellationTokenSource ) 
39+         internal  SessionEventArgs ( ProxyServer  server ,  ProxyEndPoint  endPoint ,  TcpClientConnection   clientConnection ,   HttpClientStream   clientStream ,  ConnectRequest ?  connectRequest ,  CancellationTokenSource  cancellationTokenSource ) 
40+             :  base ( server ,  endPoint ,  clientConnection ,   clientStream ,  connectRequest ,  new  Request ( ) ,  cancellationTokenSource ) 
4241        { 
4342        } 
4443
@@ -66,14 +65,9 @@ public bool ReRequest
6665        /// </summary> 
6766        public  event  EventHandler < MultipartRequestPartSentEventArgs > ?  MultipartRequestPartSent ; 
6867
69-         private  CustomBufferedStream  getStreamReader ( bool  isRequest ) 
70-         { 
71-             return  isRequest  ?  ProxyClient . ClientStream  :  HttpClient . Connection . Stream ; 
72-         } 
73- 
74-         private  HttpWriter  getStreamWriter ( bool  isRequest ) 
68+         private  HttpStream  getStream ( bool  isRequest ) 
7569        { 
76-             return  isRequest  ?  ( HttpWriter ) ProxyClient . ClientStreamWriter  :  HttpClient . Connection . StreamWriter ; 
70+             return  isRequest  ?  ( HttpStream ) ClientStream  :  HttpClient . Connection . Stream ; 
7771        } 
7872
7973        /// <summary> 
@@ -110,7 +104,10 @@ private async Task readRequestBodyAsync(CancellationToken cancellationToken)
110104                else 
111105                { 
112106                    var  body  =  await  readBodyAsync ( true ,  cancellationToken ) ; 
113-                     request . Body  =  body ; 
107+                     if  ( ! request . BodyAvailable ) 
108+                     { 
109+                         request . Body  =  body ; 
110+                     } 
114111
115112                    // Now set the flag to true 
116113                    // So that next time we can deliver body from cache 
@@ -182,7 +179,10 @@ private async Task readResponseBodyAsync(CancellationToken cancellationToken)
182179                else 
183180                { 
184181                    var  body  =  await  readBodyAsync ( false ,  cancellationToken ) ; 
185-                     response . Body  =  body ; 
182+                     if  ( ! response . BodyAvailable ) 
183+                     { 
184+                         response . Body  =  body ; 
185+                     } 
186186
187187                    // Now set the flag to true 
188188                    // So that next time we can deliver body from cache 
@@ -193,21 +193,19 @@ private async Task readResponseBodyAsync(CancellationToken cancellationToken)
193193
194194        private  async  Task < byte [ ] >  readBodyAsync ( bool  isRequest ,  CancellationToken  cancellationToken ) 
195195        { 
196-             using  ( var  bodyStream  =  new  MemoryStream ( ) ) 
197-             { 
198-                 var  writer  =  new  HttpWriter ( bodyStream ,  BufferPool ) ; 
199- 
200-                 if  ( isRequest ) 
201-                 { 
202-                     await  CopyRequestBodyAsync ( writer ,  TransformationMode . Uncompress ,  cancellationToken ) ; 
203-                 } 
204-                 else 
205-                 { 
206-                     await  CopyResponseBodyAsync ( writer ,  TransformationMode . Uncompress ,  cancellationToken ) ; 
207-                 } 
196+             using  var  bodyStream  =  new  MemoryStream ( ) ; 
197+             using  var  http  =  new  HttpStream ( bodyStream ,  BufferPool ) ; 
208198
209-                 return  bodyStream . ToArray ( ) ; 
199+             if  ( isRequest ) 
200+             { 
201+                 await  CopyRequestBodyAsync ( http ,  TransformationMode . Uncompress ,  cancellationToken ) ; 
202+             } 
203+             else 
204+             { 
205+                 await  CopyResponseBodyAsync ( http ,  TransformationMode . Uncompress ,  cancellationToken ) ; 
210206            } 
207+ 
208+             return  bodyStream . ToArray ( ) ; 
211209        } 
212210
213211        /// <summary> 
@@ -225,18 +223,16 @@ internal async Task SyphonOutBodyAsync(bool isRequest, CancellationToken cancell
225223                return ; 
226224            } 
227225
228-             using  ( var  bodyStream  =  new  MemoryStream ( ) ) 
229-             { 
230-                 var  writer  =  new  HttpWriter ( bodyStream ,  BufferPool ) ; 
231-                 await  copyBodyAsync ( isRequest ,  true ,  writer ,  TransformationMode . None ,  null ,  cancellationToken ) ; 
232-             } 
226+             using  var  bodyStream  =  new  MemoryStream ( ) ; 
227+             using  var  http  =  new  HttpStream ( bodyStream ,  BufferPool ) ; 
228+             await  copyBodyAsync ( isRequest ,  true ,  http ,  TransformationMode . None ,  null ,  cancellationToken ) ; 
233229        } 
234230
235231        /// <summary> 
236232        ///  This is called when the request is PUT/POST/PATCH to read the body 
237233        /// </summary> 
238234        /// <returns></returns> 
239-         internal  async  Task  CopyRequestBodyAsync ( HttpWriter  writer ,  TransformationMode  transformation ,  CancellationToken  cancellationToken ) 
235+         internal  async  Task  CopyRequestBodyAsync ( IHttpStreamWriter  writer ,  TransformationMode  transformation ,  CancellationToken  cancellationToken ) 
240236        { 
241237            var  request  =  HttpClient . Request ; 
242238
@@ -245,7 +241,7 @@ internal async Task CopyRequestBodyAsync(HttpWriter writer, TransformationMode t
245241            // send the request body bytes to server 
246242            if  ( contentLength  >  0  &&  hasMulipartEventSubscribers  &&  request . IsMultipartFormData ) 
247243            { 
248-                 var  reader  =  getStreamReader ( true ) ; 
244+                 var  reader  =  getStream ( true ) ; 
249245                var  boundary  =  HttpHelper . GetBoundaryFromContentType ( request . ContentType ) ; 
250246
251247                using  ( var  copyStream  =  new  CopyStream ( reader ,  writer ,  BufferPool ) ) 
@@ -275,14 +271,14 @@ internal async Task CopyRequestBodyAsync(HttpWriter writer, TransformationMode t
275271            } 
276272        } 
277273
278-         internal  async  Task  CopyResponseBodyAsync ( HttpWriter  writer ,  TransformationMode  transformation ,  CancellationToken  cancellationToken ) 
274+         internal  async  Task  CopyResponseBodyAsync ( IHttpStreamWriter  writer ,  TransformationMode  transformation ,  CancellationToken  cancellationToken ) 
279275        { 
280276            await  copyBodyAsync ( false ,  false ,  writer ,  transformation ,  OnDataReceived ,  cancellationToken ) ; 
281277        } 
282278
283-         private  async  Task  copyBodyAsync ( bool  isRequest ,  bool  useOriginalHeaderValues ,  HttpWriter  writer ,  TransformationMode  transformation ,  Action < byte [ ] ,  int ,  int > ?  onCopy ,  CancellationToken  cancellationToken ) 
279+         private  async  Task  copyBodyAsync ( bool  isRequest ,  bool  useOriginalHeaderValues ,  IHttpStreamWriter  writer ,  TransformationMode  transformation ,  Action < byte [ ] ,  int ,  int > ?  onCopy ,  CancellationToken  cancellationToken ) 
284280        { 
285-             var  stream  =  getStreamReader ( isRequest ) ; 
281+             var  stream  =  getStream ( isRequest ) ; 
286282
287283            var  requestResponse  =  isRequest  ?  ( RequestResponseBase ) HttpClient . Request  :  HttpClient . Response ; 
288284
@@ -309,10 +305,8 @@ private async Task copyBodyAsync(bool isRequest, bool useOriginalHeaderValues, H
309305
310306            try 
311307            { 
312-                 using  ( var  bufStream  =  new  CustomBufferedStream ( s ,  BufferPool ,  true ) ) 
313-                 { 
314-                     await  writer . CopyBodyAsync ( bufStream ,  false ,  - 1 ,  onCopy ,  cancellationToken ) ; 
315-                 } 
308+                 var  http  =  new  HttpStream ( s ,  BufferPool ,  true ) ; 
309+                 await  writer . CopyBodyAsync ( http ,  false ,  - 1 ,  onCopy ,  cancellationToken ) ; 
316310            } 
317311            finally 
318312            { 
@@ -595,7 +589,7 @@ public void Redirect(string url, bool closeServerConnection = false)
595589            var  response  =  new  RedirectResponse ( ) ; 
596590            response . HttpVersion  =  HttpClient . Request . HttpVersion ; 
597591            response . Headers . AddHeader ( KnownHeaders . Location ,  url ) ; 
598-             response . Body  =  emptyData ; 
592+             response . Body  =  Array . Empty < byte > ( ) ; 
599593
600594            Respond ( response ,  closeServerConnection ) ; 
601595        } 
0 commit comments