对于 Akka HTTP 的 HTTPS 请求,把客户端传输配置为通过正向代理建立 CONNECT:

import java.net.InetSocketAddress
import akka.http.scaladsl.{ClientTransport, Http}
import akka.http.scaladsl.model.HttpRequest
import akka.http.scaladsl.settings.ConnectionPoolSettings

val transport = ClientTransport.httpsProxy(
  InetSocketAddress.createUnresolved("proxy.example", 8080))

val settings = ConnectionPoolSettings(system)
  .withConnectionSettings(_.withTransport(transport))

val response = Http().singleRequest(
  HttpRequest(uri = "https://example.com/"),
  settings = settings)

应用把已有的 ActorSystem 作为 system 传入,并保留通常的流与响应实体生命周期。请按需消费或丢弃返回的响应实体,以便连接能够被释放。

这里的 httpsProxy 指的是通过 HTTP CONNECT 代理建立到 HTTPS 目标端的连接,而不是要求与代理监听端口本身建立 TLS 会话。

把定制后的设置传给实际发送流量的请求或连接池。在使用另一套连接池配置的调用旁边新建设置,并不会改变该调用。

Akka 为 HTTPS 请求记录了这种传输方式。目标端应保持为真实的 HTTPS URI。HTTP 代理列表中的 HTTP 端点在其允许所需 CONNECT 目标时可以作为该传输的候选。服务端的 bindFlow 转发示例会创建另一个 HTTP 服务,回答的是另一个构建问题。

相关文章