Ignore:
Timestamp:
Aug 11, 2021, 6:22:03 PM (3 years ago)
Author:
alloc
Message:

Web:

  • Added SSE (ServerSentEvents) subsystem
  • Added log endpoint to SSE. Less heavy weight and more responsive way of watching the server log
  • Bunch of refactoring
Location:
binary-improvements/MapRendering/Web/Handlers
Files:
5 edited

Legend:

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

    r351 r367  
    44using System.Reflection;
    55using AllocsFixes.NetConnections.Servers.Web.API;
    6 using UnityEngine.Profiling;
    76
    87namespace AllocsFixes.NetConnections.Servers.Web.Handlers {
    98        public class ApiHandler : PathHandler {
    109                private readonly Dictionary<string, WebAPI> apis = new CaseInsensitiveStringDictionary<WebAPI> ();
    11                 private readonly string staticPart;
    1210
    13                 public ApiHandler (string _staticPart, string _moduleName = null) : base (_moduleName) {
    14                         staticPart = _staticPart;
     11                public ApiHandler (string _moduleName = null) : base (_moduleName) {
    1512
    1613                        foreach (Type t in Assembly.GetExecutingAssembly ().GetTypes ()) {
     
    1916                                        if (ctor != null) {
    2017                                                WebAPI apiInstance = (WebAPI) ctor.Invoke (new object [0]);
    21                                                 addApi (apiInstance.Name, apiInstance);
     18                                                addApi (apiInstance);
    2219                                        }
    2320                                }
    2421                        }
    2522
    26                         // Add dummy types
    27                         Type dummy_t = typeof (Null);
    28                         ConstructorInfo dummy_ctor = dummy_t.GetConstructor (new Type [0]);
    29                         if (dummy_ctor != null) {
    30                                 WebAPI dummy_apiInstance = (WebAPI) dummy_ctor.Invoke (new object[0]);
    31 
    32                                 // Permissions that don't map to a real API
    33                                 addApi ("viewallclaims", dummy_apiInstance);
    34                                 addApi ("viewallplayers", dummy_apiInstance);
    35                         }
     23                        // Permissions that don't map to a real API
     24                        addApi (new Null ("viewallclaims"));
     25                        addApi (new Null ("viewallplayers"));
    3626                }
    3727
    38                 private void addApi (string _apiName, WebAPI _api) {
    39                         apis.Add (_apiName, _api);
    40                         WebPermissions.Instance.AddKnownModule ("webapi." + _apiName, _api.DefaultPermissionLevel ());
     28                private void addApi (WebAPI _api) {
     29                        apis.Add (_api.Name, _api);
     30                        WebPermissions.Instance.AddKnownModule ("webapi." + _api.Name, _api.DefaultPermissionLevel ());
    4131                }
    4232
    4333#if ENABLE_PROFILER
    44                 private static readonly CustomSampler apiHandlerSampler = CustomSampler.Create ("API_Handler");
     34                private static readonly UnityEngine.Profiling.CustomSampler apiHandlerSampler = UnityEngine.Profiling.CustomSampler.Create ("API_Handler");
    4535#endif
    4636
    4737                public override void HandleRequest (HttpListenerRequest _req, HttpListenerResponse _resp, WebConnection _user,
    4838                        int _permissionLevel) {
    49                         string apiName = _req.Url.AbsolutePath.Remove (0, staticPart.Length);
     39                        string apiName = _req.Url.AbsolutePath.Remove (0, urlBasePath.Length);
    5040
    51                         WebAPI api;
    52                         if (!apis.TryGetValue (apiName, out api)) {
    53                                 Log.Out ("Error in ApiHandler.HandleRequest(): No handler found for API \"" + apiName + "\"");
     41                        if (!apis.TryGetValue (apiName, out WebAPI api)) {
     42                                Log.Out ($"Error in {nameof(ApiHandler)}.HandleRequest(): No handler found for API \"{apiName}\"");
    5443                                _resp.StatusCode = (int) HttpStatusCode.NotFound;
    5544                                return;
    5645                        }
    5746
    58                         if (!AuthorizeForCommand (apiName, _user, _permissionLevel)) {
     47                        if (!AuthorizeForApi (apiName, _permissionLevel)) {
    5948                                _resp.StatusCode = (int) HttpStatusCode.Forbidden;
    6049                                if (_user != null) {
    61                                         //Log.Out ("ApiHandler: user '{0}' not allowed to execute '{1}'", user.SteamID, apiName);
     50                                        //Log.Out ($"{nameof(ApiHandler)}: user '{user.SteamID}' not allowed to execute '{apiName}'");
    6251                                }
    6352
     
    7463#endif
    7564                        } catch (Exception e) {
    76                                 Log.Error ("Error in ApiHandler.HandleRequest(): Handler {0} threw an exception:", api.Name);
     65                                Log.Error ($"Error in {nameof(ApiHandler)}.HandleRequest(): Handler {api.Name} threw an exception:");
    7766                                Log.Exception (e);
    7867                                _resp.StatusCode = (int) HttpStatusCode.InternalServerError;
     
    8069                }
    8170
    82                 private bool AuthorizeForCommand (string _apiName, WebConnection _user, int _permissionLevel) {
     71                private bool AuthorizeForApi (string _apiName, int _permissionLevel) {
    8372                        return WebPermissions.Instance.ModuleAllowedWithLevel ("webapi." + _apiName, _permissionLevel);
    8473                }
  • binary-improvements/MapRendering/Web/Handlers/ItemIconHandler.cs

    r354 r367  
    1111                private readonly bool logMissingFiles;
    1212
    13                 private readonly string staticPart;
    1413                private bool loaded;
    1514
     
    1817                }
    1918
    20                 public ItemIconHandler (string _staticPart, bool _logMissingFiles, string _moduleName = null) : base (_moduleName) {
    21                         staticPart = _staticPart;
     19                public ItemIconHandler (bool _logMissingFiles, string _moduleName = null) : base (_moduleName) {
    2220                        logMissingFiles = _logMissingFiles;
    2321                        Instance = this;
     
    3432                        }
    3533
    36                         string requestFileName = _req.Url.AbsolutePath.Remove (0, staticPart.Length);
     34                        string requestFileName = _req.Url.AbsolutePath.Remove (0, urlBasePath.Length);
    3735                        requestFileName = requestFileName.Remove (requestFileName.LastIndexOf ('.'));
    3836
  • binary-improvements/MapRendering/Web/Handlers/PathHandler.cs

    r351 r367  
    33namespace AllocsFixes.NetConnections.Servers.Web.Handlers {
    44        public abstract class PathHandler {
    5                 private readonly string moduleName;
     5                protected readonly string moduleName;
     6                protected string urlBasePath;
     7                protected Web parent;
    68
    79                protected PathHandler (string _moduleName, int _defaultPermissionLevel = 0) {
     
    2426                        return true;
    2527                }
     28
     29                public virtual void Shutdown () {
     30                }
     31
     32                public virtual void SetBasePathAndParent (Web _parent, string _relativePath) {
     33                        parent = _parent;
     34                        urlBasePath = _relativePath;
     35                }
    2636        }
    2737}
  • binary-improvements/MapRendering/Web/Handlers/SessionHandler.cs

    r351 r367  
    77                private readonly string footer = "";
    88                private readonly string header = "";
    9                 private readonly Web parent;
    10                 private readonly string staticPart;
    119
    12                 public SessionHandler (string _staticPart, string _dataFolder, Web _parent, string _moduleName = null) :
    13                         base (_moduleName) {
    14                         staticPart = _staticPart;
    15                         parent = _parent;
    16 
     10                public SessionHandler (string _dataFolder, string _moduleName = null) : base (_moduleName) {
    1711                        if (File.Exists (_dataFolder + "/sessionheader.tmpl")) {
    1812                                header = File.ReadAllText (_dataFolder + "/sessionheader.tmpl");
     
    2620                public override void HandleRequest (HttpListenerRequest _req, HttpListenerResponse _resp, WebConnection _user,
    2721                        int _permissionLevel) {
    28                         string subpath = _req.Url.AbsolutePath.Remove (0, staticPart.Length);
     22                        string subpath = _req.Url.AbsolutePath.Remove (0, urlBasePath.Length);
    2923
    3024                        StringBuilder result = new StringBuilder ();
     
    5246                                        "<h1>Not logged in, <a href=\"/static/index.html\">click to return to main page</a>.</h1>");
    5347                        } else if (subpath.StartsWith ("login")) {
    54                                 string host = (Web.isSslRedirected (_req) ? "https://" : "http://") + _req.UserHostName;
     48                                string host = (Web.IsSslRedirected (_req) ? "https://" : "http://") + _req.UserHostName;
    5549                                string url = OpenID.GetOpenIdLoginUrl (host, host + "/session/verify");
    5650                                _resp.Redirect (url);
  • binary-improvements/MapRendering/Web/Handlers/StaticHandler.cs

    r351 r367  
    88                private readonly string datapath;
    99                private readonly bool logMissingFiles;
    10                 private readonly string staticPart;
    1110
    12                 public StaticHandler (string _staticPart, string _filePath, AbstractCache _cache, bool _logMissingFiles,
     11                public StaticHandler (string _filePath, AbstractCache _cache, bool _logMissingFiles,
    1312                        string _moduleName = null) : base (_moduleName) {
    14                         staticPart = _staticPart;
    1513                        datapath = _filePath + (_filePath [_filePath.Length - 1] == '/' ? "" : "/");
    1614                        cache = _cache;
     
    2018                public override void HandleRequest (HttpListenerRequest _req, HttpListenerResponse _resp, WebConnection _user,
    2119                        int _permissionLevel) {
    22                         string fn = _req.Url.AbsolutePath.Remove (0, staticPart.Length);
     20                        string fn = _req.Url.AbsolutePath.Remove (0, urlBasePath.Length);
    2321
    2422                        byte[] content = cache.GetFileContent (datapath + fn);
Note: See TracChangeset for help on using the changeset viewer.