Fix for extensions for client
This commit is contained in:
parent
9c65578a0b
commit
685c4067a1
@ -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)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user