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);
        }
Example #2
0
        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);
        }