예제 #1
0
        public bool Handle(IWebServerRequest request, IWebServerResponse response)
        {
            Request  = request;
            Response = response;

            MethodInfo method = GetType().GetMethods().FirstOrDefault(m => m.Name == request.ControllerMethodName && SupportsHttpMethod(m, request.HttpMethod));

            if (method != null)
            {
                if (UserAuthorized(method, request))
                {
                    try
                    {
                        object[]    parameters = GetParametersFromRequest(method, request);
                        object      o          = method.Invoke(this, parameters);
                        IViewResult result     = request.WebSite.ViewProvider.GetViewForRequest(request).Render(o);
                        response.FromString(result.Content, result.ContentType);
                    }
                    catch (Exception exception)
                    {
                        response.InternalError(request, exception);
                    }
                }
                else
                {
                    response.NotAllowed(request);
                }
            }
            else
            {
                return(false);
            }

            return(true);
        }
예제 #2
0
파일: WebSite.cs 프로젝트: radtek/Thingy
 protected void HandleControllerRequest(IWebServerRequest request, IWebServerResponse response)
 {
     if (request.Controller == null || !request.Controller.Handle(request, response))
     {
         request.SetFileName(DefaultWebPage);
     }
 }
예제 #3
0
파일: WebSite.cs 프로젝트: radtek/Thingy
        protected void HandleFileRequest(IWebServerRequest request, IWebServerResponse response)
        {
            string filePath = Path.Combine(path, request.FilePath);

            if (File.Exists(filePath))
            {
                response.FromFile(filePath);
            }
            else
            {
                response.NotFound(request);
            }
        }
예제 #4
0
파일: WebSite.cs 프로젝트: radtek/Thingy
        public virtual void Handle(IWebServerRequest request, IWebServerResponse response)
        {
            request.WebSite = this;

            if (!request.IsFile)
            {
                HandleControllerRequest(request, response);
            }

            if (request.IsFile)
            {
                HandleFileRequest(request, response);
            }
        }
예제 #5
0
파일: WebServer.cs 프로젝트: radtek/Thingy
        private void ListenerCallback(IAsyncResult result)
        {
            HttpListener listener = (HttpListener)result.AsyncState;

            if (listener.IsListening)
            {
                listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener);
                HttpListenerContext context  = listener.EndGetContext(result);
                IWebServerRequest   request  = webServerRequestFactory.Create(context.Request);
                IWebServerResponse  response = webServerResponseFactory.Create(context.Response);
                webSites.First(w => w.CanHandle(request)).Handle(request, response);
                logger.LogRequest(request, response);
                response.HttpListenerResponse.Close();
            }
        }
예제 #6
0
 public void LogRequest(IWebServerRequest request, IWebServerResponse response)
 {
     WriteMessage(string.Format(logFormatString,
                                DateTime.Now.ToString("yyyy-MM-dd"),                                               //date {0}
                                DateTime.Now.ToString("HH:mm:ss"),                                                 //time {1}
                                PlaceHolderIfBlank(request.WebSite.Name),                                          // s-sitename {2}
                                PlaceHolderIfBlank(request.HttpListenerRequest.LocalEndPoint.Address.ToString()),  // s-ip {3}
                                PlaceHolderIfBlank(request.HttpMethod),                                            // cs-method {4}
                                PlaceHolderIfBlank(request.HttpListenerRequest.Url.AbsolutePath),                  // cs-uri {5}
                                PlaceHolderIfBlank(request.HttpListenerRequest.Url.Query),                         // cs-uri-query {6}
                                request.HttpListenerRequest.LocalEndPoint.Port,                                    // s-port {7}
                                PlaceHolderIfBlank(request.User.UserId),                                           // cs-username {8}
                                PlaceHolderIfBlank(request.HttpListenerRequest.RemoteEndPoint.Address.ToString()), // c-ip {9}
                                request.HttpListenerRequest.UserAgent ?? "-",                                      // cs(User-Agent) {10}
                                response.HttpListenerResponse.StatusCode,                                          // sc-status {11}
                                0,                                                                                 // sc-substatus {12}
                                0                                                                                  // sc-win32-status {13}
                                ));
 }