示例#1
0
        private object BindParameterByName(Type bindType, string bindName, IWebServerRequest request, string prefix)
        {
            if (bindType.IsPrimitive || bindType == typeof(string))
            {
                string name = string.Format("{0}{1}", prefix, bindName);

                if (request.Fields.ContainsKey(name))
                {
                    return(StringToObject(request.Fields[name], bindType));
                }
                else
                {
                    return(null);
                }
            }
            else
            {
                object o = Activator.CreateInstance(bindType); // If this is too limiting then could we use the CastleContainer??

                foreach (PropertyInfo propertyInfo in bindType.GetProperties(BindingFlags.Public | BindingFlags.FlattenHierarchy))
                {
                    object value = BindParameterByName(propertyInfo.PropertyType, propertyInfo.Name, request, string.Format("{0}{1}.", prefix, bindName));

                    if (value != null)
                    {
                        propertyInfo.SetValue(o, value);
                    }
                }

                return(o);
            }
        }
示例#2
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);
        }
示例#3
0
文件: WebSite.cs 项目: radtek/Thingy
 protected void HandleControllerRequest(IWebServerRequest request, IWebServerResponse response)
 {
     if (request.Controller == null || !request.Controller.Handle(request, response))
     {
         request.SetFileName(DefaultWebPage);
     }
 }
示例#4
0
        public bool CanHandle(IWebServerRequest request)
        {
            string controllerName = string.IsNullOrEmpty(request.ControllerName) ? "Default" : request.ControllerName;
            bool   canHandle      = (GetType().Name.StartsWith(request.ControllerName));

            if (canHandle)
            {
                if (string.IsNullOrEmpty(request.ControllerName))
                {
                    request.ControllerName = GetType().Name.Substring(0, GetType().Name.Length - 10);
                }

                if (string.IsNullOrEmpty(request.ControllerMethodName))
                {
                    request.ControllerMethodName = "Index";
                }

                if (request.IsFile)
                {
                    request.AdjustFilePathForController();
                }
            }

            return(canHandle);
        }
示例#5
0
 public AvalonHelperModel(IAvalonGame game, IWebServerRequest request)
 {
     GameStatus          = game.GetGameStatus();
     UserStatus          = game.GetUserStatus(request.User);
     Players             = game.GetPlayerList();
     CanStartGameMessage = game.CanStartGame();
     Roles = game.GetRevealedRoles();
 }
示例#6
0
 private MarkUpBuilder AddRequestDetails(MarkUpBuilder builder, IWebServerRequest request)
 {
     return(request == null ? builder : builder
            .Append("<div style=\"font-family: consolas, courier; border : 1px solid black; padding : 8px; margin-bottom : 4px;\">")
            .Append("<table><tbody>")
            .Append("<tr><th style=\"padding-right : 4px; text-align : right\">HTTP Method</th><td>", request.HttpMethod, "</td></tr>")
            .Append("<tr><th style=\"padding-right : 4px; text-align : right\">Url</th><td>", request.HttpListenerRequest.Url, "</td></tr>")
            .Append("</tbody></table>")
            .Append("</div>"));
 }
示例#7
0
 private object[] GetParametersFromRequest(MethodInfo method, IWebServerRequest request)
 {
     if (request.UrlValues.Any())
     {
         return(BindUrlValuesByPosition(method, request.UrlValues));
     }
     else
     {
         return(BindFieldsByName(method, request));
     }
 }
示例#8
0
文件: WebSite.cs 项目: radtek/Thingy
        public virtual bool CanHandle(IWebServerRequest request)
        {
            bool canHandle = IsDefault || PortNumber == request.HttpListenerRequest.LocalEndPoint.Port;

            if (canHandle)
            {
                request.Controller = controllerProvider.GetControllerForRequest(request);
            }

            return(canHandle);
        }
示例#9
0
 public void NotFound(IWebServerRequest request)
 {
     FromString(
         AddRequestDetails(new MarkUpBuilder()
                           .Append("<!DOCTYPE html>", "<html>", "<head>", "<title>404 Not Found</title>", "</head>")
                           .Append("<body style=\"font-family: calibri, ariel;\">", "<h1 style=\"background-color: #ffffcf; border : 1px solid black; padding : 8px\">404 - Not Found</h1>")
                           , request)
         .Append("<div style=\"font-family: consolas, courier; border : 1px solid black; padding : 8px\">")
         .Append("The requested resource could not be found but may be available in the future.<br/>Subsequent requests by the client are permissible.")
         .Append("</div></body>", "</html>")
         .ToString(), "text/html", 404);
 }
