in client/src/main/java/org/apache/ahc/HttpIoHandler.java [101:169]
public void messageReceived(IoSession ioSession, Object object) throws Exception {
HttpResponseMessage response = (HttpResponseMessage) object;
HttpRequestMessage request = (HttpRequestMessage) ioSession.getAttribute(CURRENT_REQUEST);
AsyncHttpClient client = (AsyncHttpClient) ioSession.getAttachment();
//Check if we are to handle redirects
if ((response.getStatusCode() == 301
|| response.getStatusCode() == 302
|| response.getStatusCode() == 307)
&& request.isFollowRedirects())
{
// notify any interesting parties that this is starting
client.notifyMonitoringListeners(MonitoringEvent.REQUEST_REDIRECTED, request);
//Change the request url to the redirect
request.setUrl(new URL(response.getLocation()));
// if we're redirected via 30x, the request method should be reset to GET
if (HttpMethod.GET != request.getRequestMethod()) {
request.setRequestMethod(HttpMethod.GET);
}
// we also need to clear out the parameters
request.clearAllParameters();
//Send the redirect
client.sendRequest(request);
poolSession(ioSession);
return;
}
//Check if we have authentication
if (response.getChallenges().size() > 0) {
// notify any interesting parties that this is starting
client.notifyMonitoringListeners(MonitoringEvent.REQUEST_CHALLENGED, request);
for (NameValuePair nvp : response.getChallenges()) {
AuthState state = request.getAuthState();
if (state == null) {
String id = AuthChallengeParser.extractScheme(nvp.getValue());
AuthScheme authScheme = AuthPolicy.getAuthScheme(id);
state = new AuthState();
state.setAuthScheme(authScheme);
authScheme.processChallenge(nvp.getValue());
request.setAuthState(state);
}
}
//Authenticate
int authCount = request.getAuthCount() + 1;
if (authCount <= 3) {
poolSession(ioSession);
request.setAuthCount(authCount);
client.sendRequest(request);
return;
}
}
// notify any interesting parties that this is starting
client.notifyMonitoringListeners(MonitoringEvent.REQUEST_COMPLETED, request);
// complete the future which will also fire the callback
ResponseFuture result = request.getResponseFuture();
result.set(response);
poolSession(ioSession);
}