|
|
@ -425,29 +425,23 @@ namespace WebSocketSharp.Net { |
|
|
|
|
|
|
|
void Add (string name, string value, bool ignoreRestricted) |
|
|
|
{ |
|
|
|
name = Trim (name); |
|
|
|
CheckName (name); |
|
|
|
|
|
|
|
Action <string, string> add; |
|
|
|
if (ignoreRestricted) |
|
|
|
add = AddWithoutCheckingNameAndRestricted; |
|
|
|
else |
|
|
|
add = AddWithoutCheckingName; |
|
|
|
|
|
|
|
DoWithCheckingState (add, name, value); |
|
|
|
DoWithCheckingState (add, CheckName (name), value, true); |
|
|
|
} |
|
|
|
|
|
|
|
void AddWithoutCheckingName (string name, string value) |
|
|
|
{ |
|
|
|
CheckRestricted (name); |
|
|
|
AddWithoutCheckingNameAndRestricted (name, value); |
|
|
|
DoWithoutCheckingName (base.Add, name, value); |
|
|
|
} |
|
|
|
|
|
|
|
void AddWithoutCheckingNameAndRestricted (string name, string value) |
|
|
|
{ |
|
|
|
value = Trim (value); |
|
|
|
CheckValue (value); |
|
|
|
base.Add (name, value); |
|
|
|
base.Add (name, CheckValue (value)); |
|
|
|
} |
|
|
|
|
|
|
|
static int CheckColonSeparated (string header) |
|
|
@ -459,13 +453,28 @@ namespace WebSocketSharp.Net { |
|
|
|
return i; |
|
|
|
} |
|
|
|
|
|
|
|
static void CheckName (string name) |
|
|
|
static HttpHeaderType CheckHeaderType (string name) |
|
|
|
{ |
|
|
|
HttpHeaderInfo info; |
|
|
|
return !TryGetHeaderInfo (name, out info) |
|
|
|
? HttpHeaderType.Undefined |
|
|
|
: info.IsRequest && !info.IsResponse |
|
|
|
? HttpHeaderType.Request |
|
|
|
: !info.IsRequest && info.IsResponse |
|
|
|
? HttpHeaderType.Response |
|
|
|
: HttpHeaderType.Undefined; |
|
|
|
} |
|
|
|
|
|
|
|
static string CheckName (string name) |
|
|
|
{ |
|
|
|
name = Trim (name); |
|
|
|
if (name.IsEmpty ()) |
|
|
|
throw new ArgumentNullException ("name"); |
|
|
|
|
|
|
|
if (!IsHeaderName (name)) |
|
|
|
throw new ArgumentException ("Contains invalid characters.", "name"); |
|
|
|
|
|
|
|
return name; |
|
|
|
} |
|
|
|
|
|
|
|
void CheckRestricted (string name) |
|
|
@ -486,22 +495,19 @@ namespace WebSocketSharp.Net { |
|
|
|
throw new InvalidOperationException ("This collection has already been used to store the response headers."); |
|
|
|
} |
|
|
|
|
|
|
|
void CheckState (HttpHeaderInfo info) |
|
|
|
static string CheckValue (string value) |
|
|
|
{ |
|
|
|
if (info.IsRequest && !info.IsResponse) |
|
|
|
CheckState (false); |
|
|
|
|
|
|
|
if (!info.IsRequest && info.IsResponse) |
|
|
|
CheckState (true); |
|
|
|
} |
|
|
|
value = Trim (value); |
|
|
|
if (value.IsEmpty ()) |
|
|
|
return value; |
|
|
|
|
|
|
|
static void CheckValue (string value) |
|
|
|
{ |
|
|
|
if (value.Length > 65535) |
|
|
|
throw new ArgumentOutOfRangeException ("value", "The length must not be greater than 65535."); |
|
|
|
|
|
|
|
if (!IsHeaderValue (value)) |
|
|
|
throw new ArgumentException ("Contains invalid characters.", "value"); |
|
|
|
|
|
|
|
return value; |
|
|
|
} |
|
|
|
|
|
|
|
static string Convert (HttpRequestHeader header) |
|
|
@ -530,18 +536,31 @@ namespace WebSocketSharp.Net { |
|
|
|
: false; |
|
|
|
} |
|
|
|
|
|
|
|
void DoWithCheckingState (Action <string, string> act, string name, string value) |
|
|
|
void DoWithCheckingState ( |
|
|
|
Action <string, string> act, string name, string value, bool setState) |
|
|
|
{ |
|
|
|
HttpHeaderInfo info; |
|
|
|
if (TryGetHeaderInfo (name, out info)) |
|
|
|
{ |
|
|
|
CheckState (info); |
|
|
|
var type = CheckHeaderType (name); |
|
|
|
if (type == HttpHeaderType.Request) |
|
|
|
DoWithCheckingState (act, name, value, false, setState); |
|
|
|
else if (type == HttpHeaderType.Response) |
|
|
|
DoWithCheckingState (act, name, value, true, setState); |
|
|
|
else |
|
|
|
act (name, value); |
|
|
|
SetState (info); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
void DoWithCheckingState ( |
|
|
|
Action <string, string> act, string name, string value, bool response, bool setState) |
|
|
|
{ |
|
|
|
CheckState (response); |
|
|
|
act (name, value); |
|
|
|
if (setState) |
|
|
|
SetState (response); |
|
|
|
} |
|
|
|
|
|
|
|
void DoWithoutCheckingName (Action <string, string> act, string name, string value) |
|
|
|
{ |
|
|
|
CheckRestricted (name); |
|
|
|
act (name, CheckValue (value)); |
|
|
|
} |
|
|
|
|
|
|
|
static HttpHeaderInfo GetHeaderInfo (string name) |
|
|
@ -551,7 +570,7 @@ namespace WebSocketSharp.Net { |
|
|
|
select info).FirstOrDefault (); |
|
|
|
} |
|
|
|
|
|
|
|
void RemoveWithoutCheckingName (string name) |
|
|
|
void RemoveWithoutCheckingName (string name, string unuse) |
|
|
|
{ |
|
|
|
CheckRestricted (name); |
|
|
|
base.Remove (name); |
|
|
@ -565,21 +584,9 @@ namespace WebSocketSharp.Net { |
|
|
|
: HttpHeaderType.Request; |
|
|
|
} |
|
|
|
|
|
|
|
void SetState (HttpHeaderInfo info) |
|
|
|
{ |
|
|
|
if (info.IsRequest && !info.IsResponse) |
|
|
|
SetState (false); |
|
|
|
|
|
|
|
if (!info.IsRequest && info.IsResponse) |
|
|
|
SetState (true); |
|
|
|
} |
|
|
|
|
|
|
|
void SetWithoutCheckingName (string name, string value) |
|
|
|
{ |
|
|
|
CheckRestricted (name); |
|
|
|
value = Trim (value); |
|
|
|
CheckValue (value); |
|
|
|
base.Set (name, value); |
|
|
|
DoWithoutCheckingName (base.Set, name, value); |
|
|
|
} |
|
|
|
|
|
|
|
static string Trim (string value) |
|
|
@ -637,9 +644,7 @@ namespace WebSocketSharp.Net { |
|
|
|
|
|
|
|
internal void SetInternal (string name, string value, bool response) |
|
|
|
{ |
|
|
|
value = Trim (value); |
|
|
|
CheckValue (value); |
|
|
|
|
|
|
|
value = CheckValue (value); |
|
|
|
if (IsMultiValue (name, response)) |
|
|
|
base.Add (name, value); |
|
|
|
else |
|
|
@ -790,9 +795,7 @@ namespace WebSocketSharp.Net { |
|
|
|
/// </exception>
|
|
|
|
public void Add (HttpRequestHeader header, string value) |
|
|
|
{ |
|
|
|
CheckState (false); |
|
|
|
AddWithoutCheckingName (Convert (header), value); |
|
|
|
SetState (false); |
|
|
|
DoWithCheckingState (AddWithoutCheckingName, Convert (header), value, false, true); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
@ -823,9 +826,7 @@ namespace WebSocketSharp.Net { |
|
|
|
/// </exception>
|
|
|
|
public void Add (HttpResponseHeader header, string value) |
|
|
|
{ |
|
|
|
CheckState (true); |
|
|
|
AddWithoutCheckingName (Convert (header), value); |
|
|
|
SetState (true); |
|
|
|
DoWithCheckingState (AddWithoutCheckingName, Convert (header), value, true, true); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
@ -1031,9 +1032,7 @@ namespace WebSocketSharp.Net { |
|
|
|
/// </exception>
|
|
|
|
public static bool IsRestricted (string headerName, bool response) |
|
|
|
{ |
|
|
|
var name = Trim (headerName); |
|
|
|
CheckName (name); |
|
|
|
return ContainsInRestricted (name, response); |
|
|
|
return ContainsInRestricted (CheckName (headerName), response); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
@ -1061,8 +1060,7 @@ namespace WebSocketSharp.Net { |
|
|
|
/// </exception>
|
|
|
|
public void Remove (HttpRequestHeader header) |
|
|
|
{ |
|
|
|
CheckState (false); |
|
|
|
RemoveWithoutCheckingName (Convert (header)); |
|
|
|
DoWithCheckingState (RemoveWithoutCheckingName, Convert (header), null, false, false); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
@ -1079,8 +1077,7 @@ namespace WebSocketSharp.Net { |
|
|
|
/// </exception>
|
|
|
|
public void Remove (HttpResponseHeader header) |
|
|
|
{ |
|
|
|
CheckState (true); |
|
|
|
RemoveWithoutCheckingName (Convert (header)); |
|
|
|
DoWithCheckingState (RemoveWithoutCheckingName, Convert (header), null, true, false); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
@ -1108,14 +1105,7 @@ namespace WebSocketSharp.Net { |
|
|
|
/// </exception>
|
|
|
|
public override void Remove (string name) |
|
|
|
{ |
|
|
|
name = Trim (name); |
|
|
|
CheckName (name); |
|
|
|
|
|
|
|
HttpHeaderInfo info; |
|
|
|
if (TryGetHeaderInfo (name, out info)) |
|
|
|
CheckState (info); |
|
|
|
|
|
|
|
RemoveWithoutCheckingName (name); |
|
|
|
DoWithCheckingState (RemoveWithoutCheckingName, CheckName (name), null, false); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
@ -1146,9 +1136,7 @@ namespace WebSocketSharp.Net { |
|
|
|
/// </exception>
|
|
|
|
public void Set (HttpRequestHeader header, string value) |
|
|
|
{ |
|
|
|
CheckState (false); |
|
|
|
SetWithoutCheckingName (Convert (header), value); |
|
|
|
SetState (false); |
|
|
|
DoWithCheckingState (SetWithoutCheckingName, Convert (header), value, false, true); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
@ -1179,9 +1167,7 @@ namespace WebSocketSharp.Net { |
|
|
|
/// </exception>
|
|
|
|
public void Set (HttpResponseHeader header, string value) |
|
|
|
{ |
|
|
|
CheckState (true); |
|
|
|
SetWithoutCheckingName (Convert (header), value); |
|
|
|
SetState (true); |
|
|
|
DoWithCheckingState (SetWithoutCheckingName, Convert (header), value, true, true); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
@ -1215,9 +1201,7 @@ namespace WebSocketSharp.Net { |
|
|
|
/// </exception>
|
|
|
|
public override void Set (string name, string value) |
|
|
|
{ |
|
|
|
name = Trim (name); |
|
|
|
CheckName (name); |
|
|
|
DoWithCheckingState (SetWithoutCheckingName, name, value); |
|
|
|
DoWithCheckingState (SetWithoutCheckingName, CheckName (name), value, true); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|