Fix for extensions for client

This commit is contained in:
sta 2014-02-09 17:02:13 +09:00
parent 9c65578a0b
commit 685c4067a1

View File

@ -278,12 +278,12 @@ namespace WebSocketSharp
/// Gets the WebSocket extensions selected by the server. /// Gets the WebSocket extensions selected by the server.
/// </summary> /// </summary>
/// <value> /// <value>
/// A <see cref="string"/> that represents the extensions if any. /// A <see cref="string"/> that represents the extensions if any. The default value is
/// The default value is <see cref="String.Empty"/>. /// <see cref="String.Empty"/>.
/// </value> /// </value>
public string Extensions { public string Extensions {
get { get {
return _extensions; return _extensions ?? String.Empty;
} }
} }
@ -695,21 +695,18 @@ namespace WebSocketSharp
{ {
var headers = response.Headers; var headers = response.Headers;
return response.IsUnauthorized return response.IsUnauthorized
? String.Format ( ? String.Format ("HTTP {0} authorization is required.", response.AuthChallenge.Scheme)
"HTTP {0} authorization is required.",
response.AuthChallenge.Scheme)
: !response.IsWebSocketResponse : !response.IsWebSocketResponse
? "Not WebSocket connection response." ? "Not WebSocket connection response."
: !validateSecWebSocketAcceptHeader ( : !validateSecWebSocketAcceptHeader (headers ["Sec-WebSocket-Accept"])
headers ["Sec-WebSocket-Accept"])
? "Invalid Sec-WebSocket-Accept header." ? "Invalid Sec-WebSocket-Accept header."
: !validateSecWebSocketProtocolHeader ( : !validateSecWebSocketProtocolHeader (headers ["Sec-WebSocket-Protocol"])
headers ["Sec-WebSocket-Protocol"])
? "Invalid Sec-WebSocket-Protocol header." ? "Invalid Sec-WebSocket-Protocol header."
: !validateSecWebSocketVersionServerHeader ( : !validateSecWebSocketExtensionsHeader (headers ["Sec-WebSocket-Extensions"])
headers ["Sec-WebSocket-Version"]) ? "Invalid Sec-WebSocket-Extensions header."
? "Invalid Sec-WebSocket-Version header." : !validateSecWebSocketVersionServerHeader (headers ["Sec-WebSocket-Version"])
: null; ? "Invalid Sec-WebSocket-Version header."
: null;
} }
private void close (CloseStatusCode code, string reason, bool wait) private void close (CloseStatusCode code, string reason, bool wait)
@ -885,13 +882,13 @@ namespace WebSocketSharp
// As client // As client
private string createExtensionsRequest () private string createExtensionsRequest ()
{ {
var extensions = new StringBuilder (64); var extensions = new StringBuilder (32);
if (_compression != CompressionMethod.NONE) if (_compression != CompressionMethod.NONE)
extensions.Append (_compression.ToCompressionExtension ()); extensions.Append (_compression.ToCompressionExtension ());
return extensions.Length > 0 return extensions.Length > 0
? extensions.ToString () ? extensions.ToString ()
: String.Empty; : null;
} }
// As client // As client
@ -916,7 +913,7 @@ namespace WebSocketSharp
headers ["Sec-WebSocket-Protocol"] = _protocols.ToString (", "); headers ["Sec-WebSocket-Protocol"] = _protocols.ToString (", ");
var extensions = createExtensionsRequest (); var extensions = createExtensionsRequest ();
if (extensions.Length > 0) if (extensions != null)
headers ["Sec-WebSocket-Extensions"] = extensions; headers ["Sec-WebSocket-Extensions"] = extensions;
headers ["Sec-WebSocket-Version"] = _version; headers ["Sec-WebSocket-Version"] = _version;
@ -950,7 +947,7 @@ namespace WebSocketSharp
if (_protocol != null) if (_protocol != null)
headers ["Sec-WebSocket-Protocol"] = _protocol; headers ["Sec-WebSocket-Protocol"] = _protocol;
if (_extensions.Length > 0) if (_extensions != null)
headers ["Sec-WebSocket-Extensions"] = _extensions; headers ["Sec-WebSocket-Extensions"] = _extensions;
if (_cookies.Count > 0) if (_cookies.Count > 0)
@ -984,8 +981,6 @@ namespace WebSocketSharp
return false; return false;
} }
processRespondedExtensions (res.Headers ["Sec-WebSocket-Extensions"]);
var cookies = res.Cookies; var cookies = res.Cookies;
if (cookies.Count > 0) if (cookies.Count > 0)
_cookies.SetOrRemove (cookies); _cookies.SetOrRemove (cookies);
@ -1002,7 +997,6 @@ namespace WebSocketSharp
{ {
_compression = CompressionMethod.NONE; _compression = CompressionMethod.NONE;
_cookies = new CookieCollection (); _cookies = new CookieCollection ();
_extensions = String.Empty;
_forConn = new object (); _forConn = new object ();
_forSend = new object (); _forSend = new object ();
_readyState = WebSocketState.CONNECTING; _readyState = WebSocketState.CONNECTING;
@ -1043,25 +1037,6 @@ namespace WebSocketSharp
_extensions = buffer.ToArray ().ToString (", "); _extensions = buffer.ToArray ().ToString (", ");
} }
// As client
private void processRespondedExtensions (string extensions)
{
var comp = _compression != CompressionMethod.NONE ? true : false;
var hasComp = false;
if (extensions != null && extensions.Length > 0) {
foreach (var e in extensions.SplitHeaderValue (',')) {
var extension = e.Trim ();
if (comp && !hasComp && extension.Equals (_compression))
hasComp = true;
}
_extensions = extensions;
}
if (comp && !hasComp)
_compression = CompressionMethod.NONE;
}
// As client // As client
private HandshakeResponse receiveHandshakeResponse () private HandshakeResponse receiveHandshakeResponse ()
{ {
@ -1383,6 +1358,29 @@ namespace WebSocketSharp
return value != null && value == CreateResponseKey (_base64Key); return value != null && value == CreateResponseKey (_base64Key);
} }
// As client
private bool validateSecWebSocketExtensionsHeader (string value)
{
var compress = _compression != CompressionMethod.NONE ? true : false;
if (value == null || value.Length == 0) {
if (compress)
_compression = CompressionMethod.NONE;
return true;
}
if (!compress)
return false;
var extensions = value.SplitHeaderValue (',');
if (extensions.Contains (
extension => !extension.Trim ().Equals (_compression)))
return false;
_extensions = value;
return true;
}
// As server // As server
private bool validateSecWebSocketKeyHeader (string value) private bool validateSecWebSocketKeyHeader (string value)
{ {