Commit c5a8e98b authored by Honfika's avatar Honfika

Stream writer should not close the stream

parent 77ecb585
...@@ -10,11 +10,7 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -10,11 +10,7 @@ namespace Titanium.Web.Proxy.Helpers
{ {
sealed class HttpRequestWriter : HttpWriter sealed class HttpRequestWriter : HttpWriter
{ {
public HttpRequestWriter(Stream stream) : base(stream) public HttpRequestWriter(Stream stream) : base(stream, true)
{
}
public HttpRequestWriter(Stream stream, bool leaveOpen) : base(stream, leaveOpen)
{ {
} }
} }
......
...@@ -13,11 +13,7 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -13,11 +13,7 @@ namespace Titanium.Web.Proxy.Helpers
{ {
sealed class HttpResponseWriter : HttpWriter sealed class HttpResponseWriter : HttpWriter
{ {
public HttpResponseWriter(Stream stream) : base(stream) public HttpResponseWriter(Stream stream) : base(stream, true)
{
}
public HttpResponseWriter(Stream stream, bool leaveOpen) : base(stream, leaveOpen)
{ {
} }
......
...@@ -11,12 +11,7 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -11,12 +11,7 @@ namespace Titanium.Web.Proxy.Helpers
{ {
abstract class HttpWriter : StreamWriter abstract class HttpWriter : StreamWriter
{ {
public HttpWriter(Stream stream) : base(stream, Encoding.ASCII) protected HttpWriter(Stream stream, bool leaveOpen) : base(stream, Encoding.ASCII, 1024, leaveOpen)
{
NewLine = ProxyConstants.NewLine;
}
public HttpWriter(Stream stream, bool leaveOpen) : base(stream, Encoding.ASCII, 1024, leaveOpen)
{ {
NewLine = ProxyConstants.NewLine; NewLine = ProxyConstants.NewLine;
} }
......
...@@ -67,7 +67,7 @@ namespace Titanium.Web.Proxy.Network.Tcp ...@@ -67,7 +67,7 @@ namespace Titanium.Web.Proxy.Network.Tcp
if (isHttps) if (isHttps)
{ {
using (var writer = new HttpRequestWriter(stream, true)) using (var writer = new HttpRequestWriter(stream))
{ {
await writer.WriteLineAsync($"CONNECT {remoteHostName}:{remotePort} HTTP/{httpVersion}"); await writer.WriteLineAsync($"CONNECT {remoteHostName}:{remotePort} HTTP/{httpVersion}");
await writer.WriteLineAsync($"Host: {remoteHostName}:{remotePort}"); await writer.WriteLineAsync($"Host: {remoteHostName}:{remotePort}");
......
...@@ -92,8 +92,6 @@ namespace Titanium.Web.Proxy ...@@ -92,8 +92,6 @@ namespace Titanium.Web.Proxy
connectArgs.WebSession.Request = connectRequest; connectArgs.WebSession.Request = connectRequest;
connectArgs.ProxyClient.TcpClient = tcpClient; connectArgs.ProxyClient.TcpClient = tcpClient;
connectArgs.ProxyClient.ClientStream = clientStream; connectArgs.ProxyClient.ClientStream = clientStream;
connectArgs.ProxyClient.ClientStreamReader = clientStreamReader;
connectArgs.ProxyClient.ClientStreamWriter = clientStreamWriter;
if (TunnelConnectRequest != null) if (TunnelConnectRequest != null)
{ {
......
...@@ -69,20 +69,22 @@ namespace Titanium.Web.Proxy ...@@ -69,20 +69,22 @@ namespace Titanium.Web.Proxy
response.ResponseLocked = true; response.ResponseLocked = true;
var clientStreamWriter = args.ProxyClient.ClientStreamWriter;
//Write back to client 100-conitinue response if that's what server returned //Write back to client 100-conitinue response if that's what server returned
if (response.Is100Continue) if (response.Is100Continue)
{ {
await args.ProxyClient.ClientStreamWriter.WriteResponseStatusAsync(response.HttpVersion, (int)HttpStatusCode.Continue, "Continue"); await clientStreamWriter.WriteResponseStatusAsync(response.HttpVersion, (int)HttpStatusCode.Continue, "Continue");
await args.ProxyClient.ClientStreamWriter.WriteLineAsync(); await clientStreamWriter.WriteLineAsync();
} }
else if (response.ExpectationFailed) else if (response.ExpectationFailed)
{ {
await args.ProxyClient.ClientStreamWriter.WriteResponseStatusAsync(response.HttpVersion, (int)HttpStatusCode.ExpectationFailed, "Expectation Failed"); await clientStreamWriter.WriteResponseStatusAsync(response.HttpVersion, (int)HttpStatusCode.ExpectationFailed, "Expectation Failed");
await args.ProxyClient.ClientStreamWriter.WriteLineAsync(); await clientStreamWriter.WriteLineAsync();
} }
//Write back response status to client //Write back response status to client
await args.ProxyClient.ClientStreamWriter.WriteResponseStatusAsync(response.HttpVersion, response.ResponseStatusCode, response.ResponseStatusDescription); await clientStreamWriter.WriteResponseStatusAsync(response.HttpVersion, response.ResponseStatusCode, response.ResponseStatusDescription);
response.ResponseHeaders.FixProxyHeaders(); response.ResponseHeaders.FixProxyHeaders();
if (response.ResponseBodyRead) if (response.ResponseBodyRead)
...@@ -104,22 +106,22 @@ namespace Titanium.Web.Proxy ...@@ -104,22 +106,22 @@ namespace Titanium.Web.Proxy
} }
} }
await args.ProxyClient.ClientStreamWriter.WriteHeadersAsync(response.ResponseHeaders); await clientStreamWriter.WriteHeadersAsync(response.ResponseHeaders);
await args.ProxyClient.ClientStreamWriter.WriteResponseBodyAsync(response.ResponseBody, isChunked); await clientStreamWriter.WriteResponseBodyAsync(response.ResponseBody, isChunked);
} }
else else
{ {
await args.ProxyClient.ClientStreamWriter.WriteHeadersAsync(response.ResponseHeaders); await clientStreamWriter.WriteHeadersAsync(response.ResponseHeaders);
//Write body if exists //Write body if exists
if (response.HasBody) if (response.HasBody)
{ {
await args.ProxyClient.ClientStreamWriter.WriteResponseBodyAsync(BufferSize, args.WebSession.ServerConnection.StreamReader, await clientStreamWriter.WriteResponseBodyAsync(BufferSize, args.WebSession.ServerConnection.StreamReader,
response.IsChunked, response.ContentLength); response.IsChunked, response.ContentLength);
} }
} }
await args.ProxyClient.ClientStream.FlushAsync(); await clientStreamWriter.FlushAsync();
} }
catch (Exception e) catch (Exception e)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment