package org.diretto.api.client.main.storage.base;
import org.apache.http.HttpException;
import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.AuthState;
import org.apache.http.auth.Credentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.protocol.ClientContext;
import org.apache.http.impl.auth.BasicScheme;
import org.apache.http.protocol.ExecutionContext;
import org.apache.http.protocol.HttpContext;
/**
* A {@code BasicAccessAuthenticationInterceptor} can be used to perform a
* <i>preemptive</i> {@code Basic Access Authentication}. Thus one request and
* one response can be saved. <br/><br/>
*
* <i>Important:</i> This method works only if the mandatory credentials, which
* are necessary for the authentication, have been set before.
*
* @author Tobias Schlecht
*/
public class BasicAccessAuthenticationInterceptor implements HttpRequestInterceptor
{
private static final BasicScheme BASIC_ACCESS_AUTHENTICATION_SCHEME = new BasicScheme();
@Override
public void process(HttpRequest httpRequest, HttpContext httpContext) throws HttpException
{
AuthState authState = (AuthState) httpContext.getAttribute(ClientContext.TARGET_AUTH_STATE);
if(authState.getAuthScheme() == null)
{
HttpHost httpHost = (HttpHost) httpContext.getAttribute(ExecutionContext.HTTP_TARGET_HOST);
CredentialsProvider credentialsProvider = (CredentialsProvider) httpContext.getAttribute(ClientContext.CREDS_PROVIDER);
Credentials credentials = credentialsProvider.getCredentials(new AuthScope(httpHost.getHostName(), httpHost.getPort()));
if(credentials == null)
{
throw new HttpException("No credentials for the preemptive Basic Access Authentication were found.");
}
authState.setAuthScheme(BASIC_ACCESS_AUTHENTICATION_SCHEME);
authState.setCredentials(credentials);
}
}
}