From 14ab546d4da99899ff1adf87c2282444d53cde8e Mon Sep 17 00:00:00 2001 From: GHXX Date: Sun, 14 Jan 2024 02:58:01 +0100 Subject: [PATCH] Fix server producing a timeout on setting status code without returning a body --- SimpleHttpServer/HttpServer.cs | 8 ++++---- SimpleHttpServer/RequestContext.cs | 17 +++++++++++------ 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/SimpleHttpServer/HttpServer.cs b/SimpleHttpServer/HttpServer.cs index 1dde74e..d736b76 100644 --- a/SimpleHttpServer/HttpServer.cs +++ b/SimpleHttpServer/HttpServer.cs @@ -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; } } diff --git a/SimpleHttpServer/RequestContext.cs b/SimpleHttpServer/RequestContext.cs index c6f5427..5e076db 100644 --- a/SimpleHttpServer/RequestContext.cs +++ b/SimpleHttpServer/RequestContext.cs @@ -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() {