package com.netifera.platform.net.http.service.auth; import java.io.IOException; import java.net.URI; import java.util.Iterator; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; import org.apache.http.message.BasicHttpRequest; import org.apache.http.nio.protocol.HttpRequestExecutionHandler; import org.apache.http.nio.reactor.SessionRequest; import org.apache.http.nio.reactor.SessionRequestCallback; import org.apache.http.protocol.HttpContext; import com.netifera.platform.net.http.service.AsynchronousHTTPClient; import com.netifera.platform.net.http.service.HTTP; import com.netifera.platform.net.services.auth.AuthenticationListener; import com.netifera.platform.net.services.auth.CredentialsVerifier; import com.netifera.platform.net.services.credentials.Credential; import com.netifera.platform.net.services.credentials.UsernameAndPassword; import com.netifera.platform.util.Base64; public class HttpBasicAuthenticationVerifier extends CredentialsVerifier { private final HTTP service; private final URI url; public HttpBasicAuthenticationVerifier(HTTP service, URI url) { this.service = service; this.url = url; } private class CredentialsTester implements HttpRequestExecutionHandler { public void initalizeContext(HttpContext context, Object arg) { // TODO Auto-generated method stub } public void finalizeContext(HttpContext context) { // TODO Auto-generated method stub } public HttpRequest submitRequest(HttpContext context) { Credential credential = nextCredentialOrNull(); // System.out.println("submitRequest "+credential); if (credential == null) return null; context.setAttribute("credential", credential); HttpRequest request = new BasicHttpRequest("GET", url.getRawPath()); // HttpRequest request = new BasicHttpRequest("GET", url.getRawPath()+"?"+url.getRawQuery()); request.addHeader("Host", url.getHost()); request.addHeader("Authorization", "Basic "+base64((UsernameAndPassword)credential)); // System.out.println(credential+" request: "+request.getRequestLine()); return request; } public void handleResponse(HttpResponse response, HttpContext context) throws IOException { Credential credential = (Credential) context.getAttribute("credential"); // System.out.println(credential+" response: "+response.getStatusLine()); if (response.getStatusLine().getStatusCode() == 401) { listener.authenticationFailed(credential); } else { listener.authenticationSucceeded(credential); } } } @Override public void tryCredentials(Iterator<Credential> credentials, AuthenticationListener listener) throws IOException, InterruptedException { this.credentials = credentials; this.listener = listener; AsynchronousHTTPClient client = service.createAsynchronousClient(new CredentialsTester()); client.connect(new SessionRequestCallback() { // XXX never return on error public void cancelled(SessionRequest arg0) { // TODO Auto-generated method stub } public void completed(SessionRequest arg0) { // TODO Auto-generated method stub } public void failed(SessionRequest arg0) { // TODO Auto-generated method stub } public void timeout(SessionRequest arg0) { // TODO Auto-generated method stub } }); } // helper method private String base64(UsernameAndPassword credential) { String userAndPassString = credential.getUsernameString()+":"+credential.getPasswordString(); return Base64.encodeBytes(userAndPassString.getBytes()); } }