1using System.Diagnostics;
8using Uri = UriTemplate.Core;
20 List<ISimpleRestApiHandler> m_Handlers =
new List<ISimpleRestApiHandler>();
21 HttpListener m_Listener;
24 List<SimpleRestMap> m_Middleware =
new List<SimpleRestMap>();
25 Type m_DefaultIntType;
26 JsonSerializerOptions m_SerializerOptions;
28 public bool Disposed {
get;
private set; } =
false;
33 public event Action<SimpleRestApi, SimpleRestRequest, SimpleRestResponse>?
OnResponseCreate;
34 public event Action<SimpleRestApi, SimpleRestRequest>?
OnLog;
39 Dictionary<UriTemplateMatch, SimpleRestMap>
70 public event Action<SimpleRestApi, SimpleRestRequest, SimpleRestResponse>?
OnRequestEnd;
78 JsonSerializerOptions? jsonSerializerOptions =
null,
79 Type? defaultIntType =
null
84 m_Listener =
new HttpListener();
87 m_Listener.Prefixes.Add(
"http://*:" + port +
"/");
90 ??
new JsonSerializerOptions
92 PropertyNameCaseInsensitive =
true,
93 PropertyNamingPolicy = JsonNamingPolicy.CamelCase
96 m_DefaultIntType = defaultIntType ?? typeof(
int);
137 ISimpleRestRouteHandler[]? routeHandlers =
null
141 new SimpleRestMap(endpoint, method, middleWare, m_UriTemplateFormatter, routeHandlers)
147 m_Handlers.Add(customHandler);
175 AddMiddleware(endpoint,
SimpleRestMethod.OPTIONS, middleWare, routeHandlers);
240 AddMiddleware(endpoint,
SimpleRestMethod.DELETE, middleWare, routeHandlers);
267 public async Task
Start(Action<int, string>? OnStartup =
null)
276 OnStartup?.Invoke(m_Port, m_Listener.Prefixes.First().Replace(
"*",
"localhost"));
283 HttpListenerContext context = await m_Listener.GetContextAsync();
288 m_SerializerOptions, m_EndpointFormatter
294 m_ResponseTypeParser, m_SerializerOptions
298 m_Logger.
Log(request);
299 OnLog?.Invoke(
this, request);
301 await RunMiddleWare(request, response);
308 catch (ObjectDisposedException ode)
310 Console.WriteLine(
"Server disposed");
311 AnsiConsole.WriteException(ode);
317 "Something went wrong while getting request: "
327 Console.WriteLine(
"Failure to open server: " + e.Message);
333 Dictionary<UriTemplateMatch, SimpleRestMap> matches = m_Middleware
335 m.Pattern.Match(
new System.Uri(request.
Endpoint, UriKind.Relative)) !=
null
336 || m.Endpoint ==
"/*"
340 m.Pattern.Match(
new System.Uri(request.
Endpoint, UriKind.Relative))
341 ??
new Uri.UriTemplate(
"/*").Match(
new System.Uri(
"/*")),
346 foreach (KeyValuePair<UriTemplateMatch, SimpleRestMap> match
in matches)
351 UriTemplateMatch uriTemplateMatch = match.Key;
356 OnRequestMatch?.Invoke(
this, request, response, uriTemplateMatch, map);
357 ApplyUriParams(uriTemplateMatch, request);
362 h.OnRequest(
this, request, response);
363 response.OnSend += (result) =>
365 h.OnResponse(
this, request, response);
370 await map.
Middleware.Invoke(request, response);
371 OnRunMiddleware?.Invoke(
this, request, response, uriTemplateMatch, map);
376 void ApplyUriParams(UriTemplateMatch match, SimpleRestRequest request)
378 Dictionary<string, object?> paramsToAdd =
new Dictionary<string, object?>();
379 foreach (
string key
in match.Bindings.Keys)
381 paramsToAdd.Add(key, match.Bindings[key].Value);
382 object? converted =
null;
385 converted = JsonSerializer.Deserialize<
object?>(
386 match.Bindings[key].Value.ToString() ??
"null"
389 catch (JsonException je)
391 string stringifiedObject = $
"\"{match.Bindings[key].Value.ToString()}\"";
392 converted = JsonSerializer.Deserialize<
object?>(stringifiedObject ??
"null");
394 converted = ApplyIntType(converted);
395 paramsToAdd[key] = converted;
397 request.Params.NonDistructiveUnion(paramsToAdd);
400 object? ApplyIntType(
object? value)
403 value !=
null && value is
short
411 return Convert.ChangeType(value, m_DefaultIntType);
void Post(ApiMiddleWare middleWare, params ISimpleRestRouteHandler[] routeHandlers)
async Task Start(Action< int, string >? OnStartup=null)
void Get(ApiMiddleWare middleWare, params ISimpleRestRouteHandler[] routeHandlers)
Action< SimpleRestApi >? OnBeforeRequestCreate
void All(ApiMiddleWare middleWare, params ISimpleRestRouteHandler[] routeHandlers)
Action< SimpleRestApi, SimpleRestRequest, SimpleRestResponse >? OnBeforeRequestEnd
void Options(string endpoint, ApiMiddleWare middleWare, params ISimpleRestRouteHandler[] routeHandlers)
Action< SimpleRestApi, SimpleRestRequest >? OnRequestCreate
void Post(string endpoint, ApiMiddleWare middleWare, params ISimpleRestRouteHandler[] routeHandlers)
void Options(ApiMiddleWare middleWare, params ISimpleRestRouteHandler[] routeHandlers)
void Delete(ApiMiddleWare middleWare, params ISimpleRestRouteHandler[] routeHandlers)
Action< SimpleRestApi, SimpleRestRequest, SimpleRestResponse >? OnRequestEnd
Action< SimpleRestApi, SimpleRestRequest, SimpleRestResponse, UriTemplateMatch, SimpleRestMap >? OnApplyUriParams
Action< SimpleRestApi, SimpleRestRequest >? OnBeforeResponseCreate
Action< SimpleRestApi, SimpleRestRequest, SimpleRestResponse, UriTemplateMatch, SimpleRestMap >? OnBeforeRunMiddleware
Action< SimpleRestApi, SimpleRestRequest, SimpleRestResponse >? OnResponseCreate
void Head(ApiMiddleWare middleWare, params ISimpleRestRouteHandler[] routeHandlers)
Action< SimpleRestApi >? OnServerStart
Action< SimpleRestApi, SimpleRestRequest >? OnLog
void Put(ApiMiddleWare middleWare, params ISimpleRestRouteHandler[] routeHandlers)
Action< SimpleRestApi, SimpleRestRequest, SimpleRestResponse, UriTemplateMatch, SimpleRestMap >? OnRunMiddleware
Action< SimpleRestApi, SimpleRestRequest, SimpleRestResponse, UriTemplateMatch, SimpleRestMap >? OnRequestMatch
SimpleRestApi(int port, ISimpleRestLogger? logger=null, ISimpleRestContentTypeParser? responseParser=null, ISimpleRestUriTemplateFormatter? uriFormatter=null, ISimpleRestEndpointFormatter? endpointFormatter=null, JsonSerializerOptions? jsonSerializerOptions=null, Type? defaultIntType=null)
void Use(ISimpleRestApiHandler customHandler)
Action< SimpleRestApi, SimpleRestRequest, SimpleRestResponse, Dictionary< UriTemplateMatch, SimpleRestMap > >? OnHandleRequestStack
void Get(string endpoint, ApiMiddleWare middleWare, params ISimpleRestRouteHandler[] routeHandlers)
void Put(string endpoint, ApiMiddleWare middleWare, params ISimpleRestRouteHandler[] routeHandlers)
void Map(string endpoint, ApiMiddleWare middleWare, params ISimpleRestRouteHandler[] routeHandlers)
void Patch(string endpoint, ApiMiddleWare middleWare, params ISimpleRestRouteHandler[] routeHandlers)
void Head(string endpoint, ApiMiddleWare middleWare, params ISimpleRestRouteHandler[] routeHandlers)
void Delete(string endpoint, ApiMiddleWare middleWare, params ISimpleRestRouteHandler[] routeHandlers)
void Patch(ApiMiddleWare middleWare, params ISimpleRestRouteHandler[] routeHandlers)
ISimpleRestRouteHandler?[] RouteHandlers
The main class for all incoming request data. This is a wrapper for the HttpListenerRequest class....
static SimpleRestRequest FromHttpListenerContext(HttpListenerContext listenerContext, JsonSerializerOptions jsonOptions, ISimpleRestEndpointFormatter? endpointFormatter=null)
Factory function creating a Request object with all http request info stored on it.
void OnBeforeRequestEnd(SimpleRestApi api, SimpleRestRequest request, SimpleRestResponse response)
void OnRequestMatch(SimpleRestApi api, SimpleRestRequest request, SimpleRestResponse response, UriTemplateMatch match, SimpleRestMap routeMap)
void OnRequestCreate(SimpleRestApi api, SimpleRestRequest request)
void OnResponseCreate(SimpleRestApi api, SimpleRestRequest request, SimpleRestResponse response)
void OnRunMiddleware(SimpleRestApi api, SimpleRestRequest request, SimpleRestResponse response, UriTemplateMatch match, SimpleRestMap routeMap)
void OnRequestEnd(SimpleRestApi api, SimpleRestRequest request, SimpleRestResponse response)
void OnLog(SimpleRestApi api, SimpleRestRequest request)
void OnBeforeRunMiddleware(SimpleRestApi api, SimpleRestRequest request, SimpleRestResponse response, UriTemplateMatch match, SimpleRestMap routeMap)
void OnBeforeRequestCreate(SimpleRestApi api)
void OnHandleRequestStack(SimpleRestApi api, SimpleRestRequest request, SimpleRestResponse response, Dictionary< UriTemplateMatch, SimpleRestMap > matches)
void OnApplyUriParams(SimpleRestApi api, SimpleRestRequest request, SimpleRestResponse response, UriTemplateMatch match, SimpleRestMap routeMap)
void OnBeforeResponseCreate(SimpleRestApi api, SimpleRestRequest request)
void OnServerStart(SimpleRestApi api)
void Log(string customMessage, SimpleRestLogLevel? logLevel=null)
delegate Task ApiMiddleWare(SimpleRestRequest request, SimpleRestResponse response)