public static bool TryParse(string request, out HTTPReqArgs e) { bool result = false; e = new HTTPReqArgs(); if (request != null) { string[] args = request.Split(' '); if (args.Length >= 2) { if (Enum.TryParse(args[0], out HTTPRequestType type)) { string host = GetHost(request); int port = GetPort(request); if (!string.IsNullOrEmpty(host) && port != 0) { e.HTTP_Request_Type = type; e.Host = host; e.Port = port; result = true; } } } } return(result); }
public static Tunnel Handle( string firstMsg, System.Net.Sockets.Socket socket2Client) { Tunnel result = null; if (firstMsg != null && socket2Client != null) { if (HTTPReqArgs.TryParse(firstMsg, out HTTPReqArgs e0)) { IPEndPoint reqEP = HTTPReqArgs.GetIPEndPoint(e0); EagleTunnelArgs e1 = new EagleTunnelArgs(); e1.EndPoint = reqEP; Tunnel tunnel = EagleTunnelSender.Handle( EagleTunnelHandler.EagleTunnelRequestType.TCP, e1); if (tunnel != null) { tunnel.SocketL = socket2Client; bool done; if (e0.HTTP_Request_Type == HTTPRequestType.CONNECT) { // HTTPS: reply web client; string re443 = "HTTP/1.1 200 Connection Established\r\n\r\n"; done = tunnel.WriteL(re443); } else { // HTTP: relay new request to web server string newReq = HTTPReqArgs.CreateNewRequest(firstMsg); done = tunnel.WriteR(newReq); } if (done) { result = tunnel; } else { tunnel.Close(); } } } } return(result); }
// public static string CreateNewRequest (string oldRequest) { // string newReq = ""; // string[] lines = oldRequest.Replace ("\r\n", "\n").Split ('\n'); // string[] args = lines[0].Split (' '); // if (args.Length >= 2) { // string des = args[1]; // Uri uri = new Uri (des); // if (uri.HostNameType != UriHostNameType.Unknown) { // string line = args[0]; // line += ' ' + uri.AbsolutePath; // newReq = line; // if (args.Length >= 3) { // newReq += ' ' + args[2]; // for (int i = 1; i < lines.Length; ++i) { // line = lines[i]; // newReq += "\r\n" + line; // } // } // } // } // return newReq; // } public static IPEndPoint GetIPEndPoint(HTTPReqArgs e0) { IPEndPoint result = null; if (e0 != null) { if (e0.Host != null & e0.Port != 0) { // resolv ip of domain name by EagleTunnel Sender EagleTunnelArgs e1 = new EagleTunnelArgs(); e1.Domain = e0.Host; EagleTunnelSender.Handle( EagleTunnelHandler.EagleTunnelRequestType.DNS, e1); if (e1.IP != null) { // resolv successfully result = new IPEndPoint(e1.IP, e0.Port); } } } return(result); }
public static bool Handle(string firstMsg, Tunnel tunnel) { bool result = false; if (firstMsg != null && tunnel != null) { if (HTTPReqArgs.TryParse(firstMsg, out HTTPReqArgs e0)) { IPEndPoint reqEP = HTTPReqArgs.GetIPEndPoint(e0); EagleTunnelArgs e1 = new EagleTunnelArgs(); e1.EndPoint = reqEP; e1.tunnel = tunnel; if (EagleTunnelSender.Handle( EagleTunnelHandler.EagleTunnelRequestType.TCP, e1)) { if (Conf.LocalUser != null) { Conf.LocalUser.AddTunnel(tunnel); } if (e0.HTTP_Request_Type == HTTPRequestType.CONNECT) { // HTTPS: reply web client; string re443 = "HTTP/1.1 200 Connection Established\r\n\r\n"; result = tunnel.WriteL(re443); } else { // HTTP: relay new request to web server string newReq = HTTPReqArgs.CreateNewRequest(firstMsg); result = tunnel.WriteR(newReq); } } } } return(result); }