示例#10
0
 public void NotAllowed(IWebServerRequest request)
 {
     FromString(
         AddRequestDetails(new MarkUpBuilder()
                           .Append("<!DOCTYPE html>", "<html>", "<head>", "<title>403 Forbidden</title>", "</head>")
                           .Append("<body style=\"font-family: calibri, ariel;\">", "<h1 style=\"background-color: #ffffcf; border : 1px solid black; padding : 8px\">500 - Forbidden</h1>")
                           , request)
         .Append("<div style=\"font-family: consolas, courier; border : 1px solid black; padding : 8px\">")
         .Append("The request was valid, but the server is refusing action.<br/>The user might not have the necessary permissions for a resource, or may need an account of some sort.")
         .Append("</div></body>", "</html>")
         .ToString(), "text/html", 403);
 }
示例#11
0
 public void InternalError(IWebServerRequest request, Exception e)
 {
     FromString(
         AddRequestDetails(new MarkUpBuilder()
                           .Append("<!DOCTYPE html>", "<html>", "<head>", "<title>500 Error</title>", "</head>")
                           .Append("<body style=\"font-family: calibri, ariel;\">", "<h1 style=\"background-color: #ffffcf; border : 1px solid black; padding : 8px\">500 - Internal Server Error</h1>")
                           , request)
         .Append("<div style=\"font-family: consolas, courier; border : 1px solid black; padding : 8px\">")
         .Append(e.ToString().Replace("\n", "<br/>"))
         .Append("</div></body>", "</html>")
         .ToString(), "text/html", 500);
 }
示例#12
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);
            }
        }
示例#13
0
        public IView GetViewForRequest(IWebServerRequest request)
        {
            string viewsDirectory     = request.WebSite.GetOsFilePath("Views");
            string masterPage         = Directory.GetFiles(viewsDirectory, "Master.*").FirstOrDefault();
            string sectionDirectory   = Path.Combine(viewsDirectory, request.ViewTemplateSection);
            string sectionMasterPage  = Directory.GetFiles(sectionDirectory, "Master.*").FirstOrDefault();
            string viewTemplateFilter = string.Format("{0}.*", request.ViewTemplateName);
            string viewTemplatePage   = Directory.GetFiles(sectionDirectory, viewTemplateFilter).FirstOrDefault();

            //TODO - Caching

            return(viewFactory.Create(masterPage, sectionMasterPage, viewTemplatePage));
        }
示例#14
0
        private object[] BindFieldsByName(MethodInfo method, IWebServerRequest request)
        {
            ParameterInfo[] parameterInfos = method.GetParameters();
            object[]        parameters     = new object[parameterInfos.Length];
            int             index          = 0;

            foreach (ParameterInfo parameterInfo in method.GetParameters())
            {
                parameters[index] = BindParameterByName(parameterInfo.ParameterType, parameterInfo.Name, request, string.Empty);
                index++;
            }

            return(parameters);
        }
示例#15
0
        public override bool CanHandle(IWebServerRequest request)
        {
            bool canHandle = base.CanHandle(request);

            if (canHandle && request.IsFile)
            {
                if (!request.FilePath.ToLower().StartsWith("images\\") && !request.FilePath.ToLower().StartsWith("avalon\\"))
                {
                    return(false);
                }
            }

            return(canHandle);
        }
示例#16
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);
            }
        }
示例#17
0
        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();
            }
        }
示例#18
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}
                                ));
 }
示例#19
0
 public IController GetNextControllerForRequest(IWebServerRequest request, Priorities prreviousPiority)
 {
     return(controllers.FirstOrDefault(c => c.Priority > prreviousPiority && c.CanHandle(request)));
 }
示例#20
0
 public IController GetControllerForRequest(IWebServerRequest request)
 {
     return(controllers.FirstOrDefault(c => c.CanHandle(request)));
 }
示例#21
0
        private bool UserAuthorized(MethodInfo method, IWebServerRequest request)
        {
            IList <AuthorizedRoleAttribute> attributes = method.GetCustomAttributes <AuthorizedRoleAttribute>().ToList();

            return(!attributes.Any() || attributes.Any(a => request.User.Roles.Contains(a.Role)));
        }