java - 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)
如何正确获取主机名?
解决方案
推荐阅读
- vba - 使用 vba 登录表单
- php - 扩展一个类以使用子私有变量
- firebase - Unity 中的 Firebase 消息传递不会更改内置 android 清单中的包名称
- reactjs - 哈希历史不能 PUSH 相同的路径;当我更改状态而不是路径名时,不会将新条目添加到历史堆栈中
- javascript - 启用收件箱消息推送的解决方案
- javascript - 如何修复我用 javascript 制作的滑块
- java - Spinner 下拉列表未在 DialogFragment 上打开
- javascript - Timepicker JS在加载后更改选项值
- mysql - 如何将带有键值对的元表作为父行加入
- node.js - 如何通过 API 设置用户状态的开始时间?