Verify contination frames.
This commit is contained in:
parent
31c76a0032
commit
e8c4985322
|
|
@ -215,8 +215,14 @@ namespace Microsoft.AspNet.WebSockets.Protocol
|
||||||
await ReadNextFrameAsync(cancellationToken);
|
await ReadNextFrameAsync(cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle fragmentation, remember the first frame type
|
|
||||||
int opCode = _frameInProgress.OpCode;
|
int opCode = _frameInProgress.OpCode;
|
||||||
|
|
||||||
|
if (opCode == Constants.OpCodes.CloseFrame)
|
||||||
|
{
|
||||||
|
return await ProcessCloseFrameAsync(cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle fragmentation, remember the first frame type
|
||||||
if (opCode == Constants.OpCodes.ContinuationFrame)
|
if (opCode == Constants.OpCodes.ContinuationFrame)
|
||||||
{
|
{
|
||||||
if (!_firstDataOpCode.HasValue)
|
if (!_firstDataOpCode.HasValue)
|
||||||
|
|
@ -230,11 +236,6 @@ namespace Microsoft.AspNet.WebSockets.Protocol
|
||||||
_firstDataOpCode = opCode;
|
_firstDataOpCode = opCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opCode == Constants.OpCodes.CloseFrame)
|
|
||||||
{
|
|
||||||
return await ProcessCloseFrameAsync(cancellationToken);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make sure there's at least some data in the buffer
|
// Make sure there's at least some data in the buffer
|
||||||
int bytesToBuffer = (int)Math.Min((long)_receiveBuffer.Length, _frameBytesRemaining);
|
int bytesToBuffer = (int)Math.Min((long)_receiveBuffer.Length, _frameBytesRemaining);
|
||||||
await EnsureDataAvailableOrReadAsync(bytesToBuffer, cancellationToken);
|
await EnsureDataAvailableOrReadAsync(bytesToBuffer, cancellationToken);
|
||||||
|
|
@ -329,6 +330,11 @@ namespace Microsoft.AspNet.WebSockets.Protocol
|
||||||
_frameInProgress = null;
|
_frameInProgress = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (_firstDataOpCode.HasValue && _frameInProgress.OpCode != Constants.OpCodes.ContinuationFrame)
|
||||||
|
{
|
||||||
|
// A data frame is already in progress, but this new frame is not a continuation frame.
|
||||||
|
await SendErrorAbortAndThrow(WebSocketCloseStatus.ProtocolError, "Expected a continuation frame: " + _frameInProgress.OpCode, cancellationToken);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task EnsureDataAvailableOrReadAsync(int bytesNeeded, CancellationToken cancellationToken)
|
private async Task EnsureDataAvailableOrReadAsync(int bytesNeeded, CancellationToken cancellationToken)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue