From a0764d89ff7c56124be376368aa75ba02938c4dd Mon Sep 17 00:00:00 2001 From: sta Date: Thu, 24 Jul 2014 15:02:42 +0900 Subject: [PATCH] Refactored WebSocketStream.cs --- .../WebSockets/TcpListenerWebSocketContext.cs | 2 +- websocket-sharp/WebSocket.cs | 2 +- websocket-sharp/WebSocketStream.cs | 120 ++++++++---------- 3 files changed, 55 insertions(+), 69 deletions(-) diff --git a/websocket-sharp/Net/WebSockets/TcpListenerWebSocketContext.cs b/websocket-sharp/Net/WebSockets/TcpListenerWebSocketContext.cs index a15ce957..dbd30b13 100644 --- a/websocket-sharp/Net/WebSockets/TcpListenerWebSocketContext.cs +++ b/websocket-sharp/Net/WebSockets/TcpListenerWebSocketContext.cs @@ -324,7 +324,7 @@ namespace WebSocketSharp.Net.WebSockets internal void SendAuthenticationChallenge (string challenge) { - _stream.WriteHttp (HttpResponse.CreateUnauthorizedResponse (challenge)); + _stream.WriteBytes (HttpResponse.CreateUnauthorizedResponse (challenge).ToByteArray ()); _request = _stream.ReadHttpRequest (15000); } diff --git a/websocket-sharp/WebSocket.cs b/websocket-sharp/WebSocket.cs index 35acca7d..293b44df 100644 --- a/websocket-sharp/WebSocket.cs +++ b/websocket-sharp/WebSocket.cs @@ -1207,7 +1207,7 @@ namespace WebSocketSharp _logger.Debug ( "A response to the WebSocket connection request:\n" + response.ToString ()); - return _stream.WriteHttp (response); + return _stream.WriteBytes (response.ToByteArray ()); } // As client diff --git a/websocket-sharp/WebSocketStream.cs b/websocket-sharp/WebSocketStream.cs index dbed6bc0..77f51982 100644 --- a/websocket-sharp/WebSocketStream.cs +++ b/websocket-sharp/WebSocketStream.cs @@ -48,7 +48,6 @@ namespace WebSocketSharp #region Private Fields - private object _forWrite; private Stream _innerStream; private bool _secure; @@ -60,7 +59,6 @@ namespace WebSocketSharp { _innerStream = innerStream; _secure = secure; - _forWrite = new object (); } #endregion @@ -85,6 +83,47 @@ namespace WebSocketSharp #region Private Methods + private static T read (Stream stream, Func parser, int millisecondsTimeout) + where T : HttpBase + { + var timeout = false; + var timer = new Timer ( + state => { + timeout = true; + stream.Close (); + }, + null, + millisecondsTimeout, + -1); + + T http = null; + Exception exception = null; + try { + http = parser (readHeaders (stream, _headersMaxLength)); + var contentLen = http.Headers["Content-Length"]; + if (contentLen != null && contentLen.Length > 0) + http.EntityBodyData = readEntityBody (stream, contentLen); + } + catch (Exception ex) { + exception = ex; + } + finally { + timer.Change (-1, -1); + timer.Dispose (); + } + + var msg = timeout + ? "A timeout has occurred while reading an HTTP request/response." + : exception != null + ? "An exception has occurred while reading an HTTP request/response." + : null; + + if (msg != null) + throw new WebSocketException (msg, exception); + + return http; + } + private static byte[] readEntityBody (Stream stream, string length) { long len; @@ -122,8 +161,7 @@ namespace WebSocketSharp } if (!read) - throw new WebSocketException ( - "The header part of a HTTP data is greater than the max length."); + throw new WebSocketException ("The length of header part is greater than the max length."); var crlf = "\r\n"; return Encoding.UTF8.GetString (buff.ToArray ()) @@ -132,65 +170,13 @@ namespace WebSocketSharp .Split (new[] { crlf }, StringSplitOptions.RemoveEmptyEntries); } - private static T readHttp (Stream stream, Func parser, int millisecondsTimeout) - where T : HttpBase - { - var timeout = false; - var timer = new Timer ( - state => { - timeout = true; - stream.Close (); - }, - null, - millisecondsTimeout, - -1); - - T http = null; - Exception exception = null; - try { - http = parser (readHeaders (stream, _headersMaxLength)); - var contentLen = http.Headers["Content-Length"]; - if (contentLen != null && contentLen.Length > 0) - http.EntityBodyData = readEntityBody (stream, contentLen); - } - catch (Exception ex) { - exception = ex; - } - finally { - timer.Change (-1, -1); - timer.Dispose (); - } - - var msg = timeout - ? "A timeout has occurred while receiving a HTTP data." - : exception != null - ? "An exception has occurred while receiving a HTTP data." - : null; - - if (msg != null) - throw new WebSocketException (msg, exception); - - return http; - } - private static HttpResponse sendHttpRequest ( Stream stream, HttpRequest request, int millisecondsTimeout) { var buff = request.ToByteArray (); stream.Write (buff, 0, buff.Length); - return readHttp (stream, HttpResponse.Parse, millisecondsTimeout); - } - - private static bool writeBytes (Stream stream, byte[] data) - { - try { - stream.Write (data, 0, data.Length); - return true; - } - catch { - return false; - } + return read (stream, HttpResponse.Parse, millisecondsTimeout); } #endregion @@ -235,7 +221,7 @@ namespace WebSocketSharp } var code = res.StatusCode; - if (code.Length != 3 || code[0] != '2') + if (code[0] != '2') throw new WebSocketException ( String.Format ( "The proxy has failed a connection to the requested host and port. ({0})", code)); @@ -270,12 +256,12 @@ namespace WebSocketSharp internal HttpRequest ReadHttpRequest (int millisecondsTimeout) { - return readHttp (_innerStream, HttpRequest.Parse, millisecondsTimeout); + return read (_innerStream, HttpRequest.Parse, millisecondsTimeout); } internal HttpResponse ReadHttpResponse (int millisecondsTimeout) { - return readHttp (_innerStream, HttpResponse.Parse, millisecondsTimeout); + return read (_innerStream, HttpResponse.Parse, millisecondsTimeout); } internal WebSocketFrame ReadWebSocketFrame () @@ -296,13 +282,13 @@ namespace WebSocketSharp internal bool WriteBytes (byte[] data) { - lock (_forWrite) - return writeBytes (_innerStream, data); - } - - internal bool WriteHttp (HttpBase http) - { - return writeBytes (_innerStream, http.ToByteArray ()); + try { + _innerStream.Write (data, 0, data.Length); + return true; + } + catch { + return false; + } } #endregion