From 4096a39651fbff276bce539fa47a4769db03f87d Mon Sep 17 00:00:00 2001 From: Oleg Kalnichevski Date: Fri, 11 Dec 2009 23:34:23 +0000 Subject: [PATCH] HTTPCLIENT-901: support for execution context aware auth schemes git-svn-id: https://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk@889860 13f79535-47bb-0310-9956-ffa450edef68 --- .../http/auth/ContextAwareAuthScheme.java | 60 +++++++++++++++++++ .../protocol/RequestProxyAuthentication.java | 11 +++- .../protocol/RequestTargetAuthentication.java | 11 +++- 3 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 httpclient/src/main/java/org/apache/http/auth/ContextAwareAuthScheme.java diff --git a/httpclient/src/main/java/org/apache/http/auth/ContextAwareAuthScheme.java b/httpclient/src/main/java/org/apache/http/auth/ContextAwareAuthScheme.java new file mode 100644 index 000000000..99fce5292 --- /dev/null +++ b/httpclient/src/main/java/org/apache/http/auth/ContextAwareAuthScheme.java @@ -0,0 +1,60 @@ +/* + * ==================================================================== + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + * + */ + +package org.apache.http.auth; + +import org.apache.http.Header; +import org.apache.http.HttpRequest; +import org.apache.http.protocol.HttpContext; + +/** + * This interface represents an extended authentication scheme + * that requires access to {@link HttpContext} in order to + * generate an authorization string. + * + * @since 4.1 + */ + +public interface ContextAwareAuthScheme extends AuthScheme { + + /** + * Produces an authorization string for the given set of + * {@link Credentials}. + * + * @param credentials The set of credentials to be used for athentication + * @param request The request being authenticated + * @param context HTTP context + * @throws AuthenticationException if authorization string cannot + * be generated due to an authentication failure + * + * @return the authorization string + */ + Header authenticate( + Credentials credentials, + HttpRequest request, + HttpContext context) throws AuthenticationException; + +} diff --git a/httpclient/src/main/java/org/apache/http/client/protocol/RequestProxyAuthentication.java b/httpclient/src/main/java/org/apache/http/client/protocol/RequestProxyAuthentication.java index 5e55a0617..3646e2cb8 100644 --- a/httpclient/src/main/java/org/apache/http/client/protocol/RequestProxyAuthentication.java +++ b/httpclient/src/main/java/org/apache/http/client/protocol/RequestProxyAuthentication.java @@ -33,6 +33,7 @@ import org.apache.http.annotation.Immutable; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.http.Header; import org.apache.http.HttpException; import org.apache.http.HttpRequest; import org.apache.http.HttpRequestInterceptor; @@ -40,6 +41,7 @@ import org.apache.http.auth.AUTH; import org.apache.http.auth.AuthScheme; import org.apache.http.auth.AuthState; import org.apache.http.auth.AuthenticationException; +import org.apache.http.auth.ContextAwareAuthScheme; import org.apache.http.auth.Credentials; import org.apache.http.protocol.HttpContext; @@ -90,7 +92,14 @@ public class RequestProxyAuthentication implements HttpRequestInterceptor { } if (authState.getAuthScope() != null || !authScheme.isConnectionBased()) { try { - request.addHeader(authScheme.authenticate(creds, request)); + 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()); diff --git a/httpclient/src/main/java/org/apache/http/client/protocol/RequestTargetAuthentication.java b/httpclient/src/main/java/org/apache/http/client/protocol/RequestTargetAuthentication.java index cf0a50e96..548909ed6 100644 --- a/httpclient/src/main/java/org/apache/http/client/protocol/RequestTargetAuthentication.java +++ b/httpclient/src/main/java/org/apache/http/client/protocol/RequestTargetAuthentication.java @@ -33,6 +33,7 @@ import org.apache.http.annotation.Immutable; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.http.Header; import org.apache.http.HttpException; import org.apache.http.HttpRequest; import org.apache.http.HttpRequestInterceptor; @@ -40,6 +41,7 @@ import org.apache.http.auth.AUTH; import org.apache.http.auth.AuthScheme; import org.apache.http.auth.AuthState; import org.apache.http.auth.AuthenticationException; +import org.apache.http.auth.ContextAwareAuthScheme; import org.apache.http.auth.Credentials; import org.apache.http.protocol.HttpContext; @@ -96,7 +98,14 @@ public class RequestTargetAuthentication implements HttpRequestInterceptor { if (authState.getAuthScope() != null || !authScheme.isConnectionBased()) { try { - request.addHeader(authScheme.authenticate(creds, request)); + 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("Authentication error: " + ex.getMessage());