public byte[] ToArray() { using (var buff = new MemoryStream()) { var header = (int)Fin; header = (header << 1) + (int)Rsv1; header = (header << 1) + (int)Rsv2; header = (header << 1) + (int)Rsv3; header = (header << 4) + (int)Opcode; header = (header << 1) + (int)Mask; header = (header << 7) + (int)PayloadLength; buff.Write(((ushort)header).InternalToByteArray(Endianness.Big), 0, 2); if (PayloadLength > 125) { buff.Write(ExtendedPayloadLength, 0, PayloadLength == 126 ? 2 : 8); } if (Mask == Mask.On) { buff.Write(MaskingKey, 0, 4); } if (PayloadLength > 0) { var bytes = PayloadData.ToArray(); if (PayloadLength < 127) { buff.Write(bytes, 0, bytes.Length); } else { using (var input = new MemoryStream(bytes)) input.CopyTo(buff, 1024); } } #if NET452 buff.Close(); #endif return(buff.ToArray()); } }
internal WebSocketFrame( Fin fin, Opcode opcode, PayloadData payloadData, bool compressed = false, bool mask = true) { Fin = fin; Rsv1 = IsOpcodeData(opcode) && compressed ? Rsv.On : Rsv.Off; Rsv2 = Rsv.Off; Rsv3 = Rsv.Off; Opcode = opcode; var len = payloadData.Length; if (len < 126) { PayloadLength = (byte)len; ExtendedPayloadLength = WebSocket.EmptyBytes; } else if (len < 0x010000) { PayloadLength = (byte)126; ExtendedPayloadLength = ((ushort)len).InternalToByteArray(Endianness.Big); } else { PayloadLength = (byte)127; ExtendedPayloadLength = len.InternalToByteArray(Endianness.Big); } if (mask) { Mask = Mask.On; MaskingKey = CreateMaskingKey(); payloadData.Mask(MaskingKey); } else { Mask = Mask.Off; MaskingKey = WebSocket.EmptyBytes; } PayloadData = payloadData; }
internal static WebSocketFrame CreateCloseFrame(PayloadData payloadData, bool mask) { return(new WebSocketFrame(Fin.Final, Opcode.Close, payloadData, false, mask)); }
internal WebSocketFrame(Opcode opcode, PayloadData payloadData, bool mask = true) : this(Fin.Final, opcode, payloadData, false, mask) { }
static PayloadData() { Empty = new PayloadData(); MaxLength = Int64.MaxValue; }
internal CloseEventArgs(CloseStatusCode code, string reason = null) { PayloadData = new PayloadData((ushort)code, reason); }
internal CloseEventArgs(PayloadData payloadData = null) { PayloadData = payloadData ?? new PayloadData(); }
internal CloseEventArgs(ushort code, string reason) { PayloadData = new PayloadData(code, reason); }
internal static WebSocketFrame CreateCloseFrame(PayloadData payloadData, bool mask) => new WebSocketFrame(Fin.Final, Opcode.Close, payloadData ?? new PayloadData(), false, mask);
internal WebSocketFrame(Opcode opcode, PayloadData payloadData) : this(Fin.Final, opcode, payloadData) { }
internal static WebSocketFrame CreateCloseFrame(PayloadData payloadData) => new WebSocketFrame(Fin.Final, Opcode.Close, payloadData ?? new PayloadData());
internal CloseEventArgs(PayloadData payloadData) { PayloadData = payloadData; }