/// <summary> /// Process an incoming request. /// </summary> /// <param name="context">connection to client</param> /// <param name="request">request information</param> /// <param name="response">response that should be filled</param> /// <param name="session">session information</param> protected virtual void HandleRequest(IHttpClientContext context, IHttpRequest request, IHttpResponse response, IHttpSession session) { LogWriter.Write(this, LogPrio.Trace, "Processing request...."); bool handled = false; try { DecodeBody(request); if (ProcessAuthentication(request, response, session)) { foreach (HttpModule module in _modules) { if (!module.Process(request, response, session)) { continue; } handled = true; if (!module.AllowSecondaryProcessing) { break; } } } } catch (HttpException err) { if (err.HttpStatusCode == HttpStatusCode.Unauthorized) { AuthenticationModule mod; lock (_authModules) mod = _authModules.Count > 0 ? _authModules[0] : null; if (mod != null) { RequestAuthentication(mod, request, response); } } else { ErrorPage(response, err); } } if (!handled && response.Status == HttpStatusCode.OK) { ErrorPage(response, HttpStatusCode.NotFound, "Resource not found: " + request.Uri); } if (!response.HeadersSent) { // Dispose session if it was not used. if (session.Count > 0) { _sessionStore.Save(session); // only set session cookie if it have not been sent in the request. if (request.Cookies[_sessionCookieName] == null) { response.Cookies.Add(new ResponseCookie(_sessionCookieName, session.Id, DateTime.MinValue)); //DateTime.Now.AddMinutes(20).AddDays(1))); } } else { _sessionStore.AddUnused(session); } } if (!response.Sent) { response.Send(); } LogWriter.Write(this, LogPrio.Trace, "....done."); }