public async Task<WebSocketMessage> ReadNextMessageAsync()
{
while (true)
{
OpCode opCode;
byte[] payload;
while (TryDecodeNextMessage(out opCode, out payload))
{
if (closed)
{
throw new WebSocketException(string.Format("Session already closed (dropping received message:[{0}] payloadLength:[{1}])", opCode, payload.Length));
}
switch (opCode)
{
case OpCode.Text:
return new WebSocketMessage.Text(Encoding.UTF8.GetString(payload));
case OpCode.Binary:
return new WebSocketMessage.Binary(payload);
case OpCode.Close:
ushort statusCode;
string reason;
FrameDecoder.TryDecodeCloseReason(payload, out statusCode, out reason);
return new WebSocketMessage.Close(statusCode, reason);
case OpCode.Ping:
return new WebSocketMessage.Ping();
case OpCode.Pong:
return new WebSocketMessage.Pong();
}
}
int bytesRead;
try
{
bytesRead = await ReadToBufferAsync().ConfigureAwait(false);
}
catch (Exception e)
{
throw new WebSocketException("Exception reading from websocket stream (server closed?)", e);
}
if (bytesRead > 0)
{
onBytesReceived(bytesRead);
continue;
}
else
{
throw new WebSocketException("Disconnected (client)");
}
}
}