Modified ResponseHandshake.cs and WebSocket.cs
This commit is contained in:
parent
2e8a24a667
commit
5706139b4b
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
// As server
|
|
||||||
acceptHandshake();
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
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.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user