Пример #1
0
        /// <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.");
        }