/// <summary> /// Añade una sesión /// </summary> private async Task AddSessionAsync(SessionEventArgs e) { var session = new WebSession.Session(e.Id); var webRequest = e.WebSession.Request; var webResponse = e.WebSession.Response; // Asigna los datos a la sesión session.IsTunnelConnect = e is TunnelConnectSessionEventArgs; // Asigna los datos recibidos y enviados if (session.IsTunnelConnect || e.WebSession.Request.UpgradeToWebSocket) { e.DataReceived += (sender, args) => session.ReceivedDataCount += args.Count; e.DataSent += (sender, args) => session.SentDataCount += args.Count; } // Actualiza los datos de sesión await UpdateSessionDataAsync(session, e, true); }
/// <summary> /// Consolida los datos de la sesión /// </summary> private async Task UpdateSessionDataAsync(WebSession.Session session, SessionEventArgs e, bool isNew) { var webRequest = e.WebSession.Request; var webResponse = e.WebSession.Response; // Código de estado, protocolo, proceso... session.StatusCode = webResponse?.StatusCode ?? 0; session.Uri = webRequest.RequestUri; session.ProcessId = e.WebSession.ProcessId.Value; // Tamaño del cuerpo session.BodySize = -1; if (!session.IsTunnelConnect && webResponse != null) { if (webResponse.ContentLength != -1) { session.BodySize = webResponse.ContentLength; } else if (webResponse.IsBodyRead && webResponse.Body != null) { session.BodySize = webResponse.Body.Length; } } // Obtiene los detalles de la solicitud y la respuesta session.Request = ReadRequestData(webRequest); session.Response = ReadResponseData(webResponse); // Trata la sesión nueva o modificada await Dispatcher.InvokeAsync(() => { if (isNew) { // Añade la sesión al diccionario _sessions.Add(e.WebSession, session); // Lanza el evento SessionAdded?.Invoke(this, new NewSessionEventArgs(session)); } else { // Lanza el evento SessionUpdated?.Invoke(this, new UpdateSessionEventArgs(session)); // Elimina la sesión del diccionario _sessions.Remove(e.WebSession); } }); }