コード例 #1
0
ファイル: PowerLineServer.cs プロジェクト: yanivka/PowerLine
 internal void innerAddClient(PowerLineWebsocketClient client)
 {
     lock (this.websocketClientLock)
     {
         this.websocketClients.Add(client);
     }
 }
コード例 #2
0
ファイル: PowerLineContext.cs プロジェクト: yanivka/PowerLine
        public PowerLineContext(JObject message, Stream requestPayload, int pathIndex, string[] path, PowerLineWebsocketClient client)
        {
            this.RemoteAddress = client.RemoteAddress;
            this.RemotePort    = client.RemotePort;
            this.LocalPort     = client.LocalPort;
            this.RemoteAddress = client.RemoteAddress;

            this.WebsocketClient     = client;
            this.IsWebSocket         = true;
            this.context             = null;
            this.request             = null;
            this.response            = null;
            this.PathIndex           = pathIndex;
            this.Path                = path;
            this._requestJsonPayload = message;

            if (message.TryGetValue("method", out string requestMethod))
            {
                this.RequestMethod = requestMethod;
            }
            else
            {
                throw new Exception("Invaild websocket request");
            }

            this.RequestHeaders  = message.ReadHeaders();
            this.ResponseHeader  = new Dictionary <string, string>();
            this.RequestPayload  = requestPayload;
            this.ResponsePayload = null;
        }
コード例 #3
0
ファイル: PowerLineServer.cs プロジェクト: yanivka/PowerLine
 internal bool innerRemoveClient(PowerLineWebsocketClient client)
 {
     this.innerUnsbscribeAllEvents(client);
     lock (this.websocketClientLock)
     {
         return(this.websocketClients.Remove(client));
     }
 }
コード例 #4
0
ファイル: PowerLineServer.cs プロジェクト: yanivka/PowerLine
 internal bool innerSubscribeEvent(PowerLineWebsocketClient client, PowerLineEvent powerLineEvent)
 {
     if (powerLineEvent.SubscribeWithCheck(client))
     {
         client.SubscribeEvent(powerLineEvent);
         return(true);
     }
     else
     {
         return(false);
     }
 }
コード例 #5
0
 internal bool UnsubscribeClient(PowerLineWebsocketClient websocket)
 {
     this.clientsLock.WaitAsync();
     try
     {
         return(this.clients.Remove(websocket));
     }
     finally
     {
         this.clientsLock.Release();
     }
 }
コード例 #6
0
 internal void SubscribeClient(PowerLineWebsocketClient websocket)
 {
     this.clientsLock.WaitAsync();
     try
     {
         this.clients.Add(websocket);
     }
     finally
     {
         this.clientsLock.Release();
     }
 }
コード例 #7
0
ファイル: PowerLineServer.cs プロジェクト: yanivka/PowerLine
 internal void innerUnsbscribeAllEvents(PowerLineWebsocketClient client)
 {
     lock (client.eventsLock)
     {
         foreach (KeyValuePair <string, PowerLineEvent> singleEvent in client.events)
         {
             lock (singleEvent.Value.clientsLock)
             {
                 singleEvent.Value.clients.Remove(client);
             }
         }
         client.events.Clear();
     }
 }
コード例 #8
0
        internal bool SubscribeWithCheck(PowerLineWebsocketClient client)
        {
            PowerLineSubscriptionEventArgs args = new PowerLineSubscriptionEventArgs(client);

            Subscription?.Invoke(this, args);
            if (args.cancel)
            {
                return(false);
            }
            else
            {
                this.SubscribeClient(client);
                return(true);
            }
        }
コード例 #9
0
ファイル: PowerLineServer.cs プロジェクト: yanivka/PowerLine
        internal async Task HandleWebsocketMessageAsync(PowerLineWebsocketClient client, Stream message)
        {
            JObject mainMessage;

            using (StreamReader reader = new StreamReader(message))
            {
                mainMessage = JObject.Parse(reader.ReadToEnd());
            }

            if (!mainMessage.TryGetValue("url", out string requestUrl))
            {
                throw new Exception("Invaild request url");
            }
            if (!mainMessage.TryGetValue("websocketId", out int websocketId))
            {
                throw new Exception("Invaild request url");
            }
            string[]         UrlPath = requestUrl.Split('/');
            PowerLineContext context = new PowerLineContext(mainMessage, message, 0, UrlPath, client);

            PowerLineEndPointExecutionResult result = await GetHandleResultAsync(context);

            switch (result.ResultType)
            {
            case PowerLinExecutionResultType.EndPointNotFound:
                result.Context.SetResponse(404);
                result.Context.SetResponseHttpString("Not Found");
                break;

            case PowerLinExecutionResultType.HandlerException:
                result.Context.SetResponse(500);
                result.Context.SetResponseHttpString(result.Exception.Message);
                break;

            case PowerLinExecutionResultType.HttpMethodNotFound:
                result.Context.SetResponse(404);
                result.Context.SetResponseHttpString("Not Found [HttpMethod]");
                break;
            }

            await client.SendResponseAsync(context, websocketId);
        }
コード例 #10
0
 public PowerLineSubscriptionEventArgs(PowerLineWebsocketClient client)
 {
     this.Client = client;
     this.cancel = false;
 }
コード例 #11
0
ファイル: PowerLineServer.cs プロジェクト: yanivka/PowerLine
 internal void innerUnsbscribeEvent(PowerLineWebsocketClient client, PowerLineEvent powerLineEvent)
 {
     client.UnsubscribeEvent(powerLineEvent);
     powerLineEvent.UnsubscribeClient(client);
 }
コード例 #12
0
ファイル: PowerLineServer.cs プロジェクト: yanivka/PowerLine
 private void handleAsyncWebsocket(HttpListenerContext context)
 {
     // just create a client, he will manage eveyrthing else (like adding to the server client list)
     PowerLineWebsocketClient client = new PowerLineWebsocketClient(this, context, this.cancelToken);
 }