You've already forked linux-packaging-mono
Imported Upstream version 3.12.0
Former-commit-id: cf92446697332992ec36726e78eb8703e1f259d7
This commit is contained in:
@ -61,6 +61,7 @@ namespace System.Net.WebSockets
|
||||
const int HeaderMaxLength = 14;
|
||||
byte[] headerBuffer;
|
||||
byte[] sendBuffer;
|
||||
long remaining;
|
||||
|
||||
public ClientWebSocket ()
|
||||
{
|
||||
@ -226,32 +227,43 @@ namespace System.Net.WebSockets
|
||||
ValidateArraySegment (buffer);
|
||||
return Task.Run (() => {
|
||||
EnsureWebSocketState (WebSocketState.Open, WebSocketState.CloseSent);
|
||||
// First read the two first bytes to know what we are doing next
|
||||
connection.Read (req, headerBuffer, 0, 2);
|
||||
var isLast = (headerBuffer[0] >> 7) > 0;
|
||||
var isMasked = (headerBuffer[1] >> 7) > 0;
|
||||
int mask = 0;
|
||||
var type = WireToMessageType ((byte)(headerBuffer[0] & 0xF));
|
||||
long length = headerBuffer[1] & 0x7F;
|
||||
int offset = 0;
|
||||
if (length == 126) {
|
||||
offset = 2;
|
||||
connection.Read (req, headerBuffer, 2, offset);
|
||||
length = (headerBuffer[2] << 8) | headerBuffer[3];
|
||||
} else if (length == 127) {
|
||||
offset = 8;
|
||||
connection.Read (req, headerBuffer, 2, offset);
|
||||
length = 0;
|
||||
for (int i = 2; i <= 9; i++)
|
||||
length = (length << 8) | headerBuffer[i];
|
||||
}
|
||||
|
||||
if (isMasked) {
|
||||
connection.Read (req, headerBuffer, 2 + offset, 4);
|
||||
for (int i = 0; i < 4; i++) {
|
||||
var pos = i + offset + 2;
|
||||
mask = (mask << 8) | headerBuffer[pos];
|
||||
bool isLast;
|
||||
WebSocketMessageType type;
|
||||
long length;
|
||||
|
||||
if (remaining == 0) {
|
||||
// First read the two first bytes to know what we are doing next
|
||||
connection.Read (req, headerBuffer, 0, 2);
|
||||
isLast = (headerBuffer[0] >> 7) > 0;
|
||||
var isMasked = (headerBuffer[1] >> 7) > 0;
|
||||
int mask = 0;
|
||||
type = WireToMessageType ((byte)(headerBuffer[0] & 0xF));
|
||||
length = headerBuffer[1] & 0x7F;
|
||||
int offset = 0;
|
||||
if (length == 126) {
|
||||
offset = 2;
|
||||
connection.Read (req, headerBuffer, 2, offset);
|
||||
length = (headerBuffer[2] << 8) | headerBuffer[3];
|
||||
} else if (length == 127) {
|
||||
offset = 8;
|
||||
connection.Read (req, headerBuffer, 2, offset);
|
||||
length = 0;
|
||||
for (int i = 2; i <= 9; i++)
|
||||
length = (length << 8) | headerBuffer[i];
|
||||
}
|
||||
|
||||
if (isMasked) {
|
||||
connection.Read (req, headerBuffer, 2 + offset, 4);
|
||||
for (int i = 0; i < 4; i++) {
|
||||
var pos = i + offset + 2;
|
||||
mask = (mask << 8) | headerBuffer[pos];
|
||||
}
|
||||
}
|
||||
} else {
|
||||
isLast = (headerBuffer[0] >> 7) > 0;
|
||||
type = WireToMessageType ((byte)(headerBuffer[0] & 0xF));
|
||||
length = remaining;
|
||||
}
|
||||
|
||||
if (type == WebSocketMessageType.Close) {
|
||||
@ -264,8 +276,9 @@ namespace System.Net.WebSockets
|
||||
} else {
|
||||
var readLength = (int)(buffer.Count < length ? buffer.Count : length);
|
||||
connection.Read (req, buffer.Array, buffer.Offset, readLength);
|
||||
remaining = length - readLength;
|
||||
|
||||
return new WebSocketReceiveResult ((int)length, type, isLast);
|
||||
return new WebSocketReceiveResult ((int)readLength, type, isLast && remaining == 0);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
Reference in New Issue
Block a user