private AgilefantClient GetClientSession(HttpRequestProcessor processor) { var client = _client; var index = -1; try { if (processor.HttpCookies.ContainsKey("aft-session")) { var id = (string)processor.HttpCookies["aft-session"]; index = _logins.LookupId(id); client = _logins[index]; } if (client != null) { var response = client.Session.Get("loginContext.action").Result; if (string.IsNullOrWhiteSpace(response.Headers.Location) && !response.Content.Content.Contains("Agilefant login") || !string.IsNullOrWhiteSpace(response.Headers.Location) && (!response.Headers.Location.Contains("login.jsp") && !response.Headers.Location.Contains("error.json"))) { return(client); } client.Session.Logout(); client.Session.ReLogin(); return(client); } if (string.IsNullOrWhiteSpace(_config.Username) && string.IsNullOrWhiteSpace(_config.Password)) { throw new SecurityException("No login credentials provided"); } var session = AgilefantSession.Login(_config.Username, _config.Password).Result; _client = new AgilefantClient(session); return(_client); } catch (Exception) { Logger.Log("Re-authentication is required.", LogLevel.Warn); try { if (index != -1) { throw new Exception("Can't relogin"); } _client.Session.Logout(); _client.Session.ReLogin(); return(_client); } catch (Exception) { if (index != -1 && _logins.Count > index) { _logins.RemoveIndex(index); } processor.WriteRedirect("/rest/login?returnUrl=" + Uri.EscapeDataString(processor.HttpUrl), "{\"success\":false}"); return(null); } } }
private bool Listen() { try { _listener = new TcpListener(IPAddress.Any, _port); _listener.Start(); while (_isActive) { var s = _listener.AcceptTcpClient(); var processor = new HttpRequestProcessor(s, HandleRequest); var thread = new Thread(processor.ProcessInput); thread.Start(); Thread.Sleep(1); } } catch (SocketException e) { // The server died due to a bug in mono if (e.Message.Contains("The socket has been shut down")) { Logger.Log("Mono shutdown the server. Please use .NET Core whenever it starts supporting your platform to avoid this.", LogLevel.Error); return(false); } if (e.SocketErrorCode == SocketError.Interrupted) { return(true); } throw; } return(true); }
public bool Execute(HttpRequestProcessor requestProcessor) { if (!_urlRegex.IsMatch(requestProcessor.HttpUrl)) { return(false); } var spl = requestProcessor.HttpUrl.Split(new [] { "/" }, StringSplitOptions.RemoveEmptyEntries); _callback.Invoke(requestProcessor, spl); return(true); }
private void HandleRequest(HttpRequestProcessor requestProcessor) { if (_handlers.Any(restfulUrlHandler => restfulUrlHandler.Execute(requestProcessor))) { if (!requestProcessor.ResponseWritten) { requestProcessor.WriteSuccess(); } return; } var url = requestProcessor.HttpUrl; if (string.IsNullOrWhiteSpace(url) || url == "/") { url = "/index.html"; } var path = Path.GetFullPath(_serverBaseDirectory + url); if (!path.StartsWith(_serverBaseDirectory)) { requestProcessor.WriteResponse("403 Forbidden", "Thou shall not pass!"); return; } string data; if (_filesCache.TryGetValue(path, out data)) { var ext = Path.GetExtension(path); var type = MimeTypes[ext]; requestProcessor.WriteSuccess(data, type); return; } if (_serverBaseDirectory != null && File.Exists(path)) { var ext = Path.GetExtension(path); var type = MimeTypes[ext]; var reader = new StreamReader(path); data = reader.ReadToEnd(); requestProcessor.WriteSuccess(data, type); reader.Close(); _filesCache[path] = data; } else { requestProcessor.WriteResponse("404 Not Found", "<iframe src=\"https://thebest404pageever.com/\" " + "style=\"position: absolute; width: 99%; height: 99%; top: 0; left: 0;\">" + "404, thou must find mordor before getting eagles.</iframe>", "text/html"); } }