private async Task <bool> HttpNegotiation(WebSocketHttpRequest request, WebSocketHttpResponse response) { await Task.Delay(TimeSpan.FromMilliseconds(1)); var connectionId = Guid.Empty; if (request.RequestUri == null || request.RequestUri.OriginalString.Length < 1 || !Guid.TryParse(request.RequestUri.OriginalString.Substring(1), out connectionId)) { connectionId = _sysInfo.Guid(); _log.Info("Connection Id created: {0}", connectionId); } else { _log.Info("Connection Id from url: {0}", connectionId); } request.Items.Add(ConnectionIdKey, connectionId); Guid userId; if (request.Cookies[ConnectionManager.UserSessionCookieName] == null) { userId = _sysInfo.Guid(); _log.Info("User ID created: {0}", userId); } else { userId = Guid.Parse(request.Cookies[ConnectionManager.UserSessionCookieName].Value); _log.Info("User ID found in cookie: {0}", userId); } Queue.PublishRequest(new ConnectionConnectRequest(connectionId, userId), ctx => { ctx.HandleFault(f => { response.Status = HttpStatusCode.InternalServerError; }); ctx.HandleTimeout(TimeSpan.FromSeconds(5), () => { response.Status = HttpStatusCode.RequestTimeout; }); ctx.Handle <ConnectionConnectResponse>( res => { response.Cookies.Add(new Cookie(ConnectionManager.UserSessionCookieName, res.UserId.ToString())); }); }); return(true); }
public async Task HandleConnectionAsync(CancellationToken cancellation) { _cancellation = cancellation; var unsubs = new List <UnsubscribeAction>(); var connectionId = GetConnectionId(_ws); var sessionId = GetSessionId(_ws); try { _log.Info("Starting session '{0}' at connection '{1}'", sessionId, connectionId); unsubs.Add(_queue.SubscribeHandler <IConnectionEvent>(msg => { lock (_ws) { UserConnection user; ConnectionManager._connections.TryGetValue(connectionId, out user); if (user != null) { using ( var wsmsg = _ws.CreateMessageWriter(user.AesShook ? WebSocketMessageType.Binary : WebSocketMessageType.Text)) _serializer.Serialize(connectionId, msg, wsmsg); } } }, con => _ws.IsConnected && con.ConnectionId == connectionId)); _queue.Publish(new UserConnectionEvent(connectionId, sessionId)); while (_ws.IsConnected && !_cancellation.IsCancellationRequested) { var msg = await _ws.ReadMessageAsync(_cancellation).ConfigureAwait(false); if (msg == null) { continue; } Type type; var queueRequest = _serializer.Deserialize(connectionId, msg, out type); if (queueRequest == null) { continue; } queueRequest.ConnectionId = connectionId; _queue.Publish(queueRequest, type); } } catch (Exception aex) { _log.Error("Error Handling connection", aex.GetBaseException()); try { _ws.CloseAsync(); } catch { // ignored } } finally { // Console.WriteLine("Session '{0}' with connection '{1}' disconnected", sessionId, connectionId); foreach (var unsub in unsubs) { unsub(); } _ws.Dispose(); _queue.Publish(new ConnectionDisconnectedRequest(connectionId, sessionId)); } }