diff --git a/websocket-sharp/HttpResponse.cs b/websocket-sharp/HttpResponse.cs index e6bf4a7f..7332b801 100644 --- a/websocket-sharp/HttpResponse.cs +++ b/websocket-sharp/HttpResponse.cs @@ -140,6 +140,14 @@ namespace WebSocketSharp return res; } + internal static HttpResponse CreateUnauthorizedResponse (string challenge) + { + var res = new HttpResponse (HttpStatusCode.Unauthorized); + res.Headers["WWW-Authenticate"] = challenge; + + return res; + } + internal static HttpResponse CreateWebSocketResponse () { var res = new HttpResponse (HttpStatusCode.SwitchingProtocols); diff --git a/websocket-sharp/Net/WebSockets/TcpListenerWebSocketContext.cs b/websocket-sharp/Net/WebSockets/TcpListenerWebSocketContext.cs index e6e9c7cd..a15ce957 100644 --- a/websocket-sharp/Net/WebSockets/TcpListenerWebSocketContext.cs +++ b/websocket-sharp/Net/WebSockets/TcpListenerWebSocketContext.cs @@ -40,18 +40,16 @@ namespace WebSocketSharp.Net.WebSockets /// Provides the properties used to access the information in a WebSocket connection request /// received by the . /// - /// - /// - public class TcpListenerWebSocketContext : WebSocketContext + internal class TcpListenerWebSocketContext : WebSocketContext { #region Private Fields - private TcpClient _client; private CookieCollection _cookies; private NameValueCollection _queryString; private HttpRequest _request; private bool _secure; private WebSocketStream _stream; + private TcpClient _tcpClient; private Uri _uri; private IPrincipal _user; private WebSocket _websocket; @@ -61,14 +59,14 @@ namespace WebSocketSharp.Net.WebSockets #region Internal Constructors internal TcpListenerWebSocketContext ( - TcpClient client, string protocol, bool secure, X509Certificate cert, Logger logger) + TcpClient tcpClient, string protocol, bool secure, X509Certificate certificate, Logger logger) { - _client = client; + _tcpClient = tcpClient; _secure = secure; - _stream = WebSocketStream.CreateServerStream (client, secure, cert); + _stream = WebSocketStream.CreateServerStream (tcpClient, secure, certificate); _request = _stream.ReadHttpRequest (90000); _uri = HttpUtility.CreateRequestUrl ( - _request.RequestUri, _request.Headers ["Host"], _request.IsWebSocketRequest, secure); + _request.RequestUri, _request.Headers["Host"], _request.IsWebSocketRequest, secure); _websocket = new WebSocket (this, protocol, logger); } @@ -119,7 +117,7 @@ namespace WebSocketSharp.Net.WebSockets /// public override string Host { get { - return _request.Headers ["Host"]; + return _request.Headers["Host"]; } } @@ -179,7 +177,7 @@ namespace WebSocketSharp.Net.WebSockets /// public override string Origin { get { - return _request.Headers ["Origin"]; + return _request.Headers["Origin"]; } } @@ -193,7 +191,7 @@ namespace WebSocketSharp.Net.WebSockets get { return _queryString ?? (_queryString = HttpUtility.ParseQueryStringInternally ( - _uri != null ? _uri.Query : null, Encoding.UTF8)); + _uri != null ? _uri.Query : null, Encoding.UTF8)); } } @@ -221,7 +219,7 @@ namespace WebSocketSharp.Net.WebSockets /// public override string SecWebSocketKey { get { - return _request.Headers ["Sec-WebSocket-Key"]; + return _request.Headers["Sec-WebSocket-Key"]; } } @@ -238,7 +236,7 @@ namespace WebSocketSharp.Net.WebSockets /// public override IEnumerable SecWebSocketProtocols { get { - var protocols = _request.Headers ["Sec-WebSocket-Protocol"]; + var protocols = _request.Headers["Sec-WebSocket-Protocol"]; if (protocols != null) foreach (var protocol in protocols.Split (',')) yield return protocol.Trim (); @@ -256,7 +254,7 @@ namespace WebSocketSharp.Net.WebSockets /// public override string SecWebSocketVersion { get { - return _request.Headers ["Sec-WebSocket-Version"]; + return _request.Headers["Sec-WebSocket-Version"]; } } @@ -268,7 +266,7 @@ namespace WebSocketSharp.Net.WebSockets /// public override System.Net.IPEndPoint ServerEndPoint { get { - return (System.Net.IPEndPoint) _client.Client.LocalEndPoint; + return (System.Net.IPEndPoint) _tcpClient.Client.LocalEndPoint; } } @@ -292,7 +290,7 @@ namespace WebSocketSharp.Net.WebSockets /// public override System.Net.IPEndPoint UserEndPoint { get { - return (System.Net.IPEndPoint) _client.Client.RemoteEndPoint; + return (System.Net.IPEndPoint) _tcpClient.Client.RemoteEndPoint; } } @@ -316,7 +314,7 @@ namespace WebSocketSharp.Net.WebSockets internal void Close () { _stream.Close (); - _client.Close (); + _tcpClient.Close (); } internal void Close (HttpStatusCode code) @@ -324,11 +322,9 @@ namespace WebSocketSharp.Net.WebSockets _websocket.Close (HttpResponse.CreateCloseResponse (code)); } - internal void SendAuthChallenge (string challenge) + internal void SendAuthenticationChallenge (string challenge) { - var res = new HttpResponse (HttpStatusCode.Unauthorized); - res.Headers ["WWW-Authenticate"] = challenge; - _stream.WriteBytes (res.ToByteArray ()); + _stream.WriteHttp (HttpResponse.CreateUnauthorizedResponse (challenge)); _request = _stream.ReadHttpRequest (15000); } diff --git a/websocket-sharp/Server/WebSocketServer.cs b/websocket-sharp/Server/WebSocketServer.cs index 007af3ed..d8c84555 100644 --- a/websocket-sharp/Server/WebSocketServer.cs +++ b/websocket-sharp/Server/WebSocketServer.cs @@ -546,7 +546,7 @@ namespace WebSocketSharp.Server var header = context.Headers ["Authorization"]; if (header == null || !header.StartsWith (expected, StringComparison.OrdinalIgnoreCase)) { - context.SendAuthChallenge (challenge); + context.SendAuthenticationChallenge (challenge); return auth (); } @@ -554,7 +554,7 @@ namespace WebSocketSharp.Server if (context.IsAuthenticated) return true; - context.SendAuthChallenge (challenge); + context.SendAuthenticationChallenge (challenge); return auth (); };