【发布时间】:2018-01-22 20:30:34
【问题描述】:
我想在一种情况下替换 Location 标头。我使用以下来启用重定向
client.prepareGet(request.getUrl())
.setFollowRedirect(true)
我所做的是扩展 AsyncCompletionHandler 类,然后我从那里@Override onHeadersReceived(),
@Override
public State onHeadersReceived(final HttpResponseHeaders headers) throws Exception {
String location = headers.getHeaders().get("Location").replace("itmss", "https"
);
DefaultHttpHeaders httpHeaders = new DefaultHttpHeaders();
httpHeaders.add(HEADER, location);
httpHeaders.add(headers.getHeaders());
return inner.onHeadersReceived(new HttpResponseHeaders(httpHeaders));
}
但是,我看到请求仍然使用itms 而不是https,这意味着Location 标头没有被替换。
目前的计划是实现一个在Redirect30xInterceptor.java(https://github.com/AsyncHttpClient/async-http-client/blob/dd459294434a408cff3c65c9f5c402b82d60aaa2/client/src/main/java/org/asynchttpclient/netty/handler/intercept/Redirect30xInterceptor.java)之前运行的拦截器,并改变url。
另外一个方案是对下面的代码做一个while循环,每当收到3XX,在下一个请求中设置一个新的url。
client.prepareGet(request.getUrl())
.addHeader("User-Agent", request.getUserAgent())
.setProxyServer(proxyServer)
.execute(new ResponseAsyncCompletionHandler(request))
.toCompletableFuture();
最终目的是将itms://替换为https://,所以下一个请求使用https而不是itms。
【问题讨论】:
标签: java asynchttpclient