diff --git a/src/Fleck.Tests/RequestParserTests.cs b/src/Fleck.Tests/RequestParserTests.cs index 3062304e..68604976 100644 --- a/src/Fleck.Tests/RequestParserTests.cs +++ b/src/Fleck.Tests/RequestParserTests.cs @@ -7,11 +7,11 @@ namespace Fleck.Tests public class RequestParserTests { [Test] - public void ShouldReturnRequest() + public void ShouldReturnNullForEmptyBytes() { WebSocketHttpRequest request = RequestParser.Parse(new byte[0]); - Assert.IsNotNull(request); + Assert.IsNull(request); } [Test] @@ -44,13 +44,13 @@ public void ShouldReadBody() [Test] - public void ValidRequestShouldBeComplete() + public void ValidRequestShouldNotBeNull() { - Assert.True(RequestParser.IsComplete(ValidRequestArray())); + Assert.NotNull(RequestParser.Parse(ValidRequestArray())); } [Test] - public void NoBodyRequestShouldBeComplete() + public void NoBodyRequestShouldNotBeNull() { const string noBodyRequest = "GET /demo HTTP/1.1\r\n" + @@ -65,17 +65,11 @@ public void NoBodyRequestShouldBeComplete() ""; var bytes = RequestArray(noBodyRequest); - Assert.True(RequestParser.IsComplete(bytes)); + Assert.IsNotNull(RequestParser.Parse(bytes)); } [Test] - public void EmptyRequestShouldNotBeComplete() - { - Assert.False(RequestParser.IsComplete(new byte[0])); - } - - [Test] - public void NoHeadersRequestShouldNotBeComplete() + public void NoHeadersRequestShouldBeNull() { const string noHeadersNoBodyRequest = "GET /zing HTTP/1.1\r\n" + @@ -83,11 +77,11 @@ public void NoHeadersRequestShouldNotBeComplete() ""; var bytes = RequestArray(noHeadersNoBodyRequest); - Assert.False(RequestParser.IsComplete(bytes)); + Assert.IsNull(RequestParser.Parse(bytes)); } [Test] - public void PartialHeaderRequestShouldNotBeComplete() + public void PartialHeaderRequestShouldBeNull() { const string partialHeaderRequest = "GET /demo HTTP/1.1\r\n" + @@ -99,7 +93,7 @@ public void PartialHeaderRequestShouldNotBeComplete() "Sec-WebSoc"; //Cut off var bytes = RequestArray(partialHeaderRequest); - Assert.False(RequestParser.IsComplete(bytes)); + Assert.IsNull(RequestParser.Parse(bytes)); } public byte[] ValidRequestArray() diff --git a/src/Fleck/RequestParser.cs b/src/Fleck/RequestParser.cs index 1c19a480..4e95fd9e 100644 --- a/src/Fleck/RequestParser.cs +++ b/src/Fleck/RequestParser.cs @@ -3,49 +3,48 @@ namespace Fleck { - public class RequestParser - { - const string pattern = @"^(?[^\s]+)\s(?[^\s]+)\sHTTP\/1\.1\r\n" + // request line - @"((?[^:\r\n]+):\s(?[^\r\n]+)\r\n)+" + //headers - @"\r\n" + //newline - @"(?.+)?"; - - private static readonly Regex _regex = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled); - - public static bool IsComplete(byte[] bytes) + public class RequestParser { - var requestString = Encoding.UTF8.GetString(bytes); - return _regex.IsMatch(requestString); - } - - public static WebSocketHttpRequest Parse(byte[] bytes) - { - return Parse(bytes, "ws"); - } - - public static WebSocketHttpRequest Parse(byte[] bytes, string scheme) - { - var body = Encoding.UTF8.GetString(bytes); - Match match = _regex.Match(body); - - var request = new WebSocketHttpRequest{ - Method = match.Groups["method"].Value, - Path = match.Groups["path"].Value, - Body = match.Groups["body"].Value, - Bytes = bytes, - Scheme = scheme - }; - - var fields = match.Groups["field_name"].Captures; - var values = match.Groups["field_value"].Captures; - for (var i = 0; i < fields.Count; i++) { - var name = fields[i].ToString(); - var value = values[i].ToString(); - request.Headers[name] = value; - } - - return request; + const string pattern = @"^(?[^\s]+)\s(?[^\s]+)\sHTTP\/1\.1\r\n" + // request line + @"((?[^:\r\n]+):\s(?[^\r\n]+)\r\n)+" + //headers + @"\r\n" + //newline + @"(?.+)?"; + + private static readonly Regex _regex = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled); + + public static WebSocketHttpRequest Parse(byte[] bytes) + { + return Parse(bytes, "ws"); + } + + public static WebSocketHttpRequest Parse(byte[] bytes, string scheme) + { + var body = Encoding.UTF8.GetString(bytes); + Match match = _regex.Match(body); + + if (!match.Success) + return null; + + var request = new WebSocketHttpRequest + { + Method = match.Groups["method"].Value, + Path = match.Groups["path"].Value, + Body = match.Groups["body"].Value, + Bytes = bytes, + Scheme = scheme + }; + + var fields = match.Groups["field_name"].Captures; + var values = match.Groups["field_value"].Captures; + for (var i = 0; i < fields.Count; i++) + { + var name = fields[i].ToString(); + var value = values[i].ToString(); + request.Headers[name] = value; + } + + return request; + } } - } }