【发布时间】:2018-02-13 00:15:42
【问题描述】:
问题:
有没有办法通过 Oracle HTTPServer class 支持 CONNECT HTTP 请求?
注意:如果不想处理这个,Jetty 好像没有 他们的 HTTPServer 类的这个问题(即使不使用他们的 ProxyHTTP 实现ConnectHandler)。然而灰熊似乎 与默认 Java 实现有相同的问题,而不是 令人惊讶,因为它们都是由 Oracle 制造的。
解释和难度:
注意:我包含此内容是为了详细解释我认为是什么问题。
我最近一直在尝试为 Firefox 上的安全 (HTTPS) 连接创建 HTTP 代理。完成此操作的方式是CONNECT method (IETF RFC 2817)。来自 Firefox 的 CONNECT 请求示例如下(在请求 Google 主页时发生)。
CONNECT www.google.com:443 HTTP/1.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:58.0) Gecko/20100101 Firefox/58.0
Proxy-Connection: keep-alive
Connection: keep-alive
Host: www.google.com:443
这与普通的 GET 请求不同。
GET /index HTTP/1.1
Host: 127.0.0.1:8000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:58.0) Gecko/20100101 Firefox/58.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
显着的区别是所谓的“请求目标”(有关详细信息,请参阅此Mozilla article)。具体来说,正常的 GET 请求是“绝对路径”,而 CONNECT 请求目标是“权限形式”。
使用StackOverflow answer (simple Java HTTPServer implementation)中的演示服务器,我们可以看到注册HTTPHandler的方式是server.createContext("/test", new MyHandler()),根据Oracle documentation必须以'/开头'。然而,因为“授权形式”在开始时不包含“/”,所以永远不会触发句柄
注意:这仍然是一些猜测,因为 Oracle 的代码已关闭 源,但它通过发送相同的 TCP 请求到 服务器具有与上述相同的 CONNECT 请求,但有一次使用 前导“/”(所以“/www.google.com”而不是“www.google.com”)。和 触发处理程序的前导“/”。
说了这么多,我的问题是这样的,
有没有办法解决这个问题,同时仍然使用 Java 的 Oracle 版本中包含的库?
注意:除了从头开始编写一个新的 HTTP 服务器,或者使用 另一个图书馆。在我的测试中,Jetty 确实触发了 HTTPHandler。 Grizzly 没有(而且在我看来,存在一些代码质量问题)。
【问题讨论】:
-
@HuguesM。谢谢,我确实认为它是封闭源代码。我的错。
标签: java http http-proxy