Commit 6393b39a authored by Honfika's avatar Honfika

Chunked response simplified

parent 3c44891d
...@@ -6,7 +6,6 @@ using System.Threading.Tasks; ...@@ -6,7 +6,6 @@ using System.Threading.Tasks;
using StreamExtended.Network; using StreamExtended.Network;
using Titanium.Web.Proxy.Extensions; using Titanium.Web.Proxy.Extensions;
using Titanium.Web.Proxy.Http; using Titanium.Web.Proxy.Http;
using Titanium.Web.Proxy.Shared;
namespace Titanium.Web.Proxy.Helpers namespace Titanium.Web.Proxy.Helpers
{ {
...@@ -64,13 +63,11 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -64,13 +63,11 @@ namespace Titanium.Web.Proxy.Helpers
/// Copies the specified content length number of bytes to the output stream from the given inputs stream /// Copies the specified content length number of bytes to the output stream from the given inputs stream
/// optionally chunked /// optionally chunked
/// </summary> /// </summary>
/// <param name="bufferSize"></param>
/// <param name="inStreamReader"></param> /// <param name="inStreamReader"></param>
/// <param name="isChunked"></param> /// <param name="isChunked"></param>
/// <param name="contentLength"></param> /// <param name="contentLength"></param>
/// <returns></returns> /// <returns></returns>
internal async Task WriteResponseBodyAsync(int bufferSize, CustomBinaryReader inStreamReader, bool isChunked, internal async Task CopyBodyAsync(CustomBinaryReader inStreamReader, bool isChunked, long contentLength)
long contentLength)
{ {
if (!isChunked) if (!isChunked)
{ {
...@@ -84,57 +81,55 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -84,57 +81,55 @@ namespace Titanium.Web.Proxy.Helpers
} }
else else
{ {
await WriteResponseBodyChunkedAsync(inStreamReader); await CopyBodyChunkedAsync(inStreamReader);
} }
} }
/// <summary>
/// Copies the given input bytes to output stream chunked
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
private async Task WriteResponseBodyChunkedAsync(byte[] data)
{
var chunkHead = Encoding.ASCII.GetBytes(data.Length.ToString("x2"));
await WriteAsync(chunkHead);
await WriteLineAsync();
await WriteAsync(data);
await WriteLineAsync();
await WriteLineAsync("0");
await WriteLineAsync();
}
/// <summary> /// <summary>
/// Copies the streams chunked /// Copies the streams chunked
/// </summary> /// </summary>
/// <param name="inStreamReader"></param> /// <param name="inStreamReader"></param>
/// <returns></returns> /// <returns></returns>
internal async Task WriteResponseBodyChunkedAsync(CustomBinaryReader inStreamReader) private async Task CopyBodyChunkedAsync(CustomBinaryReader inStreamReader)
{ {
while (true) while (true)
{ {
string chunkHead = await inStreamReader.ReadLineAsync(); string chunkHead = await inStreamReader.ReadLineAsync();
int chunkSize = int.Parse(chunkHead, NumberStyles.HexNumber); int chunkSize = int.Parse(chunkHead, NumberStyles.HexNumber);
await WriteLineAsync(chunkHead);
if (chunkSize != 0) if (chunkSize != 0)
{ {
var chunkHeadBytes = Encoding.ASCII.GetBytes(chunkSize.ToString("x2"));
await BaseStream.WriteAsync(chunkHeadBytes, 0, chunkHeadBytes.Length);
await BaseStream.WriteAsync(ProxyConstants.NewLineBytes, 0, ProxyConstants.NewLineBytes.Length);
await inStreamReader.CopyBytesToStream(BaseStream, chunkSize); await inStreamReader.CopyBytesToStream(BaseStream, chunkSize);
await BaseStream.WriteAsync(ProxyConstants.NewLineBytes, 0, ProxyConstants.NewLineBytes.Length);
await inStreamReader.ReadLineAsync();
} }
else
await WriteLineAsync();
await inStreamReader.ReadLineAsync();
if (chunkSize == 0)
{ {
await inStreamReader.ReadLineAsync();
await BaseStream.WriteAsync(ProxyConstants.ChunkEnd, 0, ProxyConstants.ChunkEnd.Length);
break; break;
} }
} }
} }
/// <summary>
/// Copies the given input bytes to output stream chunked
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
internal async Task WriteResponseBodyChunkedAsync(byte[] data)
{
var chunkHead = Encoding.ASCII.GetBytes(data.Length.ToString("x2"));
await BaseStream.WriteAsync(chunkHead, 0, chunkHead.Length);
await BaseStream.WriteAsync(ProxyConstants.NewLineBytes, 0, ProxyConstants.NewLineBytes.Length);
await BaseStream.WriteAsync(data, 0, data.Length);
await BaseStream.WriteAsync(ProxyConstants.NewLineBytes, 0, ProxyConstants.NewLineBytes.Length);
await BaseStream.WriteAsync(ProxyConstants.ChunkEnd, 0, ProxyConstants.ChunkEnd.Length);
}
} }
} }
...@@ -53,5 +53,16 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -53,5 +53,16 @@ namespace Titanium.Web.Proxy.Helpers
await FlushAsync(); await FlushAsync();
} }
} }
public async Task WriteAsync(byte[] data, bool flush = false)
{
await FlushAsync();
await BaseStream.WriteAsync(data, 0, data.Length);
if (flush)
{
// flush the stream and the encoder, too
await FlushAsync();
}
}
} }
} }
...@@ -81,8 +81,6 @@ namespace Titanium.Web.Proxy.Http ...@@ -81,8 +81,6 @@ namespace Titanium.Web.Proxy.Http
/// <returns></returns> /// <returns></returns>
internal async Task SendRequest(bool enable100ContinueBehaviour) internal async Task SendRequest(bool enable100ContinueBehaviour)
{ {
var stream = ServerConnection.Stream;
byte[] requestBytes; byte[] requestBytes;
using (var ms = new MemoryStream()) using (var ms = new MemoryStream())
using (var writer = new HttpRequestWriter(ms, bufferSize)) using (var writer = new HttpRequestWriter(ms, bufferSize))
...@@ -127,6 +125,7 @@ namespace Titanium.Web.Proxy.Http ...@@ -127,6 +125,7 @@ namespace Titanium.Web.Proxy.Http
requestBytes = ms.ToArray(); requestBytes = ms.ToArray();
} }
var stream = ServerConnection.Stream;
await stream.WriteAsync(requestBytes, 0, requestBytes.Length); await stream.WriteAsync(requestBytes, 0, requestBytes.Length);
await stream.FlushAsync(); await stream.FlushAsync();
......
...@@ -105,7 +105,7 @@ namespace Titanium.Web.Proxy ...@@ -105,7 +105,7 @@ namespace Titanium.Web.Proxy
//Write body if exists //Write body if exists
if (response.HasBody) if (response.HasBody)
{ {
await clientStreamWriter.WriteResponseBodyAsync(BufferSize, args.WebSession.ServerConnection.StreamReader, await clientStreamWriter.CopyBodyAsync(args.WebSession.ServerConnection.StreamReader,
response.IsChunked, response.ContentLength); response.IsChunked, response.ContentLength);
} }
} }
......
...@@ -14,10 +14,6 @@ namespace Titanium.Web.Proxy.Shared ...@@ -14,10 +14,6 @@ namespace Titanium.Web.Proxy.Shared
internal static readonly char[] SemiColonSplit = { ';' }; internal static readonly char[] SemiColonSplit = { ';' };
internal static readonly char[] EqualSplit = { '=' }; internal static readonly char[] EqualSplit = { '=' };
internal static readonly byte[] NewLineBytes = Encoding.ASCII.GetBytes(NewLine);
internal static readonly byte[] ChunkEnd = Encoding.ASCII.GetBytes(0.ToString("x2") + NewLine + NewLine);
internal const string NewLine = "\r\n"; internal const string NewLine = "\r\n";
} }
} }
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