NetworkQualityServer/AS1024.NetworkQuality.Server/Program.cs

101 lines
2.7 KiB
C#

using AS1024.NetworkQuality.Server;
using System.Text.Json;
const string schemeNetQuality = "https";
var builder = WebApplication.CreateSlimBuilder(args);
builder.WebHost.ConfigureKestrel(options => {
options.Limits.MaxRequestBodySize = long.MaxValue;
options.Limits.MaxRequestBufferSize = long.MaxValue;
}).UseKestrelHttpsConfiguration();
builder.Services.AddLogging();
builder.Logging.AddConsole();
var app = builder.Build();
app.MapGet("/api/v1/config", (HttpRequest request) =>
{
string host = request.Host.Host;
int port = request.Host.Port ?? 443;
Uri smallDownloadUrl = new UriBuilder
{
Scheme = schemeNetQuality,
Host = host,
Port = port,
Path = "/api/v1/small"
}.Uri;
Uri largeDownloadUrl = new UriBuilder
{
Scheme = schemeNetQuality,
Host = host,
Port = port,
Path = "/api/v1/large"
}.Uri;
Uri uploadUrl = new UriBuilder
{
Scheme = schemeNetQuality,
Host = host,
Port = port,
Path = "/api/v1/upload"
}.Uri;
ConfigResponse config = new()
{
Urls = new Urls
{
SmallDownloadUrl = smallDownloadUrl.AbsoluteUri,
LargeDownloadUrl = largeDownloadUrl.AbsoluteUri,
UploadUrl = uploadUrl.AbsoluteUri
}
};
return Results.Json(config, AppJsonSerializerContext.Default);
});
app.MapGet("/api/v1/small", (HttpResponse response, ILogger<Program> logger) =>
{
response.ContentType = "application/octet-stream";
return Results.Ok();
});
app.MapGet("/api/v1/large", async (HttpRequest request, HttpResponse response, ILogger<Program> logger) =>
{
response.ContentType = "application/octet-stream";
try
{
var largeStream = new LargeStreamResult();
await largeStream.CopyToAsync(response.Body);
}
catch (IOException ex)
{
logger.LogError(ex, "An error occurred while writing the large file content.");
response.StatusCode = 500;
await response.WriteAsync("An error occurred while writing the large file content.");
}
catch (Exception ex)
{
logger.LogError(ex, "An unexpected error occurred.");
response.StatusCode = 500;
await response.WriteAsync("An unexpected error occurred.");
}
});
app.MapPost("/api/v1/upload", async (HttpRequest request, ILogger<Program> logger) =>
{
try
{
await request.Body.CopyToAsync(Stream.Null);
return Results.Ok();
}
catch (Exception ex)
{
logger.LogError(ex, "An unexpected error occurred.");
return Results.Problem("An unexpected error occurred.", statusCode: 500);
}
});
app.Run();