Fix server producing a timeout on setting status code without returning a body

This commit is contained in:
GHXX 2024-01-14 02:58:01 +01:00
parent e1e1596e54
commit 14ab546d4d
2 changed files with 15 additions and 10 deletions

View File

@ -159,11 +159,11 @@ public sealed class HttpServer {
foreach (var queryKV in queryStringArgs) {
var queryKVSplitted = queryKV.Split('=');
if (queryKVSplitted.Length != 2) {
rc.SetStatusCodeAndDispose(HttpStatusCode.BadRequest, "Malformed request URL parameters");
await rc.SetStatusCodeAndDisposeAsync(HttpStatusCode.BadRequest, "Malformed request URL parameters");
return;
}
if (!parsedQParams.TryAdd(WebUtility.UrlDecode(queryKVSplitted[0]), WebUtility.UrlDecode(queryKVSplitted[1]))) {
rc.SetStatusCodeAndDispose(HttpStatusCode.BadRequest, "Duplicate request URL parameters");
await rc.SetStatusCodeAndDisposeAsync(HttpStatusCode.BadRequest, "Duplicate request URL parameters");
return;
}
}
@ -176,14 +176,14 @@ public sealed class HttpServer {
if (stringToTypeParameterConverters[qparamInfo.type].TryConvertFromString(qparamValue, out object objRes)) {
convertedQParamValues[i] = objRes;
} else {
rc.SetStatusCodeAndDispose(HttpStatusCode.BadRequest);
await rc.SetStatusCodeAndDisposeAsync(HttpStatusCode.BadRequest);
return;
}
} else {
if (qparamInfo.isOptional) {
convertedQParamValues[i] = null!;
} else {
rc.SetStatusCodeAndDispose(HttpStatusCode.BadRequest, $"Missing required query parameter {qparamName}");
await rc.SetStatusCodeAndDisposeAsync(HttpStatusCode.BadRequest, $"Missing required query parameter {qparamName}");
return;
}
}

View File

@ -25,24 +25,29 @@ public class RequestContext : IDisposable {
public void SetStatusCode(HttpStatusCode status) => SetStatusCode((int) status);
public void SetStatusCodeAndDispose(int status) {
using (this)
public async Task SetStatusCodeAndDisposeAsync(int status) {
using (this) {
SetStatusCode(status);
await WriteToRespAsync("\n\n");
}
}
public void SetStatusCodeAndDispose(HttpStatusCode status) {
using (this)
public async Task SetStatusCodeAndDisposeAsync(HttpStatusCode status) {
using (this) {
SetStatusCode((int) status);
await WriteToRespAsync("\n\n");
}
}
public void SetStatusCodeAndDispose(int status, string description) {
public async Task SetStatusCodeAndDisposeAsync(int status, string description) {
using (this) {
ListenerContext.Response.StatusCode = status;
ListenerContext.Response.StatusDescription = description;
await WriteToRespAsync("\n\n");
}
}
public void SetStatusCodeAndDispose(HttpStatusCode status, string description) => SetStatusCodeAndDispose((int) status, description);
public async Task SetStatusCodeAndDisposeAsync(HttpStatusCode status, string description) => await SetStatusCodeAndDisposeAsync((int) status, description);
void IDisposable.Dispose() {