Modified ResponseHandshake.cs and WebSocket.cs

This commit is contained in:
sta 2013-02-26 17:31:15 +09:00
parent 2e8a24a667
commit 5706139b4b
21 changed files with 64 additions and 87 deletions

Binary file not shown.

View File

@ -4,7 +4,7 @@
* *
* The MIT License * The MIT License
* *
* Copyright (c) 2012 sta.blockhead * Copyright (c) 2012-2013 sta.blockhead
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -55,24 +55,16 @@ namespace WebSocketSharp {
#region Properties #region Properties
public bool IsWebSocketResponse { public bool IsWebSocketResponse {
get { get {
if (ProtocolVersion != HttpVersion.Version11) return ProtocolVersion != HttpVersion.Version11
return false; ? false
: StatusCode != "101"
if (StatusCode != "101") ? false
return false; : !HeaderExists("Upgrade", "websocket")
? false
if (!HeaderExists("Upgrade", "websocket")) : !HeaderExists("Connection", "Upgrade")
return false; ? false
: HeaderExists("Sec-WebSocket-Accept");
if (!HeaderExists("Connection", "Upgrade"))
return false;
if (!HeaderExists("Sec-WebSocket-Accept"))
return false;
return true;
} }
} }
@ -117,14 +109,11 @@ namespace WebSocketSharp {
public override string ToString() public override string ToString()
{ {
var buffer = new StringBuilder(); var buffer = new StringBuilder();
buffer.AppendFormat("HTTP/{0} {1} {2}{3}", ProtocolVersion, StatusCode, Reason, _crlf); buffer.AppendFormat("HTTP/{0} {1} {2}{3}", ProtocolVersion, StatusCode, Reason, _crlf);
foreach (string key in Headers.AllKeys) foreach (string key in Headers.AllKeys)
buffer.AppendFormat("{0}: {1}{2}", key, Headers[key], _crlf); buffer.AppendFormat("{0}: {1}{2}", key, Headers[key], _crlf);
buffer.Append(_crlf); buffer.Append(_crlf);
return buffer.ToString(); return buffer.ToString();
} }

View File

@ -308,13 +308,13 @@ namespace WebSocketSharp {
#region Private Methods #region Private Methods
// As Server // As Server
private void acceptHandshake() private bool acceptHandshake()
{ {
if (!receiveOpeningHandshake()) if (!receiveOpeningHandshake())
return; return false;
sendResponseHandshake(); sendResponseHandshake();
onOpen(); return true;
} }
private bool canSendAsCloseFrame(PayloadData data) private bool canSendAsCloseFrame(PayloadData data)
@ -406,7 +406,9 @@ namespace WebSocketSharp {
{ {
var args = new CloseEventArgs(data); var args = new CloseEventArgs(data);
var frame = createFrame(Fin.FINAL, Opcode.CLOSE, data); var frame = createFrame(Fin.FINAL, Opcode.CLOSE, data);
send(frame); if (send(frame))
args.WasClean = true;
onClose(args); onClose(args);
} }
@ -473,7 +475,9 @@ namespace WebSocketSharp {
var host = _uri.DnsSafeHost; var host = _uri.DnsSafeHost;
var port = _uri.Port > 0 var port = _uri.Port > 0
? _uri.Port ? _uri.Port
: _isSecure ? 443 : 80; : _isSecure
? 443
: 80;
_tcpClient = new TcpClient(host, port); _tcpClient = new TcpClient(host, port);
_wsStream = WsStream.CreateClientStream(_tcpClient, host, _isSecure); _wsStream = WsStream.CreateClientStream(_tcpClient, host, _isSecure);
@ -534,19 +538,10 @@ namespace WebSocketSharp {
} }
// As Client // As Client
private void doHandshake() private bool doHandshake()
{ {
var res = sendOpeningHandshake(); createClientStream();
return sendOpeningHandshake();
string msg;
if (!isValidResponse(res, out msg))
{
onError(msg);
close(CloseStatusCode.ABNORMAL, msg);
return;
}
onOpen();
} }
// As Server // As Server
@ -621,35 +616,13 @@ namespace WebSocketSharp {
} }
// As Client // As Client
private bool isValidResponse(ResponseHandshake response, out string message) private bool isValidResponse(ResponseHandshake response)
{ {
if (!response.IsWebSocketResponse) return !response.IsWebSocketResponse
{ ? false
message = "Invalid WebSocket response."; : !response.HeaderExists("Sec-WebSocket-Accept", createResponseKey())
return false; ? false
} : !response.HeaderExists("Sec-WebSocket-Version") || response.HeaderExists("Sec-WebSocket-Version", _version);
if (!response.HeaderExists("Sec-WebSocket-Accept", createResponseKey()))
{
message = "Invalid Sec-WebSocket-Accept.";
return false;
}
if ( response.HeaderExists("Sec-WebSocket-Version") &&
!response.HeaderExists("Sec-WebSocket-Version", _version))
{
message = "Unsupported Sec-WebSocket-Version.";
return false;
}
if (response.HeaderExists("Sec-WebSocket-Protocol"))
_protocol = response.Headers["Sec-WebSocket-Protocol"];
if (response.HeaderExists("Sec-WebSocket-Extensions"))
_extensions = response.Headers["Sec-WebSocket-Extensions"];
message = String.Empty;
return true;
} }
private void onClose(CloseEventArgs eventArgs) private void onClose(CloseEventArgs eventArgs)
@ -658,8 +631,8 @@ namespace WebSocketSharp {
if (!_exitMessageLoop.IsNull()) if (!_exitMessageLoop.IsNull())
_exitMessageLoop.WaitOne(5 * 1000); _exitMessageLoop.WaitOne(5 * 1000);
if (closeResources()) if (!closeResources())
eventArgs.WasClean = true; eventArgs.WasClean = false;
OnClose.Emit(this, eventArgs); OnClose.Emit(this, eventArgs);
} }
@ -1011,19 +984,34 @@ namespace WebSocketSharp {
} }
// As Client // As Client
private ResponseHandshake sendOpeningHandshake() private bool sendOpeningHandshake()
{ {
var req = createOpeningHandshake(); var req = createOpeningHandshake();
sendOpeningHandshake(req); sendRequestHandshake(req);
return receiveResponseHandshake(); var res = receiveResponseHandshake();
if (!isValidResponse(res))
{
var msg = "Invalid response to the WebSocket connection request.";
onError(msg);
close(CloseStatusCode.ABNORMAL, msg);
return false;
}
if (res.HeaderExists("Sec-WebSocket-Protocol"))
_protocol = res.Headers["Sec-WebSocket-Protocol"];
if (res.HeaderExists("Sec-WebSocket-Extensions"))
_extensions = res.Headers["Sec-WebSocket-Extensions"];
return true;
} }
// As Client // As Client
private void sendOpeningHandshake(RequestHandshake request) private void sendRequestHandshake(RequestHandshake request)
{ {
#if DEBUG #if DEBUG
Console.WriteLine("WS: Info@sendOpeningHandshake: Opening handshake from client:\n"); Console.WriteLine("WS: Info@sendRequestHandshake: Request handshake from client:\n");
Console.WriteLine(request.ToString()); Console.WriteLine(request.ToString());
#endif #endif
writeHandshake(request); writeHandshake(request);
@ -1173,7 +1161,7 @@ namespace WebSocketSharp {
} }
/// <summary> /// <summary>
/// Establishes a connection. /// Establishes a WebSocket connection.
/// </summary> /// </summary>
public void Connect() public void Connect()
{ {
@ -1183,23 +1171,23 @@ namespace WebSocketSharp {
return; return;
} }
Func<bool> connect = () =>
{
return _isClient
? doHandshake()
: acceptHandshake();
};
try try
{ {
// As client if (connect())
if (_isClient) onOpen();
{
createClientStream();
doHandshake();
return;
} }
catch (Exception)
// As server
acceptHandshake();
}
catch (Exception ex)
{ {
onError(ex.Message); var msg = "An exception has occured.";
close(CloseStatusCode.ABNORMAL, "An exception has occured."); onError(msg);
close(CloseStatusCode.ABNORMAL, msg);
} }
} }

Binary file not shown.