/// <summary> /// Copies the streams chunked /// </summary> /// <param name="reader"></param> /// <param name="removeChunkedEncoding"></param> /// <param name="onCopy"></param> /// <returns></returns> private async Task CopyBodyChunkedAsync(CustomBinaryReader reader, bool removeChunkedEncoding, Action <byte[], int, int> onCopy) { while (true) { string chunkHead = await reader.ReadLineAsync(); int chunkSize = int.Parse(chunkHead, NumberStyles.HexNumber); if (!removeChunkedEncoding) { await WriteLineAsync(chunkHead); } if (chunkSize != 0) { await CopyBytesFromStream(reader, chunkSize, onCopy); } if (!removeChunkedEncoding) { await WriteLineAsync(); } //chunk trail await reader.ReadLineAsync(); if (chunkSize == 0) { break; } } }
/// <summary> /// Copies the streams chunked /// </summary> /// <param name="inStreamReader"></param> /// <returns></returns> internal async Task WriteResponseBodyChunkedAsync(CustomBinaryReader inStreamReader) { while (true) { string chunkHead = await inStreamReader.ReadLineAsync(); int chunkSize = int.Parse(chunkHead, NumberStyles.HexNumber); 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 inStreamReader.ReadLineAsync(); await BaseStream.WriteAsync(ProxyConstants.ChunkEnd, 0, ProxyConstants.ChunkEnd.Length); break; } } }