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

View File

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