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; })); }