Commit 6393b39a authored by Honfika's avatar Honfika

Chunked response simplified

parent 3c44891d
......@@ -6,7 +6,6 @@ using System.Threading.Tasks;
using StreamExtended.Network;
using Titanium.Web.Proxy.Extensions;
using Titanium.Web.Proxy.Http;
using Titanium.Web.Proxy.Shared;
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
/// optionally chunked
/// </summary>
/// <param name="bufferSize"></param>
/// <param name="inStreamReader"></param>
/// <param name="isChunked"></param>
/// <param name="contentLength"></param>
/// <returns></returns>
internal async Task WriteResponseBodyAsync(int bufferSize, CustomBinaryReader inStreamReader, bool isChunked,
long contentLength)
internal async Task CopyBodyAsync(CustomBinaryReader inStreamReader, bool isChunked, long contentLength)
{
if (!isChunked)
{
......@@ -84,57 +81,55 @@ namespace Titanium.Web.Proxy.Helpers
}
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>
/// Copies the streams chunked
/// </summary>
/// <param name="inStreamReader"></param>
/// <returns></returns>
internal async Task WriteResponseBodyChunkedAsync(CustomBinaryReader inStreamReader)
private async Task CopyBodyChunkedAsync(CustomBinaryReader inStreamReader)
{
while (true)
{
string chunkHead = await inStreamReader.ReadLineAsync();
int chunkSize = int.Parse(chunkHead, NumberStyles.HexNumber);
await WriteLineAsync(chunkHead);
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 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;
}
}
}
/// <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
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
/// <returns></returns>
internal async Task SendRequest(bool enable100ContinueBehaviour)
{
var stream = ServerConnection.Stream;
byte[] requestBytes;
using (var ms = new MemoryStream())
using (var writer = new HttpRequestWriter(ms, bufferSize))
......@@ -127,6 +125,7 @@ namespace Titanium.Web.Proxy.Http
requestBytes = ms.ToArray();
}
var stream = ServerConnection.Stream;
await stream.WriteAsync(requestBytes, 0, requestBytes.Length);
await stream.FlushAsync();
......
......@@ -105,7 +105,7 @@ namespace Titanium.Web.Proxy
//Write body if exists
if (response.HasBody)
{
await clientStreamWriter.WriteResponseBodyAsync(BufferSize, args.WebSession.ServerConnection.StreamReader,
await clientStreamWriter.CopyBodyAsync(args.WebSession.ServerConnection.StreamReader,
response.IsChunked, response.ContentLength);
}
}
......
......@@ -14,10 +14,6 @@ namespace Titanium.Web.Proxy.Shared
internal static readonly char[] SemiColonSplit = { ';' };
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";
}
}
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