Exemplo n.º 1
0
        private Task _listen()
        {
            return(Task.Factory.StartNew(() =>
            {
                try
                {
                    while (IsListening)
                    {
                        HttpListenerContext ctx = _listener.GetContext();
                        HttpListenerRequest req = ctx.Request;
                        HttpListenerResponse resp = ctx.Response;

                        try
                        {
                            string accesslog = DateTime.Now.ToString("o");
                            accesslog += "\t" + string.Format("Request #: {0}", ++_requestCount);
                            accesslog += "\t" + req.Url.ToString();
                            accesslog += "\t" + req.HttpMethod;
                            accesslog += "\t" + req.UserHostAddress;
                            accesslog += "\t" + req.UserAgent;

                            string origin = _getOrigin(req);
                            accesslog += "\t" + origin;

                            bool forbidden = false;
                            if (_url == origin || config.allowedDomains.Contains(origin))
                            {
                                resp.AppendHeader("Access-Control-Allow-Origin", origin);
                            }
                            else
                            {
                                if (req.Url.AbsolutePath == "/permissions")
                                {
                                    resp.AppendHeader("Access-Control-Allow-Origin", origin);
                                }
                                else
                                {
                                    resp.AppendHeader("Access-Control-Allow-Origin", _url);
                                    forbidden = true;
                                }
                            }
                            if (req.HttpMethod == "OPTIONS")
                            {
                                resp.AddHeader("Access-Control-Allow-Headers", "*");
                                resp.StatusCode = (int)HttpStatusCode.OK;
                                resp.StatusDescription = "OK";
                                resp.Close();
                            }
                            else
                            {
                                if (forbidden)
                                {
                                    accesslog += "\tfailed\tsame origin";
                                    ServerConfig.appendLog(accesslog);
                                    resp.StatusCode = (int)HttpStatusCode.Forbidden;
                                    resp.StatusDescription = "FORBIDDEN";
                                    resp.Close();
                                }
                                else
                                {
                                    bool is404 = false;
                                    if (req.Url.AbsolutePath == "/")
                                    {
                                        is404 = _home.handle(req, resp, accesslog);
                                    }
                                    else if (req.Url.AbsolutePath == "/permissions")
                                    {
                                        is404 = _permissions.handle(req, resp, accesslog);
                                    }
                                    else if (req.Url.AbsolutePath == "/printers")
                                    {
                                        is404 = _printers.handle(req, resp, accesslog);
                                    }
                                    else
                                    {
                                        is404 = true;
                                    }

                                    if (is404)
                                    {
                                        accesslog += "\tfailed\tnot found";
                                        ServerConfig.appendLog(accesslog);
                                        resp.StatusCode = (int)HttpStatusCode.NotFound;
                                        resp.StatusDescription = "NOT FOUND";
                                        resp.Close();
                                    }
                                }
                            }
                        }
                        catch (Exception e)
                        {
                            ServerConfig.appendLog("Error: " + e.Message + "\n" + e.StackTrace);
                            resp.StatusCode = (int)HttpStatusCode.InternalServerError;
                            resp.StatusDescription = "INTERNAL SERVER ERROR";
                            resp.Close();
                        }
                    }
                } catch (Exception e)
                {
                    if (!(e is HttpListenerException && (e as HttpListenerException).ErrorCode == 995))
                    {
                        ServerConfig.appendLog(e.GetType().Name + ": " + e.Message + "\n" + e.StackTrace);
                    }
                    return false;
                }
                return true;
            }));
        }