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