void StartClosingHandshake(CloseEventCode code, string reason) { Debug.Log("WebSocketChannel closing"); if (closing) { return; } List <byte> buf = new List <byte> (); if (!receivedClosingHandshake && code != CloseEventCode.CloseEventCodeNotSpecified) { byte hb = (byte)((int)code >> 8); byte lb = (byte)code; buf.Add(hb); buf.Add(lb); buf.AddRange(System.Text.UTF8Encoding.UTF8.GetBytes(reason)); } Send(buf.ToArray()); // OpCode.OpCodeClose, closing = true; }
void StartClosingHandshake(CloseEventCode code, string reason) { if (closing) { return; } List <byte> buf = new List <byte> (); //if (!receivedClosingHandshake && code != CloseEventCode.CloseEventCodeNotSpecified) { if (!receivedClosingHandshake) { byte hb = (byte)((int)code >> 8); byte lb = (byte)code; buf.Add(hb); buf.Add(lb); buf.AddRange(enc.GetBytes(reason)); outgoing.Add(new OutgoingMessage(OpCode.OpCodeClose, buf.ToArray())); } closing = true; }
bool ProcessFrame(List <byte> buffer) { FrameData frame; if (ParseFrame(buffer, out frame) != ParseFrameResult.FrameOK) { return(false); } switch (frame.opCode) { case OpCode.OpCodeContinuation: // An unexpected continuation frame is received without any leading frame. if (!hasContinuousFrame) { Debug.LogWarning("Received unexpected continuation frame."); return(false); } continuousFrameData.AddRange(new SubArray(buffer, frame.payload, frame.payloadLength)); RemoveProcessed(buffer, frame.end); if (frame.final) { continuousFrameData = new List <byte> (); hasContinuousFrame = false; if (continuousFrameOpCode == OpCode.OpCodeText) { var message = ""; if (continuousFrameData.Count > 0) { var array = continuousFrameData.ToArray(); message = enc.GetString(array, 0, array.Length); } OnTextMessage(message); } else if (continuousFrameOpCode == OpCode.OpCodeBinary) { OnBinaryMessage(continuousFrameData.ToArray()); } } break; case OpCode.OpCodeText: if (frame.final) { String message = ""; if (frame.payloadLength > 0) { var payload = new byte[frame.payloadLength]; buffer.CopyTo(frame.payload, payload, 0, frame.payloadLength); message = enc.GetString(payload, 0, payload.Length); } OnTextMessage(message); RemoveProcessed(buffer, frame.end); } else { hasContinuousFrame = true; continuousFrameOpCode = OpCode.OpCodeText; continuousFrameData.AddRange(new SubArray(buffer, frame.payload, frame.payloadLength)); RemoveProcessed(buffer, frame.end); } break; case OpCode.OpCodeBinary: if (frame.final) { byte[] payload = new byte[frame.payloadLength]; buffer.CopyTo(frame.payload, payload, 0, frame.payloadLength); OnBinaryMessage(payload); RemoveProcessed(buffer, frame.end); } else { hasContinuousFrame = true; continuousFrameOpCode = OpCode.OpCodeBinary; continuousFrameData.AddRange(new SubArray(buffer, frame.payload, frame.payloadLength)); RemoveProcessed(buffer, frame.end); } break; case OpCode.OpCodeClose: if (frame.payloadLength >= 2) { byte highByte = buffer [frame.payload + 0]; byte lowByte = buffer [frame.payload + 1]; closeEventCode = (CloseEventCode)(highByte << 8 | lowByte); } else { closeEventCode = CloseEventCode.CloseEventCodeNoStatusRcvd; } if (frame.payloadLength >= 3) { byte[] payload = new byte[frame.payloadLength - 2]; buffer.CopyTo(2, payload, 0, frame.payloadLength - 2); closeEventReason = enc.GetString(payload, 0, payload.Length); } else { closeEventReason = ""; } RemoveProcessed(buffer, frame.end); receivedClosingHandshake = true; StartClosingHandshake(closeEventCode, closeEventReason); break; case OpCode.OpCodePing: var reply = new byte[frame.payloadLength]; buffer.CopyTo(frame.payload, reply, 0, frame.payloadLength); RemoveProcessed(buffer, frame.end); // reply with Pong! lock (outgoing) { outgoing.Add(new OutgoingMessage(OpCode.OpCodePong, reply)); } break; case OpCode.OpCodePong: // do nothing with a pong, just remove processed bytes RemoveProcessed(buffer, frame.end); break; default: Debug.LogError("SHOULD NOT REACH HERE"); break; } ; return(buffer.Count != 0); }
public void Close(CloseEventCode code, string reason) { StartClosingHandshake(code, reason); }