Exemple #1
0
        public object Invoke(BaseHandler handler, HttpContext context)
        {
            MethodInfo m = null;

            if (string.IsNullOrEmpty(method))
            {
                // call the request method
                // if no method is passed then well call the method by HTTP verb (GET, POST, DELETE, UPDATE)
                method = context.Request.RequestType.ToUpper();

                //method = "GET";
            }
            m = handler.GetType().GetMethod(method);

            List <object> a = new List <object>();

            if (m == null)
            {
                if (method.ToLower() == "help")
                {
                    m = handler.GetType().BaseType.GetMethod("Help");
                }
                else
                {
                    throw new Exception(string.Format("Method {0} not found on Handler {1}.", method, this.GetType().ToString()));
                }
            }

            foreach (var param in m.GetParameters())
            {
                a.Add(ProcessProperty(param.Name, param.ParameterType, 0));
            }

            object invokeResult = null;

            invokeResult = m.Invoke(handler, a.ToArray());

            return(invokeResult);
        }
 public void RegisterHandler(BaseHandler handler)
 {
     var typeName = handler.GetType().Name;
     if (typeName.EndsWith("Handler"))
     {
         var handlerPrefix = typeName.Replace("Handler", "");
         var methods = from m in handler.GetType().GetMethods()
             where m.Name == "Handle"
             select m;
         foreach (var methodInfo in methods)
         {
             var parameters = methodInfo.GetParameters();
             if (parameters.Length == 1)
             {
                 var header = handlerPrefix + "." + parameters[0].ParameterType.Name;
                 _handlers.Add(header, handler);
                 _types.Add(header,
                     new InOutMessageType {In = parameters[0].ParameterType, Out = methodInfo.ReturnType});
             }
         }
     }
 }
    public void Run()
    {
        ThreadPool.QueueUserWorkItem(o =>
        {
            Print(ConsoleColor.Green, "Webserver is now listening for connections...");

            while (m_Listener.IsListening)
            {
                ThreadPool.QueueUserWorkItem(async c =>
                {
                    var ctx = c as HttpListenerContext;
                    try
                    {
                        if (ctx == null)
                        {
                            return;
                        }

                        // Do we have auth header?
                        if (ctx.Request.Headers.Get("Authorization") == null)
                        {
                            ctx.Response.StatusCode = 401;
                            Print(ConsoleColor.Yellow, "Blocked Unauthorized request from {0} (No Auth Header)", ctx.Request.UserHostAddress);
                            return;
                        }

                        string requestAuthToken = ctx.Request.Headers["Authorization"].Replace("Bearer ", "");;
                        if (requestAuthToken != AuthToken)
                        {
                            ctx.Response.StatusCode = 401;
                            Print(ConsoleColor.Yellow, "Blocked Unauthorized request from {0} (Invalid Auth Token)", ctx.Request.UserHostAddress);
                            return;
                        }

                        string[] explodedUri = ctx.Request.RawUrl.Split('/');
                        string funcName      = explodedUri[1];

                        long paramsLen      = explodedUri.Length - 2;
                        string[] parameters = new string[paramsLen];
                        Array.Copy(explodedUri, 2, parameters, 0, paramsLen);
                        parameters = parameters.Where(x => !string.IsNullOrEmpty(x)).ToArray();

                        string reqBody = new StreamReader(ctx.Request.InputStream).ReadToEnd();
                        string respStr = String.Empty;

                        // Do we have a handler?
                        if (m_Handlers.ContainsKey(funcName))
                        {
                            BaseHandler handler = m_Handlers[funcName];

                            // Do we have the expected security authorization?
                            bool bMeetsSecurityReq  = false;
                            Player associatedPlayer = null;
                            if (handler.EndpointSecurity != EndpointSecurityType.None)
                            {
                                switch (handler.EndpointSecurity)
                                {
                                case EndpointSecurityType.RequiresUserSession:
                                    {
                                        // attempt to read the UserSession from the JSON body
                                        // any exception here will trigger the finally and catch block below, terminating the request and cleaning up nicely
                                        dynamic reqBodyDeserialized = Newtonsoft.Json.Linq.JObject.Parse(reqBody);
                                        string UserSessionID        = reqBodyDeserialized.user_session;
                                        if (UserSessionID == null)
                                        {
                                            bMeetsSecurityReq = false;
                                        }
                                        else
                                        {
                                            // Is the session valid?
                                            associatedPlayer = Program.g_PlayerManager.GetPlayerFromSession(UserSessionID);
                                            if (associatedPlayer != null)
                                            {
                                                bMeetsSecurityReq = true;
                                            }
                                            else
                                            {
                                                bMeetsSecurityReq = false;
                                            }
                                        }
                                        break;
                                    }

                                default:
                                    {
                                        bMeetsSecurityReq = false;
                                        break;
                                    }
                                }
                            }
                            else
                            {
                                bMeetsSecurityReq = true;
                            }

                            if (!bMeetsSecurityReq)
                            {
                                ctx.Response.StatusCode = 403;
                                string errorStr         = String.Format("-> {0} expected auth type {1}. A valid session was not provided.", handler.GetType().Name, handler.EndpointSecurity);
                                Print(ConsoleColor.Green, errorStr);
                                respStr = errorStr;
                            }
                            else
                            {
                                if (handler.NumExpectedParameters() == parameters.Length || handler.NumExpectedParameters() == -1)
                                {
                                    Print(ConsoleColor.Green, "-> Routing {2} request {0} to {1}", funcName, handler.GetType().Name, ctx.Request.HttpMethod);

                                    if (ctx.Request.HttpMethod == "GET")
                                    {
                                        respStr = await handler.ProcessRequest_Get(associatedPlayer, ctx.Request, parameters);
                                    }
                                    else if (ctx.Request.HttpMethod == "PUT")
                                    {
                                        respStr = await handler.ProcessRequest_Put(associatedPlayer, ctx.Request, parameters, reqBody);
                                    }
                                    else
                                    {
                                        Print(ConsoleColor.Green, "-> Request {0} with method {1} was not handled.", funcName, ctx.Request.HttpMethod);
                                    }
                                }
                                else
                                {
                                    string errorStr = String.Format("-> Invalid number of parameters for {0}. Expected: {1}. Got: {2}", handler.GetType().Name, handler.NumExpectedParameters(), parameters.Length);
                                    Print(ConsoleColor.Green, errorStr);
                                    respStr = errorStr;
                                }
                            }
                        }
                        else
                        {
                            respStr = "Function not registered.";
                        }

                        ctx.Response.ContentType = "application/json";
                        var buf = Encoding.UTF8.GetBytes(respStr);
                        ctx.Response.ContentLength64 = buf.Length;
                        ctx.Response.OutputStream.Write(buf, 0, buf.Length);
                    }
                    catch (Exception ex)
                    {
                        Print(ConsoleColor.Red, "Ctx Exception: {0}", ex.Message);
                    }
                    finally
                    {
                        // always close stream
                        if (ctx != null)
                        {
                            try { ctx.Response.OutputStream.Close(); } catch { };
                        }
                    }
                }, m_Listener.GetContext());
            }
        });
    }