diff --git a/websocket-sharp/Ext.cs b/websocket-sharp/Ext.cs
index 56628a39..3be026e6 100644
--- a/websocket-sharp/Ext.cs
+++ b/websocket-sharp/Ext.cs
@@ -1341,37 +1341,74 @@ namespace WebSocketSharp
///
/// Retrieves a sub-array from the specified .
- /// A sub-array starts at the specified element position.
+ /// A sub-array starts at the specified element position in .
///
///
- /// An array of T that receives a sub-array, or an empty array of T if any problems
- /// with the parameters.
+ /// An array of T that receives a sub-array, or an empty array of T
+ /// if any problems with the parameters.
///
///
- /// An array of T that contains the data to retrieve a sub-array.
+ /// An array of T from which to retrieve a sub-array.
///
///
- /// An that contains the zero-based starting position of a sub-array
- /// in .
+ /// An that represents the zero-based starting position of
+ /// a sub-array in .
///
///
- /// An that contains the number of elements to retrieve a sub-array.
+ /// An that represents the number of elements to retrieve.
///
///
- /// The type of elements in the .
+ /// The type of elements in .
///
public static T[] SubArray (this T[] array, int startIndex, int length)
{
- if (array == null || array.Length == 0)
+ int len;
+ if (array == null || (len = array.Length) == 0)
return new T[0];
- if (startIndex < 0 || length <= 0)
+ if (startIndex < 0 || length <= 0 || startIndex + length > len)
return new T[0];
- if (startIndex + length > array.Length)
+ if (startIndex == 0 && length == len)
+ return array;
+
+ var subArray = new T[length];
+ Array.Copy (array, startIndex, subArray, 0, length);
+
+ return subArray;
+ }
+
+ ///
+ /// Retrieves a sub-array from the specified .
+ /// A sub-array starts at the specified element position in .
+ ///
+ ///
+ /// An array of T that receives a sub-array, or an empty array of T
+ /// if any problems with the parameters.
+ ///
+ ///
+ /// An array of T from which to retrieve a sub-array.
+ ///
+ ///
+ /// A that represents the zero-based starting position of
+ /// a sub-array in .
+ ///
+ ///
+ /// A that represents the number of elements to retrieve.
+ ///
+ ///
+ /// The type of elements in .
+ ///
+ public static T[] SubArray (this T[] array, long startIndex, long length)
+ {
+ long len;
+ if (array == null || (len = array.LongLength) == 0)
return new T[0];
- if (startIndex == 0 && array.Length == length)
+ if (startIndex < 0 || length <= 0 || startIndex + length > len)
+ return new T[0];
+
+ if (startIndex == 0 && length == len)
return array;
var subArray = new T[length];
diff --git a/websocket-sharp/PayloadData.cs b/websocket-sharp/PayloadData.cs
index d1a473dc..9334b52f 100644
--- a/websocket-sharp/PayloadData.cs
+++ b/websocket-sharp/PayloadData.cs
@@ -37,11 +37,11 @@ namespace WebSocketSharp
{
#region Private Fields
- private byte[] _appData;
- private ulong _appDataLength;
- private byte[] _extData;
- private ulong _extDataLength;
- private bool _masked;
+ private byte[] _data;
+ private static readonly byte[] _empty;
+ private long _extDataLength;
+ private long _length;
+ private bool _masked;
#endregion
@@ -51,49 +51,52 @@ namespace WebSocketSharp
#endregion
+ #region Static Constructor
+
+ static PayloadData ()
+ {
+ _empty = new byte[0];
+ }
+
+ #endregion
+
#region Internal Constructors
internal PayloadData ()
- : this (new byte[0], new byte[0], false)
+ {
+ _data = _empty;
+ }
+
+ internal PayloadData (byte[] data)
+ : this (data, false)
{
}
- internal PayloadData (byte[] applicationData)
- : this (new byte[0], applicationData, false)
+ internal PayloadData (byte[] data, bool masked)
{
- }
-
- internal PayloadData (string applicationData)
- : this (new byte[0], Encoding.UTF8.GetBytes (applicationData), false)
- {
- }
-
- internal PayloadData (byte[] applicationData, bool masked)
- : this (new byte[0], applicationData, masked)
- {
- }
-
- internal PayloadData (byte[] extensionData, byte[] applicationData, bool masked)
- {
- _extDataLength = (ulong) extensionData.LongLength;
- _appDataLength = (ulong) applicationData.LongLength;
- if (_appDataLength > MaxLength - _extDataLength)
- throw new ArgumentOutOfRangeException (
- "The total length of 'extensionData' and 'applicationData' is greater than the allowable length.");
-
- _extData = extensionData;
- _appData = applicationData;
+ _data = data;
_masked = masked;
+ _length = data.LongLength;
}
#endregion
#region Internal Properties
+ internal long ExtensionDataLength {
+ get {
+ return _extDataLength;
+ }
+
+ set {
+ _extDataLength = value;
+ }
+ }
+
internal bool IncludesReservedCloseStatusCode {
get {
- return _appDataLength > 1 &&
- _appData.SubArray (0, 2).ToUInt16 (ByteOrder.Big).IsReserved ();
+ return _length > 1 &&
+ _data.SubArray (0, 2).ToUInt16 (ByteOrder.Big).IsReserved ();
}
}
@@ -103,13 +106,17 @@ namespace WebSocketSharp
public byte[] ApplicationData {
get {
- return _appData;
+ return _extDataLength > 0
+ ? _data.SubArray (_extDataLength, _length - _extDataLength)
+ : _data;
}
}
public byte[] ExtensionData {
get {
- return _extData;
+ return _extDataLength > 0
+ ? _data.SubArray (0, _extDataLength)
+ : _empty;
}
}
@@ -121,31 +128,18 @@ namespace WebSocketSharp
public ulong Length {
get {
- return _extDataLength + _appDataLength;
+ return (ulong) _length;
}
}
#endregion
- #region Private Methods
-
- private static void mask (byte[] source, byte[] key)
- {
- for (long i = 0; i < source.LongLength; i++)
- source[i] = (byte) (source[i] ^ key[i % 4]);
- }
-
- #endregion
-
#region Internal Methods
internal void Mask (byte[] key)
{
- if (_extDataLength > 0)
- mask (_extData, key);
-
- if (_appDataLength > 0)
- mask (_appData, key);
+ for (long i = 0; i < _length; i++)
+ _data[i] = (byte) (_data[i] ^ key[i % 4]);
_masked = !_masked;
}
@@ -156,23 +150,18 @@ namespace WebSocketSharp
public IEnumerator GetEnumerator ()
{
- foreach (var b in _extData)
- yield return b;
-
- foreach (var b in _appData)
+ foreach (var b in _data)
yield return b;
}
public byte[] ToByteArray ()
{
- return _extDataLength > 0
- ? new List (this).ToArray ()
- : _appData;
+ return _data;
}
public override string ToString ()
{
- return BitConverter.ToString (ToByteArray ());
+ return BitConverter.ToString (_data);
}
#endregion