Skip to content

Commit

Permalink
RequestParser Returns Null on No Match. statianzo#6 for Chrome
Browse files Browse the repository at this point in the history
  • Loading branch information
statianzo authored and orcun committed Sep 30, 2013
1 parent 0000662 commit 3a5f67f
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 58 deletions.
26 changes: 10 additions & 16 deletions src/Fleck.Tests/RequestParserTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down Expand Up @@ -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" +
Expand All @@ -65,29 +65,23 @@ 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" +
"\r\n" +
"";
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" +
Expand All @@ -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()
Expand Down
83 changes: 41 additions & 42 deletions src/Fleck/RequestParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,49 +3,48 @@

namespace Fleck
{
public class RequestParser
{
const string pattern = @"^(?<method>[^\s]+)\s(?<path>[^\s]+)\sHTTP\/1\.1\r\n" + // request line
@"((?<field_name>[^:\r\n]+):\s(?<field_value>[^\r\n]+)\r\n)+" + //headers
@"\r\n" + //newline
@"(?<body>.+)?";

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 = @"^(?<method>[^\s]+)\s(?<path>[^\s]+)\sHTTP\/1\.1\r\n" + // request line
@"((?<field_name>[^:\r\n]+):\s(?<field_value>[^\r\n]+)\r\n)+" + //headers
@"\r\n" + //newline
@"(?<body>.+)?";

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;
}
}
}
}

0 comments on commit 3a5f67f

Please sign in to comment.