Fix due to the renamed WebSocketServer<T> to WebSocketServiceHost<T>

This commit is contained in:
sta
2012-10-23 15:39:31 +09:00
parent c55b5d6479
commit 2ae1d35d03
38 changed files with 387 additions and 249 deletions
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.
+13 -8
View File
@@ -2,22 +2,27 @@ using System;
using WebSocketSharp;
using WebSocketSharp.Server;
namespace Example2
{
namespace Example2 {
public class Chat : WebSocketService
{
private static object _forId = new object();
private static uint _id = 0;
private static object _forNum = new object();
private static uint _num = 0;
private string _name;
private string getName()
{
lock (_forId)
return QueryString.Exists("name")
? QueryString["name"]
: "anon#" + getNum();
}
private uint getNum()
{
lock (_forNum)
{
return QueryString.Exists("name")
? QueryString["name"]
: "anon#" + (++_id);
return ++_num;
}
}
Binary file not shown.
+13 -13
View File
@@ -8,22 +8,22 @@ namespace Example2
public static void Main(string[] args)
{
/* Single service server
//var wssv = new WebSocketServer<Echo>("ws://localhost:4649");
var wssv = new WebSocketServer<Echo>("ws://localhost:4649/Echo");
//var wssv = new WebSocketServer<Echo>("ws://localhost:4649/エコー");
//var wssv = new WebSocketServer<Echo>(4649);
//var wssv = new WebSocketServer<Echo>(4649, "/Echo");
//var wssv = new WebSocketServer<Echo>(4649, "/エコー");
//var wssv = new WebSocketServer<Chat>("ws://localhost:4649");
//var wssv = new WebSocketServer<Chat>("ws://localhost:4649/Chat");
//var wssv = new WebSocketServer<Chat>("ws://localhost:4649/チャット");
//var wssv = new WebSocketServer<Chat>(4649);
//var wssv = new WebSocketServer<Chat>(4649, "/Chat");
//var wssv = new WebSocketServer<Chat>(4649, "/チャット");
//var wssv = new WebSocketServiceHost<Echo>("ws://localhost:4649");
var wssv = new WebSocketServiceHost<Echo>("ws://localhost:4649/Echo");
//var wssv = new WebSocketServiceHost<Echo>("ws://localhost:4649/エコー");
//var wssv = new WebSocketServiceHost<Echo>(4649);
//var wssv = new WebSocketServiceHost<Echo>(4649, "/Echo");
//var wssv = new WebSocketServiceHost<Echo>(4649, "/エコー");
//var wssv = new WebSocketServiceHost<Chat>("ws://localhost:4649");
//var wssv = new WebSocketServiceHost<Chat>("ws://localhost:4649/Chat");
//var wssv = new WebSocketServiceHost<Chat>("ws://localhost:4649/チャット");
//var wssv = new WebSocketServiceHost<Chat>(4649);
//var wssv = new WebSocketServiceHost<Chat>(4649, "/Chat");
//var wssv = new WebSocketServiceHost<Chat>(4649, "/チャット");
wssv.Start();
Console.WriteLine(
"WebSocket Server (url: {0})\n listening on address: {1} port: {2}\n",
"WebSocket Service Host (url: {0})\n listening on address: {1} port: {2}\n",
wssv.Uri, wssv.Address, wssv.Port);
*/
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+13 -8
View File
@@ -2,22 +2,27 @@ using System;
using WebSocketSharp;
using WebSocketSharp.Server;
namespace Example3
{
namespace Example3 {
public class Chat : WebSocketService
{
private static object _forId = new object();
private static uint _id = 0;
private static object _forNum = new object();
private static uint _num = 0;
private string _name;
private string getName()
{
lock (_forId)
return QueryString.Exists("name")
? QueryString["name"]
: "anon#" + getNum();
}
private uint getNum()
{
lock (_forNum)
{
return QueryString.Exists("name")
? QueryString["name"]
: "anon#" + (++_id);
return ++_num;
}
}
+2 -2
View File
@@ -2,8 +2,8 @@ using System;
using WebSocketSharp;
using WebSocketSharp.Server;
namespace Example3
{
namespace Example3 {
public class Echo : WebSocketService
{
protected override void OnMessage(object sender, MessageEventArgs e)
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+6 -6
View File
@@ -149,7 +149,7 @@ Required namespace.
using WebSocketSharp.Server;
```
The `WebSocketServer`, `WebSocketServer<T>` and `WebSocketService` classes exist in the `WebSocketSharp.Server` namespace.
The `WebSocketServer`, `WebSocketServiceHost<T>` and `WebSocketService` classes exist in the `WebSocketSharp.Server` namespace.
#### Step 2 ####
@@ -193,10 +193,10 @@ In addition, if you override the `OnOpen`, `OnError` and `OnClose` methods, each
#### Step 3 ####
Creating a instance of the `WebSocketServer<T>` class if you want the single WebSocket service server.
Creating a instance of the `WebSocketServiceHost<T>` class if you want the single WebSocket service server.
```cs
var wssv = new WebSocketServer<Echo>("ws://example.com:4649");
var wssv = new WebSocketServiceHost<Echo>("ws://example.com:4649");
```
Creating a instance of the `WebSocketServer` class if you want the multi WebSocket service server.
@@ -220,9 +220,9 @@ So it is necessary to run with root permission.
Setting the event.
##### WebSocketServer&lt;T>.OnError event #####
##### WebSocketServiceHost&lt;T>.OnError event #####
The `WebSocketServer<T>.OnError` event occurs when the `WebSocketServer<T>` gets an error.
The `WebSocketServiceHost<T>.OnError` event occurs when the `WebSocketServiceHost<T>` gets an error.
```cs
wssv.OnError += (sender, e) =>
@@ -235,7 +235,7 @@ The `e.Message` (`WebSocketSharp.ErrorEventArgs.Message`, its type is `string`)
##### WebSocketServer.OnError event #####
Same as the `WebSocketServer<T>.OnError` event.
Same as the `WebSocketServiceHost<T>.OnError` event.
#### Step 5 ####
+6 -1
View File
@@ -1,6 +1,11 @@
<Properties>
<MonoDevelop.Ide.Workspace ActiveConfiguration="Debug_Ubuntu" />
<MonoDevelop.Ide.Workbench />
<MonoDevelop.Ide.Workbench ActiveDocument="websocket-sharp/WebSocket.cs">
<Files>
<File FileName="websocket-sharp/WebSocket.cs" Line="810" Column="1" />
<File FileName="websocket-sharp/Ext.cs" Line="390" Column="19" />
</Files>
</MonoDevelop.Ide.Workbench>
<MonoDevelop.Ide.DebuggingService.Breakpoints>
<BreakpointStore />
</MonoDevelop.Ide.DebuggingService.Breakpoints>
+4 -14
View File
@@ -393,21 +393,11 @@ namespace WebSocketSharp {
return uriString.Substring(0, p).IsPredefinedScheme();
}
public static bool NotEqualsDo(
this string expected,
string actual,
Func<string, string, string> func,
out string ret,
bool ignoreCase)
public static bool NotEqual(this string expected, string actual, bool ignoreCase)
{
if (String.Compare(expected, actual, ignoreCase) != 0)
{
ret = func(expected, actual);
return true;
}
ret = String.Empty;
return false;
return String.Compare(expected, actual, ignoreCase) != 0
? true
: false;
}
public static byte[] ReadBytes(this Stream stream, int length)
+15 -18
View File
@@ -27,7 +27,6 @@
#endregion
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Diagnostics;
using System.IO;
@@ -40,12 +39,12 @@ namespace WebSocketSharp.Server {
#region Fields
private Thread _acceptRequestThread;
private bool _isWindows;
private HttpListener _listener;
private int _port;
private string _rootPath;
private Dictionary<string, IServiceHost> _services;
private Thread _acceptRequestThread;
private bool _isWindows;
private HttpListener _listener;
private int _port;
private string _rootPath;
private ServiceManager _services;
#endregion
@@ -120,7 +119,7 @@ namespace WebSocketSharp.Server {
{
_isWindows = false;
_listener = new HttpListener();
_services = new Dictionary<string, IServiceHost>();
_services = new ServiceManager();
var os = Environment.OSVersion;
if (os.Platform != PlatformID.Unix && os.Platform != PlatformID.MacOSX)
@@ -258,17 +257,17 @@ namespace WebSocketSharp.Server {
{
var res = context.Response;
var wsContext = context.AcceptWebSocket();
var socket = wsContext.WebSocket;
var path = wsContext.Path.UrlDecode();
if (!_services.ContainsKey(path))
IServiceHost svcHost;
if (!_services.TryGetServiceHost(path, out svcHost))
{
res.StatusCode = (int)HttpStatusCode.NotImplemented;
return false;
}
var socket = wsContext.WebSocket;
var service = _services[path];
service.BindWebSocket(socket);
svcHost.BindWebSocket(socket);
return true;
}
@@ -286,8 +285,8 @@ namespace WebSocketSharp.Server {
return;
}
var service = new WebSocketServer<T>();
_services.Add(absPath, service);
var svcHost = new WebSocketServiceHost<T>();
_services.Add(absPath, svcHost);
}
public byte[] GetFile(string path)
@@ -312,9 +311,7 @@ namespace WebSocketSharp.Server {
{
_listener.Close();
_acceptRequestThread.Join(5 * 1000);
foreach (var service in _services.Values)
service.Stop();
_services.Clear();
_services.Stop();
}
#endregion
+1
View File
@@ -33,6 +33,7 @@ namespace WebSocketSharp.Server {
public interface IServiceHost {
void BindWebSocket(WebSocket socket);
void Broadcast(string data);
void Start();
void Stop();
}
+88
View File
@@ -0,0 +1,88 @@
#region MIT License
/**
* ServiceManager.cs
*
* The MIT License
*
* Copyright (c) 2012 sta.blockhead
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#endregion
using System;
using System.Collections.Generic;
namespace WebSocketSharp.Server {
public class ServiceManager {
#region Field
private Dictionary<string, IServiceHost> _services;
#endregion
#region Constructor
public ServiceManager()
{
_services = new Dictionary<string, IServiceHost>();
}
#endregion
#region Property
public int Count {
get {
return _services.Count;
}
}
#endregion
#region Public Methods
public void Add(string absPath, IServiceHost svcHost)
{
_services.Add(absPath.UrlDecode(), svcHost);
}
public void Broadcast(string data)
{
foreach (var svcHost in _services.Values)
svcHost.Broadcast(data);
}
public void Stop()
{
foreach (var svcHost in _services.Values)
svcHost.Stop();
_services.Clear();
}
public bool TryGetServiceHost(string absPath, out IServiceHost svcHost)
{
return _services.TryGetValue(absPath, out svcHost);
}
#endregion
}
}
+2 -2
View File
@@ -123,11 +123,11 @@ namespace WebSocketSharp.Server {
}
}
public Dictionary<string, bool> Broadping(string data)
public Dictionary<string, bool> Broadping(string message)
{
var result = new Dictionary<string, bool>();
foreach (var session in copySessions())
result.Add(session.Key, session.Value.Ping(data));
result.Add(session.Key, session.Value.Ping(message));
return result;
}
+15 -115
View File
@@ -2,7 +2,7 @@
/**
* WebSocketServer.cs
*
* A C# implementation of a WebSocket protocol server.
* A C# implementation of the WebSocket protocol server.
*
* The MIT License
*
@@ -29,10 +29,8 @@
#endregion
using System;
using System.Collections.Generic;
using System.Net.Sockets;
using WebSocketSharp.Net;
using WebSocketSharp.Net.Sockets;
namespace WebSocketSharp.Server {
@@ -40,7 +38,7 @@ namespace WebSocketSharp.Server {
{
#region Field
private Dictionary<string, IServiceHost> _services;
private ServiceManager _services;
#endregion
@@ -80,7 +78,7 @@ namespace WebSocketSharp.Server {
private void init()
{
_services = new Dictionary<string, IServiceHost>();
_services = new ServiceManager();
}
#endregion
@@ -92,7 +90,9 @@ namespace WebSocketSharp.Server {
var context = client.AcceptWebSocket();
var socket = context.WebSocket;
var path = context.Path.UrlDecode();
if (!_services.ContainsKey(path))
IServiceHost svcHost;
if (!_services.TryGetServiceHost(path, out svcHost))
{
socket.Close(HttpStatusCode.NotImplemented);
return;
@@ -101,8 +101,7 @@ namespace WebSocketSharp.Server {
if (BaseUri.IsAbsoluteUri)
socket.Url = new Uri(BaseUri, path);
var service = _services[path];
service.BindWebSocket(socket);
svcHost.BindWebSocket(socket);
}
#endregion
@@ -119,118 +118,19 @@ namespace WebSocketSharp.Server {
return;
}
var service = new WebSocketServer<T>();
_services.Add(absPath, service);
var svcHost = new WebSocketServiceHost<T>();
_services.Add(absPath, svcHost);
}
public void Broadcast(string data)
{
_services.Broadcast(data);
}
public override void Stop()
{
base.Stop();
foreach (var service in _services.Values)
service.Stop();
_services.Clear();
}
#endregion
}
public class WebSocketServer<T> : WebSocketServerBase, IServiceHost
where T : WebSocketService, new()
{
#region Fields
private SessionManager _sessions;
#endregion
#region Internal Constructor
internal WebSocketServer()
{
init();
}
#endregion
#region Public Constructors
public WebSocketServer(int port)
: this(port, "/")
{
}
public WebSocketServer(string url)
: base(url)
{
init();
}
public WebSocketServer(int port, string absPath)
: this(System.Net.IPAddress.Any, port, absPath)
{
}
public WebSocketServer(System.Net.IPAddress address, int port, string absPath)
: base(address, port, absPath)
{
init();
}
#endregion
#region Property
public Uri Uri {
get {
return BaseUri;
}
}
#endregion
#region Private Method
private void init()
{
_sessions = new SessionManager();
}
#endregion
#region Protected Method
protected override void AcceptWebSocket(TcpClient client)
{
var context = client.AcceptWebSocket();
var socket = context.WebSocket;
var path = context.Path.UrlDecode();
if (path != Uri.GetAbsolutePath().UrlDecode())
{
socket.Close(HttpStatusCode.NotImplemented);
return;
}
if (Uri.IsAbsoluteUri)
socket.Url = new Uri(Uri, path);
BindWebSocket(socket);
}
#endregion
#region Public Methods
public void BindWebSocket(WebSocket socket)
{
T service = new T();
service.Bind(socket, _sessions);
service.Start();
}
public override void Stop()
{
base.Stop();
_sessions.Stop();
_services.Stop();
}
#endregion
+10 -10
View File
@@ -32,8 +32,8 @@ using System.Collections.Specialized;
using System.Threading;
using WebSocketSharp.Frame;
namespace WebSocketSharp.Server
{
namespace WebSocketSharp.Server {
public abstract class WebSocketService
{
#region Private Fields
@@ -58,13 +58,13 @@ namespace WebSocketSharp.Server
protected NameValueCollection QueryString {
get {
return _socket.QueryString;
return IsBound ? _socket.QueryString : null;
}
}
protected SessionManager Sessions {
get {
return _sessions;
return IsBound ? _sessions : null;
}
}
@@ -137,10 +137,10 @@ namespace WebSocketSharp.Server
return Ping(String.Empty);
}
public bool Ping(string data)
public bool Ping(string message)
{
return IsBound
? _socket.Ping(data)
? _socket.Ping(message)
: false;
}
@@ -149,10 +149,10 @@ namespace WebSocketSharp.Server
return PingAround(String.Empty);
}
public Dictionary<string, bool> PingAround(string data)
public Dictionary<string, bool> PingAround(string message)
{
return IsBound
? _sessions.Broadping(data)
? _sessions.Broadping(message)
: null;
}
@@ -161,14 +161,14 @@ namespace WebSocketSharp.Server
return PingTo(id, String.Empty);
}
public bool PingTo(string id, string data)
public bool PingTo(string id, string message)
{
if (!IsBound)
return false;
WebSocketService service;
return _sessions.TryGetByID(id, out service)
? service.Ping(data)
? service.Ping(message)
: false;
}
@@ -0,0 +1,149 @@
#region MIT License
/**
* WebSocketServiceHost.cs
*
* A C# implementation of the WebSocket protocol server.
*
* The MIT License
*
* Copyright (c) 2012 sta.blockhead
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#endregion
using System;
using System.Collections.Generic;
using System.Net.Sockets;
using WebSocketSharp.Net;
namespace WebSocketSharp.Server {
public class WebSocketServiceHost<T> : WebSocketServerBase, IServiceHost
where T : WebSocketService, new()
{
#region Field
private SessionManager _sessions;
#endregion
#region Internal Constructor
internal WebSocketServiceHost()
{
init();
}
#endregion
#region Public Constructors
public WebSocketServiceHost(int port)
: this(port, "/")
{
}
public WebSocketServiceHost(string url)
: base(url)
{
init();
}
public WebSocketServiceHost(int port, string absPath)
: this(System.Net.IPAddress.Any, port, absPath)
{
}
public WebSocketServiceHost(System.Net.IPAddress address, int port, string absPath)
: base(address, port, absPath)
{
init();
}
#endregion
#region Property
public Uri Uri {
get {
return BaseUri;
}
}
#endregion
#region Private Method
private void init()
{
_sessions = new SessionManager();
}
#endregion
#region Protected Method
protected override void AcceptWebSocket(TcpClient client)
{
var context = client.AcceptWebSocket();
var socket = context.WebSocket;
var path = context.Path.UrlDecode();
if (path != Uri.GetAbsolutePath().UrlDecode())
{
socket.Close(HttpStatusCode.NotImplemented);
return;
}
if (Uri.IsAbsoluteUri)
socket.Url = new Uri(Uri, path);
BindWebSocket(socket);
}
#endregion
#region Public Methods
public void BindWebSocket(WebSocket socket)
{
T service = new T();
service.Bind(socket, _sessions);
service.Start();
}
public void Broadcast(string data)
{
_sessions.Broadcast(data);
}
public Dictionary<string, bool> Broadping(string message)
{
return _sessions.Broadping(message);
}
public override void Stop()
{
base.Stop();
_sessions.Stop();
}
#endregion
}
}
+48 -52
View File
@@ -65,7 +65,7 @@ namespace WebSocketSharp {
#region Private Fields
private string _base64key;
private HttpListenerContext _baseContext;
private HttpListenerContext _httpContext;
private WebSocketContext _context;
private System.Net.IPEndPoint _endPoint;
private string _extensions;
@@ -107,7 +107,7 @@ namespace WebSocketSharp {
{
_uri = context.Path.ToUri();
_context = context;
_baseContext = context.BaseContext;
_httpContext = context.BaseContext;
_wsStream = context.Stream;
_endPoint = context.ServerEndPoint;
_isClient = false;
@@ -158,6 +158,7 @@ namespace WebSocketSharp {
_uri = uri;
_protocols = protocols.ToString(", ");
_base64key = createBase64Key();
_isClient = true;
_isSecure = uri.Scheme == "wss" ? true : false;
}
@@ -464,11 +465,11 @@ namespace WebSocketSharp {
try
{
if (!_baseContext.IsNull())
if (!_httpContext.IsNull())
{
_baseContext.Response.Close();
_httpContext.Response.Close();
_wsStream = null;
_baseContext = null;
_httpContext = null;
}
if (!_wsStream.IsNull())
@@ -503,6 +504,16 @@ namespace WebSocketSharp {
onClose(args);
}
// As Client
private string createBase64Key()
{
var src = new byte[16];
var rand = new Random();
rand.NextBytes(src);
return Convert.ToBase64String(src);
}
// As Client
private void createClientStream()
{
@@ -514,17 +525,6 @@ namespace WebSocketSharp {
_wsStream = WsStream.CreateClientStream(host, port, out _tcpClient);
}
private string createExpectedKey()
{
SHA1 sha1 = new SHA1CryptoServiceProvider();
var sb = new StringBuilder(_base64key);
sb.Append(_guid);
var keySrc = sha1.ComputeHash(Encoding.UTF8.GetBytes(sb.ToString()));
return Convert.ToBase64String(keySrc);
}
private WsFrame createFrame(Fin fin, Opcode opcode, PayloadData payloadData)
{
return _isClient
@@ -541,11 +541,6 @@ namespace WebSocketSharp {
if (port != 80)
host += ":" + port;
var keySrc = new byte[16];
var rand = new Random();
rand.NextBytes(keySrc);
_base64key = Convert.ToBase64String(keySrc);
var req = new RequestHandshake(path);
req.AddHeader("Host", host);
req.AddHeader("Sec-WebSocket-Key", _base64key);
@@ -560,7 +555,7 @@ namespace WebSocketSharp {
private ResponseHandshake createResponseHandshake()
{
var res = new ResponseHandshake();
res.AddHeader("Sec-WebSocket-Accept", createExpectedKey());
res.AddHeader("Sec-WebSocket-Accept", createResponseKey());
return res;
}
@@ -574,6 +569,16 @@ namespace WebSocketSharp {
return res;
}
private string createResponseKey()
{
SHA1 sha1 = new SHA1CryptoServiceProvider();
var sb = new StringBuilder(_base64key);
sb.Append(_guid);
var src = sha1.ComputeHash(Encoding.UTF8.GetBytes(sb.ToString()));
return Convert.ToBase64String(src);
}
// As Client
private void doHandshake()
{
@@ -611,23 +616,14 @@ namespace WebSocketSharp {
// As Server
private bool isValidRequest(RequestHandshake request, out string message)
{
Func<string, Func<string, string, string>> func = s =>
{
return (e, a) =>
{
return String.Format("Invalid request {0} value: {1}(expected: {2})", s, a, e);
};
};
if (!request.IsWebSocketRequest)
{
message = "Invalid WebSocket request.";
return false;
}
if (_uri.IsAbsoluteUri)
if (!isValidRequestHost(request.GetHeaderValues("Host")[0], func("Host"), out message))
return false;
if (_uri.IsAbsoluteUri && !isValidRequestHost(request.Headers["Host"], out message))
return false;
if (!request.HeaderExists("Sec-WebSocket-Version", _version))
{
@@ -635,7 +631,7 @@ namespace WebSocketSharp {
return false;
}
_base64key = request.GetHeaderValues("Sec-WebSocket-Key")[0];
_base64key = request.Headers["Sec-WebSocket-Key"];
if (request.HeaderExists("Sec-WebSocket-Protocol"))
_protocols = request.Headers["Sec-WebSocket-Protocol"];
@@ -650,18 +646,17 @@ namespace WebSocketSharp {
}
// As Server
private bool isValidRequestHost(string value, Func<string, string, string> func, out string message)
private bool isValidRequestHost(string value, out string message)
{
var host = _uri.DnsSafeHost;
var type = Uri.CheckHostName(host);
var host = _uri.DnsSafeHost;
var type = Uri.CheckHostName(host);
var address = _endPoint.Address;
var port = _endPoint.Port;
var expectedHost1 = host;
var expectedHost2 = address.ToString();
if (type != UriHostNameType.Dns)
expectedHost2 = System.Net.Dns.GetHostEntry(address).HostName;
var expectedHost2 = type == UriHostNameType.Dns
? address.ToString()
: System.Net.Dns.GetHostEntry(address).HostName;
if (port != 80)
{
@@ -669,9 +664,12 @@ namespace WebSocketSharp {
expectedHost2 += ":" + port;
}
if (expectedHost1.NotEqualsDo(value, func, out message, false))
if (expectedHost2.NotEqualsDo(value, func, out message, false))
return false;
if (expectedHost1.NotEqual(value, false) &&
expectedHost2.NotEqual(value, false))
{
message = "Invalid Host.";
return false;
}
message = String.Empty;
return true;
@@ -686,19 +684,17 @@ namespace WebSocketSharp {
return false;
}
if (!response.HeaderExists("Sec-WebSocket-Accept", createExpectedKey()))
if (!response.HeaderExists("Sec-WebSocket-Accept", createResponseKey()))
{
message = "Invalid Sec-WebSocket-Accept value.";
message = "Invalid Sec-WebSocket-Accept.";
return false;
}
if (response.HeaderExists("Sec-WebSocket-Version"))
if ( response.HeaderExists("Sec-WebSocket-Version") &&
!response.HeaderExists("Sec-WebSocket-Version", _version))
{
if (!response.HeaderExists("Sec-WebSocket-Version", _version))
{
message = "Unsupported Sec-WebSocket-Version.";
return false;
}
message = "Unsupported Sec-WebSocket-Version.";
return false;
}
if (response.HeaderExists("Sec-WebSocket-Protocol"))
Binary file not shown.
+2
View File
@@ -112,6 +112,8 @@
<Compile Include="Net\Security\SslStream.cs" />
<Compile Include="Server\IServiceHost.cs" />
<Compile Include="Server\SessionManager.cs" />
<Compile Include="Server\WebSocketServiceHost.cs" />
<Compile Include="Server\ServiceManager.cs" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup>
Binary file not shown.