Ignore:
Timestamp:
Aug 6, 2022, 11:32:32 PM (2 years ago)
Author:
alloc
Message:

Big refactoring in Web to pass around a Context instead of a bunch of individual arguments all the time

File:
1 edited

Legend:

Unmodified
Added
Removed
  • binary-improvements2/MapRendering/Web/Handlers/ApiHandler.cs

    r384 r387  
    44using System.Reflection;
    55using AllocsFixes.NetConnections.Servers.Web.API;
    6 using HttpListenerRequest = SpaceWizards.HttpListener.HttpListenerRequest;
    7 using HttpListenerResponse = SpaceWizards.HttpListener.HttpListenerResponse;
    86
    97namespace AllocsFixes.NetConnections.Servers.Web.Handlers {
    108        public class ApiHandler : AbsHandler {
    11                 private readonly Dictionary<string, WebAPI> apis = new CaseInsensitiveStringDictionary<WebAPI> ();
     9                private readonly Dictionary<string, AbsWebAPI> apis = new CaseInsensitiveStringDictionary<AbsWebAPI> ();
    1210
    1311                public ApiHandler () : base (null) {
     
    2523                       
    2624                        foreach (Type t in Assembly.GetExecutingAssembly ().GetTypes ()) {
    27                                 if (!t.IsAbstract && t.IsSubclassOf (typeof (WebAPI))) {
     25                                if (!t.IsAbstract && t.IsSubclassOf (typeof (AbsWebAPI))) {
    2826                                        ConstructorInfo ctor = t.GetConstructor (apiWithParentCtorTypes);
    2927                                        if (ctor != null) {
    30                                                 WebAPI apiInstance = (WebAPI) ctor.Invoke (apiWithParentCtorArgs);
     28                                                AbsWebAPI apiInstance = (AbsWebAPI) ctor.Invoke (apiWithParentCtorArgs);
    3129                                                addApi (apiInstance);
    3230                                                continue;
     
    3533                                        ctor = t.GetConstructor (apiEmptyCtorTypes);
    3634                                        if (ctor != null) {
    37                                                 WebAPI apiInstance = (WebAPI) ctor.Invoke (apiEmptyCtorArgs);
     35                                                AbsWebAPI apiInstance = (AbsWebAPI) ctor.Invoke (apiEmptyCtorArgs);
    3836                                                addApi (apiInstance);
    3937                                        }
     
    4644                }
    4745
    48                 private void addApi (WebAPI _api) {
     46                private void addApi (AbsWebAPI _api) {
    4947                        apis.Add (_api.Name, _api);
    5048                        WebPermissions.Instance.AddKnownModule ("webapi." + _api.Name, _api.DefaultPermissionLevel ());
     
    5553#endif
    5654
    57                 public override void HandleRequest (string _requestPath, HttpListenerRequest _req, HttpListenerResponse _resp, WebConnection _con,
    58                         int _permissionLevel) {
    59                         string apiName = _requestPath.Remove (0, urlBasePath.Length);
     55                public override void HandleRequest (RequestContext _context) {
    6056
    61                         if (!apis.TryGetValue (apiName, out WebAPI api)) {
     57                        string apiName;
     58                        string subPath = null;
     59
     60                        int pathSeparatorIndex = _context.RequestPath.IndexOf ('/', urlBasePath.Length);
     61                        if (pathSeparatorIndex >= 0) {
     62                                apiName = _context.RequestPath.Substring (urlBasePath.Length, pathSeparatorIndex - urlBasePath.Length);
     63                                subPath = _context.RequestPath.Substring (pathSeparatorIndex + 1);
     64                        } else {
     65                                apiName = _context.RequestPath.Substring (urlBasePath.Length);
     66                        }
     67                       
     68                        if (!apis.TryGetValue (apiName, out AbsWebAPI api)) {
    6269                                Log.Out ($"Error in {nameof(ApiHandler)}.HandleRequest(): No handler found for API \"{apiName}\"");
    63                                 _resp.StatusCode = (int) HttpStatusCode.NotFound;
     70                                _context.Response.StatusCode = (int) HttpStatusCode.NotFound;
    6471                                return;
    6572                        }
    6673
    67                         if (!AuthorizeForApi (apiName, _permissionLevel)) {
    68                                 _resp.StatusCode = (int) HttpStatusCode.Forbidden;
    69                                 if (_con != null) {
     74                        if (!AuthorizeForApi (apiName, _context.PermissionLevel)) {
     75                                _context.Response.StatusCode = (int) HttpStatusCode.Forbidden;
     76                                if (_context.Connection != null) {
    7077                                        //Log.Out ($"{nameof(ApiHandler)}: user '{user.SteamID}' not allowed to execute '{apiName}'");
    7178                                }
     
    7481                        }
    7582
     83                        _context.RequestPath = subPath;
     84
    7685                        try {
    7786#if ENABLE_PROFILER
    7887                                apiHandlerSampler.Begin ();
    7988#endif
    80                                 api.HandleRequest (_req, _resp, _con, _permissionLevel);
     89                                api.HandleRequest (_context);
    8190#if ENABLE_PROFILER
    8291                                apiHandlerSampler.End ();
     
    8594                                Log.Error ($"Error in {nameof(ApiHandler)}.HandleRequest(): Handler {api.Name} threw an exception:");
    8695                                Log.Exception (e);
    87                                 _resp.StatusCode = (int) HttpStatusCode.InternalServerError;
     96                                _context.Response.StatusCode = (int) HttpStatusCode.InternalServerError;
    8897                        }
    8998                }
Note: See TracChangeset for help on using the changeset viewer.