我的服务就像代理一样,您可以通过它获取网页。例如通过telnet
GET http://example.com HTTP/1.1
Host: example.com
但如果我想下载https页面,我应该执行以下操作
GET https://example.com HTTP/1.1
Host: example.com
Https-Header: true
我想使用apache http client为这项服务编写scala客户端,使用像代理主机这样的服务。
private val DefaultProxy = new HttpHost("service host", port)
private val DefaultClient =
HttpClientBuilder.create().
setProxy(DefaultProxy).
build()
我可以成功下载http页面,但是当我尝试下载https页面时,apache客户端向代理发出CONNECT请求,并且它响应有错误,导致服务只能在GET请求下运行。 如何让apache客户端使用与http一样的https页面,这意味着向代理发送GET请求,而不是CONNECT?
答案 0 :(得分:1)
要以与使用telnet的http网页相同的方式下载https网页,您需要先建立ssl / tls连接:
openssl s_client -connect www.somesite:443
[观看ssl证书详情滚动]
GET /index.html HTTP / 1.1
主持人:www.somesite
来自https://www.bearfruit.org/2008/04/17/telnet-for-testing-ssl-https-websites/
的示例对于scala,也许可以帮助您:https://github.com/scalaj/scalaj-http
HTTPS是基于SSL / TLS的HTTP,因此您需要建立到网站的SSL / TLS安全隧道,然后您可以发送您的HTTP请求。
答案 1 :(得分:0)
我找到了解决方案。
我编写自定义HttpRoutePlanner,它始终提供不安全的路由,然后Apache客户端使用https链接,如http链接,有一个HttpRoutePlanner代码
private def routePlanner(proxy: HttpHost) = new HttpRoutePlanner() {
def determineRoute(target: HttpHost ,
request: HttpRequest,
context: HttpContext) = {
new HttpRoute(target, null, proxy, false)
}
}