/** * React to a failed authorization response by looking up new credentials. * * @return true if credentials have been added to successorRequestHeaders * and another request should be attempted. */ public static boolean processAuthHeader(OkAuthenticator authenticator, int responseCode, RawHeaders responseHeaders, RawHeaders successorRequestHeaders, Proxy proxy, URL url) throws IOException { String responseField; String requestField; if (responseCode == HTTP_UNAUTHORIZED) { responseField = "WWW-Authenticate"; requestField = "Authorization"; } else if (responseCode == HTTP_PROXY_AUTH) { responseField = "Proxy-Authenticate"; requestField = "Proxy-Authorization"; } else { throw new IllegalArgumentException(); // TODO: ProtocolException? } List<Challenge> challenges = parseChallenges(responseHeaders, responseField); if (challenges.isEmpty()) { return false; // Could not find a challenge so end the request cycle. } Credential credential = responseHeaders.getResponseCode() == HTTP_PROXY_AUTH ? authenticator.authenticateProxy(proxy, url, challenges) : authenticator.authenticate(proxy, url, challenges); if (credential == null) { return false; // Could not satisfy the challenge so end the request cycle. } // Add authorization credentials, bypassing the already-connected check. successorRequestHeaders.set(requestField, credential.getHeaderValue()); return true; }
/** * React to a failed authorization response by looking up new credentials. * Returns a request for a subsequent attempt, or null if no further attempts * should be made. */ public static Request processAuthHeader( OkAuthenticator authenticator, Response response, Proxy proxy) throws IOException { String responseField; String requestField; if (response.code() == HTTP_UNAUTHORIZED) { responseField = "WWW-Authenticate"; requestField = "Authorization"; } else if (response.code() == HTTP_PROXY_AUTH) { responseField = "Proxy-Authenticate"; requestField = "Proxy-Authorization"; } else { throw new IllegalArgumentException(); // TODO: ProtocolException? } List<Challenge> challenges = parseChallenges(response.headers(), responseField); if (challenges.isEmpty()) return null; // Could not find a challenge so end the request cycle. Request request = response.request(); Credential credential = response.code() == HTTP_PROXY_AUTH ? authenticator.authenticateProxy(proxy, request.url(), challenges) : authenticator.authenticate(proxy, request.url(), challenges); if (credential == null) return null; // Couldn't satisfy the challenge so end the request cycle. // Add authorization credentials, bypassing the already-connected check. return request.newBuilder().header(requestField, credential.getHeaderValue()).build(); }