在Firefox中使用Java HTTP代理

时间:2014-03-01 22:05:06

标签: java sockets firefox proxy

我在Java中编写一个HTTP代理,它接受格式错误的HTTP请求,纠正它们,将它们转发到服务器,然后将服务器的响应转发回客户端。但是,我在测试它时遇到了很多麻烦。

我在Red Hat服务器上运行虚拟机上的代理(我有root权限),我正在收听并侦听端口12345.然后在我的机器上,在Firefox中我将转到Options> Connection设置>手动代理配置并输入虚拟机和端口12345的IP地址。

但是,当我在我的虚拟机上运行代理并尝试访问Firefox中的某个站点时,没有任何反应。这是我的代码:

package proxy;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

 public class WebProxy {

    public void run() {

            try {

                    toFromClient();
            }
            catch (IOException e) {
                    e.printStackTrace();
            }
    }

    public String requestNormalizer(String badRequest) {

            return badRequest.replace(badRequest.substring(0, badRequest.indexOf(" ")), badRequest.substring(0, badRequest.indexOf(" ")).toUpperCase());

    }

    public void toFromClient() throws IOException {

            ServerSocket welcome;
            Socket client;
            String request;
            String response;
            DataOutputStream outputToClient;
            BufferedReader inputFromClient;
            boolean listening = true;

            welcome = new ServerSocket(12345);

            while (listening) {

                    client = welcome.accept();


                    inputFromClient = new BufferedReader(new InputStreamReader(client.getInputStream()));

                    request = inputFromClient.readLine();

            //      request = requestNormalizer(request);
                    response = toFromServer(request);

                    outputToClient = new DataOutputStream(client.getOutputStream());

                    outputToClient.writeBytes(response);
            }
    }

    public String toFromServer(String request) throws UnknownHostException, IOException {

            Socket server;
            String response;
            DataOutputStream outputToServer;
            BufferedReader inputFromServer;

            if (!dnsQuery(request)[1].equals(""))
                    server = new Socket((InetAddress) dnsQuery(request)[0], (int) dnsQuery(request)[1]);
            else
                    server = new Socket((InetAddress) dnsQuery(request)[0], 80);  

            outputToServer = new DataOutputStream(server.getOutputStream());

            inputFromServer = new BufferedReader(new InputStreamReader(server.getInputStream()));

            outputToServer.writeBytes(request);

            response = inputFromServer.readLine();

            server.close();

            return response;
    }

    public Object[] dnsQuery(String request) throws UnknownHostException {

            Object[] addressPort = new Object[2];
            String hostname = request.substring(request.indexOf("host") + 6);
            hostname = hostname.substring(0, hostname.indexOf("\r"));

            if (hostname.contains(":")) {

                    hostname = hostname.substring(0, hostname.indexOf(":"));
                    addressPort[1] = hostname.substring(hostname.indexOf(":"));
            }
            else
                    addressPort[1] = "";

            addressPort[0] = InetAddress.getByName(hostname);

            return addressPort;
    }

    public static void main(String[] args) {

            WebProxy wp = new WebProxy();
            wp.run();
    }
}

我现在不担心修复HTTP请求,所以我在toFromClient()中注释了requestNormalizer()。

我已经确定(通过打印声明)我的代码永远不会超过“client = welcome.accept();”在toFromClient()方法和idles直到我停止它,所以我猜我的程序在尝试连接到Firefox中的网页时从未接收任何连接。我尝试过与端口12345不同的端口,我也能够通过使用Netcat监听该端口,然后在另一个控制台窗口中连接到该端口,成功建立到我的VM上的端口12345的连接,使用Netcat。此外,我无法从我自己的机器(我使用的是Firefox,而不是VM)远程登录到VM。

有谁知道问题可能是什么?它是代码,还是像防火墙等其他问题?请告诉我,我未能充分澄清某些内容,或者是否有人需要任何其他信息。

提前致谢!

1 个答案:

答案 0 :(得分:0)

您是否尝试使用同一台计算机上安装的链接连接到此代理?它可能  帮助您找出什么东西,阻止您的虚拟机和Firefox之间的通信。

您可以通过yum install links安装链接(或elinks)(抱歉,我现在附近没有Red Hat)。

如果您能够通过链接进行连接,请查看http://www.techotopia.com/index.php/Basic_RHEL_6_Firewall_Configuration