Skip to content

Commit a147e75

Browse files
Fix an exception being thrown if a connection times out
1 parent dd3e02d commit a147e75

File tree

3 files changed

+20
-16
lines changed

3 files changed

+20
-16
lines changed

Engine/Protocol/ClientHandler.cs

+2-11
Original file line numberDiff line numberDiff line change
@@ -137,22 +137,13 @@ private async PooledValueTask<bool> HandleRequest(RequestBuilder builder, bool d
137137

138138
KeepAlive ??= request["Connection"]?.Equals("Keep-Alive", StringComparison.InvariantCultureIgnoreCase) ?? true;
139139

140-
bool keepAlive = (bool)KeepAlive;
140+
bool keepAlive = KeepAlive.Value;
141141

142142
using var response = await Server.Handler.HandleAsync(request) ?? throw new InvalidOperationException("The root request handler did not return a response");
143143

144144
var success = await ResponseHandler.Handle(request, response, keepAlive, dataRemaining);
145145

146-
if (!success || !keepAlive)
147-
{
148-
Connection.Shutdown(SocketShutdown.Both);
149-
Connection.Disconnect(false);
150-
Connection.Close();
151-
152-
return false;
153-
}
154-
155-
return true;
146+
return (success && keepAlive);
156147
}
157148

158149
#endregion

Engine/Protocol/Parser/RequestParser.cs

+11-3
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,10 @@ internal RequestParser(NetworkConfiguration configuration)
4545

4646
internal async PooledValueTask<RequestBuilder?> TryParseAsync(RequestBuffer buffer)
4747
{
48-
await Type(buffer);
48+
if (!await Type(buffer))
49+
{
50+
return null;
51+
}
4952

5053
await Path(buffer);
5154

@@ -61,13 +64,18 @@ internal RequestParser(NetworkConfiguration configuration)
6164
return result;
6265
}
6366

64-
private async PooledValueTask Type(RequestBuffer buffer)
67+
private async PooledValueTask<bool> Type(RequestBuffer buffer)
6568
{
6669
Scanner.Mode = ScannerMode.Words;
6770

68-
if (await Scanner.Next(buffer, RequestToken.Word))
71+
if (await Scanner.Next(buffer, RequestToken.Word, allowNone: true))
6972
{
7073
Request.Type(MethodConverter.ToRequestMethod(Scanner.Value));
74+
return true;
75+
}
76+
else
77+
{
78+
return false;
7179
}
7280
}
7381

Engine/Protocol/Parser/RequestScanner.cs

+7-2
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,15 @@ internal RequestScanner()
2222
Mode = ScannerMode.Words;
2323
}
2424

25-
internal async PooledValueTask<bool> Next(RequestBuffer buffer, RequestToken expectedToken)
25+
internal async PooledValueTask<bool> Next(RequestBuffer buffer, RequestToken expectedToken, bool allowNone = false)
2626
{
2727
var read = await Next(buffer, forceRead: false);
2828

29+
if (allowNone && (read == RequestToken.None))
30+
{
31+
return false;
32+
}
33+
2934
if (read != expectedToken)
3035
{
3136
throw new ProtocolException($"Unexpected token '{read}' (expected '{expectedToken}')");
@@ -54,7 +59,7 @@ internal async PooledValueTask<RequestToken> Next(RequestBuffer buffer, bool for
5459
}
5560
else
5661
{
57-
throw new ProtocolException("No more data to be available to be parsed");
62+
return Current = RequestToken.None;
5863
}
5964
}
6065

0 commit comments

Comments
 (0)