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