public Task <bool> Start() { _logger.LogDebug($"Starting http listener on port {_port}"); _cts = new CancellationTokenSource(); #pragma warning disable 4014 Task.Run(async() => { try { _listener = TcpListener.Create(_port); _listener.Server.DualMode = true; _listener.Start(); while (true) { _logger.LogDebug("Waiting for new tcp connection"); var tcpClient = await _listener.AcceptTcpClientAsync(); _logger.LogDebug($"New tcp connection from {((IPEndPoint)tcpClient.Client.RemoteEndPoint).Address}"); ThreadPool.QueueUserWorkItem(async state => { var connection = new HttpServerConnection(_middleware, _logger, (TcpClient)state, this); _connections.Add(connection); await connection.HandleClient().ConfigureAwait(false); }, tcpClient); } } catch (TaskCanceledException) { _listener.Stop(); } catch (Exception e) { _listener.Stop(); _logger.LogError(e, "Could not accept client"); } }, _cts.Token).ConfigureAwait(false); #pragma warning restore 4014 return(Task.FromResult(true)); }
public bool SendNotification(Characteristic characteristic, HapSession session) { var baseChar = new CharacteristicBase(characteristic.DefaultType) { Id = characteristic.Id, Value = characteristic.Value, AccessoryId = characteristic.Service.Accessory.Id }; var charReturn = new CharacteristicsList <CharacteristicBase> { Characteristics = new List <CharacteristicBase> { baseChar } }; var data = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(charReturn, HapMiddleware.JsonSettings)); var response = HttpServerConnection.GetHttpResponse("EVENT/1.0", "application/hap+json", data, DateTime.Now); _logger.LogTrace($"Writing {Encoding.UTF8.GetString(response)}"); lock (session) { try { var encrypted = HttpServerConnection.EncryptData(response, session); session.Client.Client.Send(encrypted); return(true); } catch (Exception e) { _logger.LogError(e, "Could not set value"); } } return(false); }
internal void ConnectionClosed(HttpServerConnection connection) { _logger.LogDebug($"Closed connection from {connection.GetRemoteEndpoint()}"); _connections.Remove(connection); }