Refactored WebSocketFrame.cs
This commit is contained in:
		@@ -1141,7 +1141,7 @@ namespace WebSocketSharp
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return _stream.WriteBytes (
 | 
			
		||||
          WebSocketFrame.CreateFrame (fin, opcode, mask, data, compressed).ToByteArray ());
 | 
			
		||||
          WebSocketFrame.CreateWebSocketFrame (fin, opcode, mask, data, compressed).ToByteArray ());
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1424,7 +1424,7 @@ namespace WebSocketSharp
 | 
			
		||||
          try {
 | 
			
		||||
            byte[] cached;
 | 
			
		||||
            if (!cache.TryGetValue (_compression, out cached)) {
 | 
			
		||||
              cached = WebSocketFrame.CreateFrame (
 | 
			
		||||
              cached = WebSocketFrame.CreateWebSocketFrame (
 | 
			
		||||
                Fin.Final,
 | 
			
		||||
                opcode,
 | 
			
		||||
                Mask.Unmask,
 | 
			
		||||
 
 | 
			
		||||
@@ -51,7 +51,7 @@ namespace WebSocketSharp
 | 
			
		||||
 | 
			
		||||
    #endregion
 | 
			
		||||
 | 
			
		||||
    #region Internal Static Fields
 | 
			
		||||
    #region Internal Fields
 | 
			
		||||
 | 
			
		||||
    internal static readonly byte[] EmptyUnmaskPingData;
 | 
			
		||||
 | 
			
		||||
@@ -74,24 +74,25 @@ namespace WebSocketSharp
 | 
			
		||||
 | 
			
		||||
    #endregion
 | 
			
		||||
 | 
			
		||||
    #region Public Constructors
 | 
			
		||||
    #region Internal Constructors
 | 
			
		||||
 | 
			
		||||
    public WebSocketFrame (Opcode opcode, PayloadData payload)
 | 
			
		||||
    internal WebSocketFrame (Opcode opcode, PayloadData payload)
 | 
			
		||||
      : this (Fin.Final, opcode, Mask.Mask, payload, false)
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public WebSocketFrame (Opcode opcode, Mask mask, PayloadData payload)
 | 
			
		||||
    internal WebSocketFrame (Opcode opcode, Mask mask, PayloadData payload)
 | 
			
		||||
      : this (Fin.Final, opcode, mask, payload, false)
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public WebSocketFrame (Fin fin, Opcode opcode, Mask mask, PayloadData payload)
 | 
			
		||||
    internal WebSocketFrame (Fin fin, Opcode opcode, Mask mask, PayloadData payload)
 | 
			
		||||
      : this (fin, opcode, mask, payload, false)
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public WebSocketFrame (Fin fin, Opcode opcode, Mask mask, PayloadData payload, bool compressed)
 | 
			
		||||
    internal WebSocketFrame (
 | 
			
		||||
      Fin fin, Opcode opcode, Mask mask, PayloadData payload, bool compressed)
 | 
			
		||||
    {
 | 
			
		||||
      _fin = fin;
 | 
			
		||||
      _rsv1 = isData (opcode) && compressed ? Rsv.On : Rsv.Off;
 | 
			
		||||
@@ -359,7 +360,68 @@ namespace WebSocketSharp
 | 
			
		||||
      return opcode == Opcode.Text || opcode == Opcode.Binary;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static WebSocketFrame parse (byte [] header, Stream stream, bool unmask)
 | 
			
		||||
    private static string print (WebSocketFrame frame)
 | 
			
		||||
    {
 | 
			
		||||
      /* Opcode */
 | 
			
		||||
 | 
			
		||||
      var opcode = frame._opcode.ToString ();
 | 
			
		||||
 | 
			
		||||
      /* Payload Length */
 | 
			
		||||
 | 
			
		||||
      var payloadLen = frame._payloadLength;
 | 
			
		||||
 | 
			
		||||
      /* Extended Payload Length */
 | 
			
		||||
 | 
			
		||||
      var ext = frame._extPayloadLength;
 | 
			
		||||
      var size = ext.Length;
 | 
			
		||||
      var extPayloadLen = size == 2
 | 
			
		||||
                          ? ext.ToUInt16 (ByteOrder.Big).ToString ()
 | 
			
		||||
                          : size == 8
 | 
			
		||||
                            ? ext.ToUInt64 (ByteOrder.Big).ToString ()
 | 
			
		||||
                            : String.Empty;
 | 
			
		||||
 | 
			
		||||
      /* Masking Key */
 | 
			
		||||
 | 
			
		||||
      var masked = frame.IsMasked;
 | 
			
		||||
      var maskingKey = masked ? BitConverter.ToString (frame._maskingKey) : String.Empty;
 | 
			
		||||
 | 
			
		||||
      /* Payload Data */
 | 
			
		||||
 | 
			
		||||
      var payload = payloadLen == 0
 | 
			
		||||
                    ? String.Empty
 | 
			
		||||
                    : size > 0
 | 
			
		||||
                      ? String.Format ("A {0} frame.", opcode.ToLower ())
 | 
			
		||||
                      : !masked && !frame.IsFragmented && frame.IsText
 | 
			
		||||
                        ? Encoding.UTF8.GetString (frame._payloadData.ApplicationData)
 | 
			
		||||
                        : frame._payloadData.ToString ();
 | 
			
		||||
 | 
			
		||||
      var fmt =
 | 
			
		||||
@"                    FIN: {0}
 | 
			
		||||
                   RSV1: {1}
 | 
			
		||||
                   RSV2: {2}
 | 
			
		||||
                   RSV3: {3}
 | 
			
		||||
                 Opcode: {4}
 | 
			
		||||
                   MASK: {5}
 | 
			
		||||
         Payload Length: {6}
 | 
			
		||||
Extended Payload Length: {7}
 | 
			
		||||
            Masking Key: {8}
 | 
			
		||||
           Payload Data: {9}";
 | 
			
		||||
 | 
			
		||||
      return String.Format (
 | 
			
		||||
        fmt,
 | 
			
		||||
        frame._fin,
 | 
			
		||||
        frame._rsv1,
 | 
			
		||||
        frame._rsv2,
 | 
			
		||||
        frame._rsv3,
 | 
			
		||||
        opcode,
 | 
			
		||||
        frame._mask,
 | 
			
		||||
        payloadLen,
 | 
			
		||||
        extPayloadLen,
 | 
			
		||||
        maskingKey,
 | 
			
		||||
        payload);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static WebSocketFrame read (byte[] header, Stream stream, bool unmask)
 | 
			
		||||
    {
 | 
			
		||||
      /* Header */
 | 
			
		||||
 | 
			
		||||
@@ -467,156 +529,69 @@ namespace WebSocketSharp
 | 
			
		||||
      return frame;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static string print (WebSocketFrame frame)
 | 
			
		||||
    {
 | 
			
		||||
      /* Opcode */
 | 
			
		||||
 | 
			
		||||
      var opcode = frame._opcode.ToString ();
 | 
			
		||||
 | 
			
		||||
      /* Payload Length */
 | 
			
		||||
 | 
			
		||||
      var payloadLen = frame._payloadLength;
 | 
			
		||||
 | 
			
		||||
      /* Extended Payload Length */
 | 
			
		||||
 | 
			
		||||
      var ext = frame._extPayloadLength;
 | 
			
		||||
      var size = ext.Length;
 | 
			
		||||
      var extPayloadLen = size == 2
 | 
			
		||||
                          ? ext.ToUInt16 (ByteOrder.Big).ToString ()
 | 
			
		||||
                          : size == 8
 | 
			
		||||
                            ? ext.ToUInt64 (ByteOrder.Big).ToString ()
 | 
			
		||||
                            : String.Empty;
 | 
			
		||||
 | 
			
		||||
      /* Masking Key */
 | 
			
		||||
 | 
			
		||||
      var masked = frame.IsMasked;
 | 
			
		||||
      var maskingKey = masked ? BitConverter.ToString (frame._maskingKey) : String.Empty;
 | 
			
		||||
 | 
			
		||||
      /* Payload Data */
 | 
			
		||||
 | 
			
		||||
      var payload = payloadLen == 0
 | 
			
		||||
                    ? String.Empty
 | 
			
		||||
                    : size > 0
 | 
			
		||||
                      ? String.Format ("A {0} frame.", opcode.ToLower ())
 | 
			
		||||
                      : !masked && !frame.IsFragmented && frame.IsText
 | 
			
		||||
                        ? Encoding.UTF8.GetString (frame._payloadData.ApplicationData)
 | 
			
		||||
                        : frame._payloadData.ToString ();
 | 
			
		||||
 | 
			
		||||
      var format =
 | 
			
		||||
@"                    FIN: {0}
 | 
			
		||||
                   RSV1: {1}
 | 
			
		||||
                   RSV2: {2}
 | 
			
		||||
                   RSV3: {3}
 | 
			
		||||
                 Opcode: {4}
 | 
			
		||||
                   MASK: {5}
 | 
			
		||||
         Payload Length: {6}
 | 
			
		||||
Extended Payload Length: {7}
 | 
			
		||||
            Masking Key: {8}
 | 
			
		||||
           Payload Data: {9}";
 | 
			
		||||
 | 
			
		||||
      return String.Format (
 | 
			
		||||
        format,
 | 
			
		||||
        frame._fin,
 | 
			
		||||
        frame._rsv1,
 | 
			
		||||
        frame._rsv2,
 | 
			
		||||
        frame._rsv3,
 | 
			
		||||
        opcode,
 | 
			
		||||
        frame._mask,
 | 
			
		||||
        payloadLen,
 | 
			
		||||
        extPayloadLen,
 | 
			
		||||
        maskingKey,
 | 
			
		||||
        payload);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #endregion
 | 
			
		||||
 | 
			
		||||
    #region Internal Methods
 | 
			
		||||
 | 
			
		||||
    internal static WebSocketFrame CreateCloseFrame (Mask mask, byte[] data)
 | 
			
		||||
    {
 | 
			
		||||
      return new WebSocketFrame (Opcode.Close, mask, new PayloadData (data));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    internal static WebSocketFrame CreateCloseFrame (Mask mask, PayloadData payload)
 | 
			
		||||
    {
 | 
			
		||||
      return new WebSocketFrame (Opcode.Close, mask, payload);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    internal static WebSocketFrame CreateCloseFrame (Mask mask, CloseStatusCode code, string reason)
 | 
			
		||||
    {
 | 
			
		||||
      return new WebSocketFrame (
 | 
			
		||||
        Opcode.Close, mask, new PayloadData (((ushort) code).Append (reason)));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    internal static WebSocketFrame CreatePingFrame (Mask mask)
 | 
			
		||||
    {
 | 
			
		||||
      return new WebSocketFrame (Opcode.Ping, mask, new PayloadData ());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    internal static WebSocketFrame CreatePingFrame (Mask mask, byte[] data)
 | 
			
		||||
    {
 | 
			
		||||
      return new WebSocketFrame (Opcode.Ping, mask, new PayloadData (data));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    internal static WebSocketFrame CreatePongFrame (Mask mask, PayloadData payload)
 | 
			
		||||
    {
 | 
			
		||||
      return new WebSocketFrame (Opcode.Pong, mask, payload);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #endregion
 | 
			
		||||
 | 
			
		||||
    #region Public Methods
 | 
			
		||||
 | 
			
		||||
    public static WebSocketFrame CreateCloseFrame (Mask mask, byte [] data)
 | 
			
		||||
    {
 | 
			
		||||
      return new WebSocketFrame (Opcode.Close, mask, new PayloadData (data));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static WebSocketFrame CreateCloseFrame (Mask mask, CloseStatusCode code, string reason)
 | 
			
		||||
    {
 | 
			
		||||
      return new WebSocketFrame (
 | 
			
		||||
        Opcode.Close, mask, new PayloadData (((ushort) code).Append (reason)));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static WebSocketFrame CreateFrame (
 | 
			
		||||
    internal static WebSocketFrame CreateWebSocketFrame (
 | 
			
		||||
      Fin fin, Opcode opcode, Mask mask, byte[] data, bool compressed)
 | 
			
		||||
    {
 | 
			
		||||
      return new WebSocketFrame (fin, opcode, mask, new PayloadData (data), compressed);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static WebSocketFrame CreatePingFrame (Mask mask)
 | 
			
		||||
    internal static WebSocketFrame Read (Stream stream)
 | 
			
		||||
    {
 | 
			
		||||
      return new WebSocketFrame (Opcode.Ping, mask, new PayloadData ());
 | 
			
		||||
      return Read (stream, true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static WebSocketFrame CreatePingFrame (Mask mask, byte [] data)
 | 
			
		||||
    {
 | 
			
		||||
      return new WebSocketFrame (Opcode.Ping, mask, new PayloadData (data));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public IEnumerator<byte> GetEnumerator ()
 | 
			
		||||
    {
 | 
			
		||||
      foreach (var b in ToByteArray ())
 | 
			
		||||
        yield return b;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static WebSocketFrame Parse (byte [] src)
 | 
			
		||||
    {
 | 
			
		||||
      return Parse (src, true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static WebSocketFrame Parse (Stream stream)
 | 
			
		||||
    {
 | 
			
		||||
      return Parse (stream, true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static WebSocketFrame Parse (byte [] src, bool unmask)
 | 
			
		||||
    {
 | 
			
		||||
      using (var stream = new MemoryStream (src))
 | 
			
		||||
        return Parse (stream, unmask);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static WebSocketFrame Parse (Stream stream, bool unmask)
 | 
			
		||||
    internal static WebSocketFrame Read (Stream stream, bool unmask)
 | 
			
		||||
    {
 | 
			
		||||
      var header = stream.ReadBytes (2);
 | 
			
		||||
      if (header.Length != 2)
 | 
			
		||||
        throw new WebSocketException (
 | 
			
		||||
          "The header part of a frame cannot be read from the data source.");
 | 
			
		||||
 | 
			
		||||
      return parse (header, stream, unmask);
 | 
			
		||||
      return read (header, stream, unmask);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void ParseAsync (Stream stream, Action<WebSocketFrame> completed)
 | 
			
		||||
    {
 | 
			
		||||
      ParseAsync (stream, true, completed, null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void ParseAsync (
 | 
			
		||||
    internal static void ReadAsync (
 | 
			
		||||
      Stream stream, Action<WebSocketFrame> completed, Action<Exception> error)
 | 
			
		||||
    {
 | 
			
		||||
      ParseAsync (stream, true, completed, error);
 | 
			
		||||
      ReadAsync (stream, true, completed, error);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void ParseAsync (
 | 
			
		||||
    internal static void ReadAsync (
 | 
			
		||||
      Stream stream, bool unmask, Action<WebSocketFrame> completed, Action<Exception> error)
 | 
			
		||||
    {
 | 
			
		||||
      stream.ReadBytesAsync (
 | 
			
		||||
@@ -626,13 +601,23 @@ Extended Payload Length: {7}
 | 
			
		||||
            throw new WebSocketException (
 | 
			
		||||
              "The header part of a frame cannot be read from the data source.");
 | 
			
		||||
 | 
			
		||||
          var frame = parse (header, stream, unmask);
 | 
			
		||||
          var frame = read (header, stream, unmask);
 | 
			
		||||
          if (completed != null)
 | 
			
		||||
            completed (frame);
 | 
			
		||||
        },
 | 
			
		||||
        error);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #endregion
 | 
			
		||||
 | 
			
		||||
    #region Public Methods
 | 
			
		||||
 | 
			
		||||
    public IEnumerator<byte> GetEnumerator ()
 | 
			
		||||
    {
 | 
			
		||||
      foreach (var b in ToByteArray ())
 | 
			
		||||
        yield return b;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void Print (bool dumped)
 | 
			
		||||
    {
 | 
			
		||||
      Console.WriteLine (dumped ? dump (this) : print (this));
 | 
			
		||||
 
 | 
			
		||||
@@ -157,13 +157,13 @@ namespace WebSocketSharp
 | 
			
		||||
 | 
			
		||||
    internal WebSocketFrame ReadWebSocketFrame ()
 | 
			
		||||
    {
 | 
			
		||||
      return WebSocketFrame.Parse (_innerStream, true);
 | 
			
		||||
      return WebSocketFrame.Read (_innerStream, true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    internal void ReadWebSocketFrameAsync (
 | 
			
		||||
      Action<WebSocketFrame> completed, Action<Exception> error)
 | 
			
		||||
    {
 | 
			
		||||
      WebSocketFrame.ParseAsync (_innerStream, true, completed, error);
 | 
			
		||||
      WebSocketFrame.ReadAsync (_innerStream, true, completed, error);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    internal HttpResponse SendHttpRequest (HttpRequest request, int millisecondsTimeout)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user