Ignore:
Timestamp:
Aug 1, 2022, 12:54:31 PM (2 years ago)
Author:
alloc
Message:

Switched to use SpaceWizards.HttpListener

File:
1 edited

Legend:

Unmodified
Added
Removed
  • binary-improvements2/MapRendering/Web/SSE/SseHandler.cs

    r367 r382  
    55using System.Threading;
    66using AllocsFixes.NetConnections.Servers.Web.Handlers;
     7using HttpListenerRequest = SpaceWizards.HttpListener.HttpListenerRequest;
     8using HttpListenerResponse = SpaceWizards.HttpListener.HttpListenerResponse;
    79
    810// Implemented following HTML spec
     
    1012
    1113namespace AllocsFixes.NetConnections.Servers.Web.SSE {
    12         public class SseHandler : PathHandler {
     14        public class SseHandler : AbsHandler {
    1315                private readonly Dictionary<string, EventBase> events = new CaseInsensitiveStringDictionary<EventBase> ();
    14                
     16
    1517                private ThreadManager.ThreadInfo queueThead;
    1618                private readonly AutoResetEvent evSendRequest = new AutoResetEvent (false);
     
    1820
    1921                public SseHandler (string _moduleName = null) : base (_moduleName) {
    20                         Type[] ctorTypes = {typeof (SseHandler)};
    21                         object[] ctorParams = {this};
     22                        Type[] ctorTypes = { typeof (SseHandler) };
     23                        object[] ctorParams = { this };
    2224
    2325                        foreach (Type t in Assembly.GetExecutingAssembly ().GetTypes ()) {
     
    2527                                        ConstructorInfo ctor = t.GetConstructor (ctorTypes);
    2628                                        if (ctor != null) {
    27                                                 EventBase apiInstance = (EventBase) ctor.Invoke (ctorParams);
    28                                                 addEvent (apiInstance.Name, apiInstance);
     29                                                EventBase apiInstance = (EventBase)ctor.Invoke (ctorParams);
     30                                                AddEvent (apiInstance.Name, apiInstance);
    2931                                        }
    3032                                }
     
    3436                public override void SetBasePathAndParent (Web _parent, string _relativePath) {
    3537                        base.SetBasePathAndParent (_parent, _relativePath);
    36                        
     38
    3739                        queueThead = ThreadManager.StartThread ("SSE-Processing_" + urlBasePath, QueueProcessThread, ThreadPriority.BelowNormal,
    3840                                _useRealThread: true);
     
    4547                }
    4648
    47                 private void addEvent (string _eventName, EventBase _eventInstance) {
     49                public void AddEvent (string _eventName, EventBase _eventInstance) {
    4850                        events.Add (_eventName, _eventInstance);
    4951                        WebPermissions.Instance.AddKnownModule ("webevent." + _eventName, _eventInstance.DefaultPermissionLevel ());
    5052                }
    5153
    52                 public override void HandleRequest (HttpListenerRequest _req, HttpListenerResponse _resp, WebConnection _user,
     54                public override void HandleRequest (string _requestPath, HttpListenerRequest _req, HttpListenerResponse _resp, WebConnection _con,
    5355                        int _permissionLevel) {
    54                         string eventName = _req.Url.AbsolutePath.Remove (0, urlBasePath.Length);
     56                        string eventName = _requestPath.Remove (0, urlBasePath.Length);
    5557
    5658                        if (!events.TryGetValue (eventName, out EventBase eventInstance)) {
    5759                                Log.Out ($"Error in {nameof (SseHandler)}.HandleRequest(): No handler found for event \"{eventName}\"");
    58                                 _resp.StatusCode = (int) HttpStatusCode.NotFound;
     60                                _resp.StatusCode = (int)HttpStatusCode.NotFound;
    5961                                return;
    6062                        }
    6163
    62                         if (!AuthorizeForEvent (eventName, _permissionLevel)) {
    63                                 _resp.StatusCode = (int) HttpStatusCode.Forbidden;
    64                                 if (_user != null) {
     64                        if (!IsAuthorizedForEvent (eventName, _permissionLevel)) {
     65                                _resp.StatusCode = (int)HttpStatusCode.Forbidden;
     66                                if (_con != null) {
    6567                                        //Log.Out ($"{nameof(SseHandler)}: user '{user.SteamID}' not allowed to access '{eventName}'");
    6668                                }
     
    8082                                Log.Error ($"Error in {nameof (SseHandler)}.HandleRequest(): Handler {eventInstance.Name} threw an exception:");
    8183                                Log.Exception (e);
    82                                 _resp.StatusCode = (int) HttpStatusCode.InternalServerError;
     84                                _resp.StatusCode = (int)HttpStatusCode.InternalServerError;
    8385                        }
    8486                }
    8587
    86                 private bool AuthorizeForEvent (string _eventName, int _permissionLevel) {
     88                private bool IsAuthorizedForEvent (string _eventName, int _permissionLevel) {
    8789                        return WebPermissions.Instance.ModuleAllowedWithLevel ("webevent." + _eventName, _permissionLevel);
    8890                }
    8991
    9092                private void QueueProcessThread (ThreadManager.ThreadInfo _threadInfo) {
    91                         try {
    92                                 while (!shutdown && !_threadInfo.TerminationRequested ()) {
    93                                         evSendRequest.WaitOne (500);
     93                        while (!shutdown && !_threadInfo.TerminationRequested ()) {
     94                                evSendRequest.WaitOne (500);
    9495
    95                                         foreach (KeyValuePair<string, EventBase> kvp in events) {
     96                                foreach (KeyValuePair<string, EventBase> kvp in events) {
     97                                        try {
    9698                                                kvp.Value.ProcessSendQueue ();
     99                                        } catch (Exception e) {
     100                                                Log.Error ($"SSE ({kvp.Key}): Error processing send queue");
     101                                                Log.Exception (e);
    97102                                        }
    98103                                }
    99                         } catch (Exception e) {
    100                                 Log.Error ("SSE: Error processing send queue");
    101                                 Log.Exception (e);
    102104                        }
    103105                }
Note: See TracChangeset for help on using the changeset viewer.