经过代理挑战后重试的上传需要再次读取请求体。对于 Jersey 2 的 Apache 连接器,在用于构建该客户端的配置中选择缓冲式实体处理:

ClientConfig config = new ClientConfig();
config.connectorProvider(new ApacheConnectorProvider());
config.property(ClientProperties.PROXY_URI,
                "http://proxy.example.net:8080");
config.property(ClientProperties.REQUEST_ENTITY_PROCESSING,
                RequestEntityProcessing.BUFFERED);

通过生成的客户端执行上传。这些类型来自 Jersey client 与 Apache-connector 包;设置一个未被使用的配置不会影响请求。

连接器会把缓冲后的实体包装进 Apache 的 BufferedHttpEntity。其非缓冲的流式实体不可重复。缓冲为认证流程提供了可以重发的字节,而不必重新读取已被消费的生产者。

这并不保证认证在收到一次 407 后就结束。某些方案本来就需要多轮交换,因此在把再一次挑战当作状态丢失之前,请检查整个协商过程。

把请求体大小控制在内存预算之内。大型流式上传需要适合该负载的重放策略;为每个请求开启缓冲,可能把协商失败换成内存耗尽。

相关文章