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
{
sealed class HttpRequestWriter : HttpWriter
{
public HttpRequestWriter(Stream stream) : base(stream)
{
}
public HttpRequestWriter(Stream stream, bool leaveOpen) : base(stream, leaveOpen)
public HttpRequestWriter(Stream stream) : base(stream, true)
{
}
}
......
......@@ -13,11 +13,7 @@ namespace Titanium.Web.Proxy.Helpers
{
sealed class HttpResponseWriter : HttpWriter
{
public HttpResponseWriter(Stream stream) : base(stream)
{
}
public HttpResponseWriter(Stream stream, bool leaveOpen) : base(stream, leaveOpen)
public HttpResponseWriter(Stream stream) : base(stream, true)
{
}
......
......@@ -11,12 +11,7 @@ namespace Titanium.Web.Proxy.Helpers
{
abstract class HttpWriter : StreamWriter
{
public HttpWriter(Stream stream) : base(stream, Encoding.ASCII)
{
NewLine = ProxyConstants.NewLine;
}
public HttpWriter(Stream stream, bool leaveOpen) : base(stream, Encoding.ASCII, 1024, leaveOpen)
protected HttpWriter(Stream stream, bool leaveOpen) : base(stream, Encoding.ASCII, 1024, leaveOpen)
{
NewLine = ProxyConstants.NewLine;
}
......
......@@ -67,7 +67,7 @@ namespace Titanium.Web.Proxy.Network.Tcp
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($"Host: {remoteHostName}:{remotePort}");
......
......@@ -92,8 +92,6 @@ namespace Titanium.Web.Proxy
connectArgs.WebSession.Request = connectRequest;
connectArgs.ProxyClient.TcpClient = tcpClient;
connectArgs.ProxyClient.ClientStream = clientStream;
connectArgs.ProxyClient.ClientStreamReader = clientStreamReader;
connectArgs.ProxyClient.ClientStreamWriter = clientStreamWriter;
if (TunnelConnectRequest != null)
{
......
......@@ -69,20 +69,22 @@ namespace Titanium.Web.Proxy
response.ResponseLocked = true;
var clientStreamWriter = args.ProxyClient.ClientStreamWriter;
//Write back to client 100-conitinue response if that's what server returned
if (response.Is100Continue)
{
await args.ProxyClient.ClientStreamWriter.WriteResponseStatusAsync(response.HttpVersion, (int)HttpStatusCode.Continue, "Continue");
await args.ProxyClient.ClientStreamWriter.WriteLineAsync();
await clientStreamWriter.WriteResponseStatusAsync(response.HttpVersion, (int)HttpStatusCode.Continue, "Continue");
await clientStreamWriter.WriteLineAsync();
}
else if (response.ExpectationFailed)
{
await args.ProxyClient.ClientStreamWriter.WriteResponseStatusAsync(response.HttpVersion, (int)HttpStatusCode.ExpectationFailed, "Expectation Failed");
await args.ProxyClient.ClientStreamWriter.WriteLineAsync();
await clientStreamWriter.WriteResponseStatusAsync(response.HttpVersion, (int)HttpStatusCode.ExpectationFailed, "Expectation Failed");
await clientStreamWriter.WriteLineAsync();
}
//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();
if (response.ResponseBodyRead)
......@@ -104,22 +106,22 @@ namespace Titanium.Web.Proxy
}
}
await args.ProxyClient.ClientStreamWriter.WriteHeadersAsync(response.ResponseHeaders);
await args.ProxyClient.ClientStreamWriter.WriteResponseBodyAsync(response.ResponseBody, isChunked);
await clientStreamWriter.WriteHeadersAsync(response.ResponseHeaders);
await clientStreamWriter.WriteResponseBodyAsync(response.ResponseBody, isChunked);
}
else
{
await args.ProxyClient.ClientStreamWriter.WriteHeadersAsync(response.ResponseHeaders);
await clientStreamWriter.WriteHeadersAsync(response.ResponseHeaders);
//Write body if exists
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);
}
}
await args.ProxyClient.ClientStream.FlushAsync();
await clientStreamWriter.FlushAsync();
}
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