Skip to content
This repository was archived by the owner on Dec 18, 2018. It is now read-only.

Make parser "safe" #3068

Closed
wants to merge 10 commits into from
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ private bool ParseHttpRequest(ref ReadOnlySequence<byte> buffer, bool isComplete
return true;
}

public void OnHeader(Span<byte> name, Span<byte> value)
public void OnHeader(ReadOnlySpan<byte> name, ReadOnlySpan<byte> value)
{
}

Expand Down Expand Up @@ -170,10 +170,10 @@ private struct ParsingAdapter : IHttpRequestLineHandler, IHttpHeadersHandler
public ParsingAdapter(BenchmarkApplication requestHandler)
=> RequestHandler = requestHandler;

public void OnHeader(Span<byte> name, Span<byte> value)
public void OnHeader(ReadOnlySpan<byte> name, ReadOnlySpan<byte> value)
=> RequestHandler.OnHeader(name, value);

public void OnStartLine(HttpMethod method, HttpVersion version, Span<byte> target, Span<byte> path, Span<byte> query, Span<byte> customMethod, bool pathEncoded)
public void OnStartLine(HttpMethod method, HttpVersion version, ReadOnlySpan<byte> target, ReadOnlySpan<byte> path, ReadOnlySpan<byte> query, ReadOnlySpan<byte> customMethod, bool pathEncoded)
=> RequestHandler.OnStartLine(method, version, target, path, query, customMethod, pathEncoded);
}
}
Expand Down
2 changes: 1 addition & 1 deletion benchmarkapps/PlatformBenchmarks/BenchmarkApplication.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public static class Paths

private RequestType _requestType;

public void OnStartLine(HttpMethod method, HttpVersion version, Span<byte> target, Span<byte> path, Span<byte> query, Span<byte> customMethod, bool pathEncoded)
public void OnStartLine(HttpMethod method, HttpVersion version, ReadOnlySpan<byte> target, ReadOnlySpan<byte> path, ReadOnlySpan<byte> query, ReadOnlySpan<byte> customMethod, bool pathEncoded)
{
var requestType = RequestType.NotRecognized;
if (method == HttpMethod.Get)
Expand Down
4 changes: 2 additions & 2 deletions benchmarks/Kestrel.Performance/Http1ConnectionBenchmark.cs
Original file line number Diff line number Diff line change
Expand Up @@ -104,10 +104,10 @@ public Adapter(Http1ConnectionBenchmark requestHandler)
RequestHandler = requestHandler;
}

public void OnHeader(Span<byte> name, Span<byte> value)
public void OnHeader(ReadOnlySpan<byte> name, ReadOnlySpan<byte> value)
=> RequestHandler.Connection.OnHeader(name, value);

public void OnStartLine(HttpMethod method, HttpVersion version, Span<byte> target, Span<byte> path, Span<byte> query, Span<byte> customMethod, bool pathEncoded)
public void OnStartLine(HttpMethod method, HttpVersion version, ReadOnlySpan<byte> target, ReadOnlySpan<byte> path, ReadOnlySpan<byte> query, ReadOnlySpan<byte> customMethod, bool pathEncoded)
=> RequestHandler.Connection.OnStartLine(method, version, target, path, query, customMethod, pathEncoded);
}
}
Expand Down
8 changes: 4 additions & 4 deletions benchmarks/Kestrel.Performance/HttpParserBenchmark.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,11 @@ private void ParseData()
}
}

public void OnStartLine(HttpMethod method, HttpVersion version, Span<byte> target, Span<byte> path, Span<byte> query, Span<byte> customMethod, bool pathEncoded)
public void OnStartLine(HttpMethod method, HttpVersion version, ReadOnlySpan<byte> target, ReadOnlySpan<byte> path, ReadOnlySpan<byte> query, ReadOnlySpan<byte> customMethod, bool pathEncoded)
{
}

public void OnHeader(Span<byte> name, Span<byte> value)
public void OnHeader(ReadOnlySpan<byte> name, ReadOnlySpan<byte> value)
{
}

Expand All @@ -81,10 +81,10 @@ public Adapter(HttpParserBenchmark requestHandler)
RequestHandler = requestHandler;
}

public void OnHeader(Span<byte> name, Span<byte> value)
public void OnHeader(ReadOnlySpan<byte> name, ReadOnlySpan<byte> value)
=> RequestHandler.OnHeader(name, value);

public void OnStartLine(HttpMethod method, HttpVersion version, Span<byte> target, Span<byte> path, Span<byte> query, Span<byte> customMethod, bool pathEncoded)
public void OnStartLine(HttpMethod method, HttpVersion version, ReadOnlySpan<byte> target, ReadOnlySpan<byte> path, ReadOnlySpan<byte> query, ReadOnlySpan<byte> customMethod, bool pathEncoded)
=> RequestHandler.OnStartLine(method, version, target, path, query, customMethod, pathEncoded);
}
}
Expand Down
34 changes: 12 additions & 22 deletions benchmarks/Kestrel.Performance/KnownStringsBenchmark.cs
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ public int GetKnownMethod_TRACE()
return GetKnownMethod(data);
}

private int GetKnownMethod(Span<byte> data)
private int GetKnownMethod(ReadOnlySpan<byte> data)
{
int len = 0;
HttpMethod method;
Expand Down Expand Up @@ -129,29 +129,19 @@ public int GetKnownVersion_HTTP1_1()
{
int len = 0;
HttpVersion version;
Span<byte> data = _version;
ReadOnlySpan<byte> data = _version;
for (int i = 0; i < loops; i++)
{
data.GetKnownVersion(out version, out var length);
len += length;
data.GetKnownVersion(out version, out length);
len += length;
data.GetKnownVersion(out version, out length);
len += length;
data.GetKnownVersion(out version, out length);
len += length;
data.GetKnownVersion(out version, out length);
len += length;
data.GetKnownVersion(out version, out length);
len += length;
data.GetKnownVersion(out version, out length);
len += length;
data.GetKnownVersion(out version, out length);
len += length;
data.GetKnownVersion(out version, out length);
len += length;
data.GetKnownVersion(out version, out length);
len += length;
data.GetKnownVersion(out version);
data.GetKnownVersion(out version);
data.GetKnownVersion(out version);
data.GetKnownVersion(out version);
data.GetKnownVersion(out version);
data.GetKnownVersion(out version);
data.GetKnownVersion(out version);
data.GetKnownVersion(out version);
data.GetKnownVersion(out version);
data.GetKnownVersion(out version);
}
return len;
}
Expand Down
Loading