about summary refs log tree commit diff
path: root/Tests/LibMatrix.HomeserverEmulator/Program.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Tests/LibMatrix.HomeserverEmulator/Program.cs')
-rw-r--r--Tests/LibMatrix.HomeserverEmulator/Program.cs90
1 files changed, 90 insertions, 0 deletions
diff --git a/Tests/LibMatrix.HomeserverEmulator/Program.cs b/Tests/LibMatrix.HomeserverEmulator/Program.cs
new file mode 100644
index 0000000..516d380
--- /dev/null
+++ b/Tests/LibMatrix.HomeserverEmulator/Program.cs
@@ -0,0 +1,90 @@
+using System.Net.Mime;

+using LibMatrix;

+using LibMatrix.HomeserverEmulator.Services;

+using Microsoft.AspNetCore.Diagnostics;

+using Microsoft.AspNetCore.Http.Timeouts;

+using Microsoft.OpenApi.Models;

+

+var builder = WebApplication.CreateBuilder(args);

+

+// Add services to the container.

+

+builder.Services.AddControllers();

+// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle

+builder.Services.AddEndpointsApiExplorer();

+builder.Services.AddSwaggerGen(c => {

+    c.SwaggerDoc("v1", new OpenApiInfo() {

+        Version = "v1",

+        Title = "Rory&::LibMatrix.HomeserverEmulator",

+        Description = "Partial Matrix implementation"

+    });

+    c.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, "LibMatrix.HomeserverEmulator.xml"));

+});

+builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

+builder.Services.AddSingleton<UserStore>();

+builder.Services.AddSingleton<RoomStore>();

+

+

+builder.Services.AddScoped<TokenService>();

+

+builder.Services.AddRequestTimeouts(x => {

+    x.DefaultPolicy = new RequestTimeoutPolicy {

+        Timeout = TimeSpan.FromMinutes(10),

+        WriteTimeoutResponse = async context => {

+            context.Response.StatusCode = 504;

+            context.Response.ContentType = "application/json";

+            await context.Response.StartAsync();

+            await context.Response.WriteAsJsonAsync(new MatrixException() {

+                ErrorCode = "M_TIMEOUT",

+                Error = "Request timed out"

+            }.GetAsJson());

+            await context.Response.CompleteAsync();

+        }

+    };

+});

+builder.Services.AddCors(options => {

+    options.AddPolicy(

+        "Open",

+        policy => policy.AllowAnyOrigin().AllowAnyHeader());

+});

+var app = builder.Build();

+

+// Configure the HTTP request pipeline.

+if (app.Environment.IsDevelopment() || true)

+{

+    app.UseSwagger();

+    app.UseSwaggerUI();

+}

+

+app.UseCors("Open");

+app.UseExceptionHandler(exceptionHandlerApp => {

+    exceptionHandlerApp.Run(async context => {

+

+        var exceptionHandlerPathFeature =

+            context.Features.Get<IExceptionHandlerPathFeature>();

+

+        if (exceptionHandlerPathFeature?.Error is MatrixException mxe) {

+            context.Response.StatusCode = mxe.ErrorCode switch {

+                "M_NOT_FOUND" => StatusCodes.Status404NotFound,

+                "M_UNAUTHORIZED" => StatusCodes.Status401Unauthorized,

+                _ => StatusCodes.Status500InternalServerError

+            };

+            context.Response.ContentType = MediaTypeNames.Application.Json;

+            await context.Response.WriteAsync(mxe.GetAsJson()!);

+        }

+        else {

+            context.Response.StatusCode = StatusCodes.Status500InternalServerError;

+            context.Response.ContentType = MediaTypeNames.Application.Json;

+            await context.Response.WriteAsync(new MatrixException() {

+                ErrorCode = "M_UNKNOWN",

+                Error = exceptionHandlerPathFeature?.Error.ToString()

+            }.GetAsJson());

+        }

+    });

+});

+

+app.UseAuthorization();

+

+app.MapControllers();

+

+app.Run();