首页 > 解决方案 > Java HTTP 代理:获取连接的主机名

问题描述

我正在制作一个小型本地 HTTP 代理,它应该是浏览器和网络服务器的中间人。在某种程度上,我正在做 Burp Suite 正在做的事情。

为了使 HTTP 流量通过程序,我将这些设置放入浏览器的网络设置中--> 使用代理 127.0.0.1 端口 8080

该程序能够与浏览器连接,并且

System.out.println

信息是这样打印的

CONNECT location.services.mozilla.com:443 HTTP/1.1
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:82.0) Gecko/20100101 Firefox/82.0
Proxy-Connection: keep-alive
Connection: keep-alive
Host: location.services.mozilla.com:443

所以我知道程序收到了正确的信息。

要连接到网络服务器,我使用上述信息中的主机名。

Socket webserverConnection = new Socket(this.hostname, this.port);//host is location.services.mozilla.com
                                                                  //port is 443

我解析主机的方式

int start = browserRequest.indexOf("Host: ") + 6;
            int end = browserRequest.indexOf(':', start) + 1;
            this.hostname = browserRequest.substring(start, end - 1);

但是有时我会收到此错误

java.net.UnknownHostException: detectportal.firefox.com
User-Agent
    at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:567)
    at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:333)
    at java.base/java.net.Socket.connect(Socket.java:648)
    at java.base/java.net.Socket.connect(Socket.java:597)
    at java.base/java.net.Socket.<init>(Socket.java:520)
    at java.base/java.net.Socket.<init>(Socket.java:294)
    at ConnectionHandling.run(ConnectionHandling.java:49)
    at java.base/java.lang.Thread.run(Thread.java:832)

如何正确获取主机名?

标签: javasocketsproxy

解决方案


推荐阅读