RequestProxyAuthentication implements HttpRequestInterceptor { @SuppressWarnings("deprecation") public void process(final HttpRequest request, final HttpContext context) throws HttpException, IOException { if (request == null) { throw new IllegalArgumentException("HTTP request may not be null"); } if (context == null) { throw new IllegalArgumentException("HTTP context may not be null"); } if (request.containsHeader(AUTH.PROXY_AUTH_RESP)) { return; } HttpRoutedConnection conn = (HttpRoutedConnection) context.getAttribute( ExecutionContext.HTTP_CONNECTION); if (conn == null) { this.log.debug("HTTP connection not set in the context"); return; } HttpRoute route = conn.getRoute(); if (route.isTunnelled()) { return; } AuthState authState = (AuthState) context.getAttribute( ClientContext.PROXY_AUTH_STATE); if (authState == null) { this.log.debug("Proxy auth state not set in the context"); return; } AuthScheme authScheme = authState.getAuthScheme(); if (authScheme == null) { return; } Credentials creds = authState.getCredentials(); if (creds == null) { this.log.debug("User credentials not available"); return; } if (authState.getAuthScope() != null || !authScheme.isConnectionBased()) { try { Header header; if (authScheme instanceof ContextAwareAuthScheme) { header = ((ContextAwareAuthScheme) authScheme).authenticate( creds, request, context); } else { header = authScheme.authenticate(creds, request); } request.addHeader(header); } catch (AuthenticationException ex) { if (this.log.isErrorEnabled()) { this.log.error("Proxy authentication error: " + ex.getMessage()); } } } } RequestProxyAuthentication(); @SuppressWarnings("deprecation") void process(final HttpRequest request, final HttpContext context);  }
@Test(expected=IllegalArgumentException.class) public void testRequestParameterCheck() throws Exception { HttpContext context = new BasicHttpContext(); HttpRequestInterceptor interceptor = new RequestProxyAuthentication(); interceptor.process(null, context); }
@Test(expected=IllegalArgumentException.class) public void testContextParameterCheck() throws Exception { HttpRequest request = new BasicHttpRequest("GET", "/"); HttpRequestInterceptor interceptor = new RequestProxyAuthentication(); interceptor.process(request, null); }
@Test public void testProxyAuthOverPlainConnection() throws Exception { HttpRequest request = new BasicHttpRequest("GET", "/"); HttpContext context = new BasicHttpContext(); HttpHost target = new HttpHost("localhost", 443, "https"); HttpHost proxy = new HttpHost("localhost", 8080); HttpRoute route = new HttpRoute(target, null, proxy, false, TunnelType.PLAIN, LayerType.PLAIN); HttpRoutedConnection conn = Mockito.mock(HttpRoutedConnection.class); Mockito.when(conn.getRoute()).thenReturn(route); BasicScheme authscheme = new BasicScheme(); Credentials creds = new UsernamePasswordCredentials("user", "secret"); AuthScope authscope = new AuthScope("localhost", 8080, "auth-realm", "http"); BasicHeader challenge = new BasicHeader(AUTH.PROXY_AUTH, "BASIC realm=auth-realm"); authscheme.processChallenge(challenge); AuthState authstate = new AuthState(); authstate.setAuthScheme(authscheme); authstate.setAuthScope(authscope); authstate.setCredentials(creds); context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn); context.setAttribute(ClientContext.PROXY_AUTH_STATE, authstate); HttpRequestInterceptor interceptor = new RequestProxyAuthentication(); interceptor.process(request, context); Header header = request.getFirstHeader(AUTH.PROXY_AUTH_RESP); Assert.assertNotNull(header); Assert.assertEquals("Basic dXNlcjpzZWNyZXQ=", header.getValue()); }
@Test public void testProxyAuthOverTunneledConnection() throws Exception { HttpRequest request = new BasicHttpRequest("GET", "/"); HttpContext context = new BasicHttpContext(); HttpHost target = new HttpHost("localhost", 443, "https"); HttpHost proxy = new HttpHost("localhost", 8080); HttpRoute route = new HttpRoute(target, null, proxy, true, TunnelType.TUNNELLED, LayerType.LAYERED); HttpRoutedConnection conn = Mockito.mock(HttpRoutedConnection.class); Mockito.when(conn.getRoute()).thenReturn(route); BasicScheme authscheme = new BasicScheme(); Credentials creds = new UsernamePasswordCredentials("user", "secret"); AuthScope authscope = new AuthScope("localhost", 8080, "auth-realm", "http"); BasicHeader challenge = new BasicHeader(AUTH.PROXY_AUTH, "BASIC realm=auth-realm"); authscheme.processChallenge(challenge); AuthState authstate = new AuthState(); authstate.setAuthScheme(authscheme); authstate.setAuthScope(authscope); authstate.setCredentials(creds); context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn); context.setAttribute(ClientContext.PROXY_AUTH_STATE, authstate); HttpRequestInterceptor interceptor = new RequestProxyAuthentication(); interceptor.process(request, context); Header header = request.getFirstHeader(AUTH.PROXY_AUTH_RESP); Assert.assertNull(header); }
@Test public void testPreserveAuthHeader() throws Exception { HttpRequest request = new BasicHttpRequest("GET", "/"); request.addHeader(AUTH.PROXY_AUTH_RESP, "Basic c3R1ZmY6c3R1ZmY="); HttpContext context = new BasicHttpContext(); HttpHost target = new HttpHost("localhost", 443, "https"); HttpHost proxy = new HttpHost("localhost", 8080); HttpRoute route = new HttpRoute(target, null, proxy, true, TunnelType.TUNNELLED, LayerType.LAYERED); HttpRoutedConnection conn = Mockito.mock(HttpRoutedConnection.class); Mockito.when(conn.getRoute()).thenReturn(route); BasicScheme authscheme = new BasicScheme(); Credentials creds = new UsernamePasswordCredentials("user", "secret"); AuthScope authscope = new AuthScope("localhost", 8080, "auth-realm", "http"); BasicHeader challenge = new BasicHeader(AUTH.PROXY_AUTH, "BASIC realm=auth-realm"); authscheme.processChallenge(challenge); AuthState authstate = new AuthState(); authstate.setAuthScheme(authscheme); authstate.setAuthScope(authscope); authstate.setCredentials(creds); context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn); context.setAttribute(ClientContext.PROXY_AUTH_STATE, authstate); HttpRequestInterceptor interceptor = new RequestProxyAuthentication(); interceptor.process(request, context); Header header = request.getFirstHeader(AUTH.PROXY_AUTH_RESP); Assert.assertNotNull(header); Assert.assertEquals("Basic c3R1ZmY6c3R1ZmY=", header.getValue()); }
@Test public void testAuthStateNotSet() throws Exception { HttpRequest request = new BasicHttpRequest("GET", "/"); HttpContext context = new BasicHttpContext(); HttpHost target = new HttpHost("localhost", 80, "http"); HttpHost proxy = new HttpHost("localhost", 8080); HttpRoute route = new HttpRoute(target, null, proxy, false, TunnelType.PLAIN, LayerType.PLAIN); HttpRoutedConnection conn = Mockito.mock(HttpRoutedConnection.class); Mockito.when(conn.getRoute()).thenReturn(route); context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn); context.setAttribute(ClientContext.PROXY_AUTH_STATE, null); HttpRequestInterceptor interceptor = new RequestProxyAuthentication(); interceptor.process(request, context); Header header = request.getFirstHeader(AUTH.PROXY_AUTH_RESP); Assert.assertNull(header); }
@Test public void testAuthSchemeNotSet() throws Exception { HttpRequest request = new BasicHttpRequest("GET", "/"); HttpContext context = new BasicHttpContext(); HttpHost target = new HttpHost("localhost", 80, "http"); HttpHost proxy = new HttpHost("localhost", 8080); HttpRoute route = new HttpRoute(target, null, proxy, false, TunnelType.PLAIN, LayerType.PLAIN); HttpRoutedConnection conn = Mockito.mock(HttpRoutedConnection.class); Mockito.when(conn.getRoute()).thenReturn(route); AuthState authstate = new AuthState(); context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn); context.setAttribute(ClientContext.PROXY_AUTH_STATE, authstate); HttpRequestInterceptor interceptor = new RequestProxyAuthentication(); interceptor.process(request, context); Header header = request.getFirstHeader(AUTH.PROXY_AUTH_RESP); Assert.assertNull(header); }
@Test public void testAuthCredentialsNotSet() throws Exception { HttpRequest request = new BasicHttpRequest("GET", "/"); HttpContext context = new BasicHttpContext(); HttpHost target = new HttpHost("localhost", 80, "http"); HttpHost proxy = new HttpHost("localhost", 8080); HttpRoute route = new HttpRoute(target, null, proxy, false, TunnelType.PLAIN, LayerType.PLAIN); HttpRoutedConnection conn = Mockito.mock(HttpRoutedConnection.class); Mockito.when(conn.getRoute()).thenReturn(route); AuthState authstate = new AuthState(); BasicScheme authscheme = new BasicScheme(); BasicHeader challenge = new BasicHeader(AUTH.PROXY_AUTH, "BASIC realm=auth-realm"); authscheme.processChallenge(challenge); authstate.setAuthScheme(authscheme); context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn); context.setAttribute(ClientContext.PROXY_AUTH_STATE, authstate); HttpRequestInterceptor interceptor = new RequestProxyAuthentication(); interceptor.process(request, context); Header header = request.getFirstHeader(AUTH.PROXY_AUTH_RESP); Assert.assertNull(header); }
@Test public void testConnectionBasedAuthOnlyIfChallenged() throws Exception { HttpRequest request = new BasicHttpRequest("GET", "/"); HttpContext context = new BasicHttpContext(); HttpHost target = new HttpHost("localhost", 80, "http"); HttpHost proxy = new HttpHost("localhost", 8080); HttpRoute route = new HttpRoute(target, null, proxy, false, TunnelType.PLAIN, LayerType.PLAIN); HttpRoutedConnection conn = Mockito.mock(HttpRoutedConnection.class); Mockito.when(conn.getRoute()).thenReturn(route); AuthState authstate = new AuthState(); BasicScheme authscheme = new BasicScheme() { @Override public boolean isConnectionBased() { return true; } }; BasicHeader challenge = new BasicHeader(AUTH.PROXY_AUTH, "BASIC realm=auth-realm"); authscheme.processChallenge(challenge); Credentials creds = new UsernamePasswordCredentials("user", "secret"); authstate.setAuthScheme(authscheme); authstate.setCredentials(creds); authstate.setAuthScope(null); context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn); context.setAttribute(ClientContext.PROXY_AUTH_STATE, authstate); HttpRequestInterceptor interceptor = new RequestProxyAuthentication(); interceptor.process(request, context); Header header = request.getFirstHeader(AUTH.PROXY_AUTH_RESP); Assert.assertNull(header); }