Skip to content

Commit

Permalink
fix: HTTP Transfer-Encoding: chunked
Browse files Browse the repository at this point in the history
  • Loading branch information
HMBSbige committed Aug 25, 2021
1 parent 457738d commit 7121bc1
Showing 1 changed file with 25 additions and 17 deletions.
42 changes: 25 additions & 17 deletions HttpProxy/HttpToSocks5.cs
Original file line number Diff line number Diff line change
Expand Up @@ -342,23 +342,31 @@ private static async ValueTask CopyChunksAsync(
{
var result = await reader.ReadAsync(cancellationToken);
var buffer = result.Buffer;

try
{
var lengthOfChunkLength = ReadLine(buffer, out var chunkLengthBuffer);
if (lengthOfChunkLength > 0)
while (true)
{
var lengthOfChunkLength = ReadLine(buffer, out var chunkLengthBuffer);
if (lengthOfChunkLength <= 0)
{
break;
}

var chunkLength = GetChunkLength(chunkLengthBuffer);

var length = lengthOfChunkLength + chunkLength + 2;
if (buffer.Length >= length)
if (buffer.Length < length)
{
await target.WriteAsync(buffer.Slice(0, length), cancellationToken);
buffer = buffer.Slice(length);
break;
}

var flushResult = await target.WriteAsync(buffer.Slice(0, length), cancellationToken);
buffer = buffer.Slice(length);

if (chunkLength is 0L)
{
break;
}
if (flushResult.IsCompleted || chunkLength is 0L)
{
return;
}
}
if (result.IsCompleted)
Expand All @@ -383,17 +391,17 @@ static long GetChunkLength(ReadOnlySequence<byte> sequence)
}
return length;
}
}

private static long ReadLine(ReadOnlySequence<byte> sequence, out ReadOnlySequence<byte> value)
{
var reader = new SequenceReader<byte>(sequence);
if (reader.TryReadTo(out value, HttpNewLineSpan))
static long ReadLine(ReadOnlySequence<byte> sequence, out ReadOnlySequence<byte> value)
{
// value 不包括结尾的 \r\n
}
var reader = new SequenceReader<byte>(sequence);
if (reader.TryReadTo(out value, HttpNewLineSpan))
{
// value 不包括结尾的 \r\n
}

return reader.Consumed;
return reader.Consumed;
}
}
}
}

0 comments on commit 7121bc1

Please sign in to comment.