diff options
4 files changed, 76 insertions, 35 deletions
diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/AuthenticationProtocolHandler.java b/jetty-client/src/main/java/org/eclipse/jetty/client/AuthenticationProtocolHandler.java index d690013005..9d7c297774 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/AuthenticationProtocolHandler.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/AuthenticationProtocolHandler.java @@ -135,27 +135,36 @@ public abstract class AuthenticationProtocolHandler implements ProtocolHandler return; } - final Authentication.Result authnResult = authentication.authenticate(request, response, headerInfo, conversation); - if (LOG.isDebugEnabled()) - LOG.debug("Authentication result {}", authnResult); - if (authnResult == null) + try { - forwardSuccessComplete(request, response); - return; - } + final Authentication.Result authnResult = authentication.authenticate(request, response, headerInfo, conversation); + if (LOG.isDebugEnabled()) + LOG.debug("Authentication result {}", authnResult); + if (authnResult == null) + { + forwardSuccessComplete(request, response); + return; + } - conversation.setAttribute(AUTHENTICATION_ATTRIBUTE, true); + conversation.setAttribute(AUTHENTICATION_ATTRIBUTE, true); - Request newRequest = client.copyRequest(request, request.getURI()); - authnResult.apply(newRequest); - newRequest.onResponseSuccess(new Response.SuccessListener() - { - @Override - public void onSuccess(Response response) + Request newRequest = client.copyRequest(request, request.getURI()); + authnResult.apply(newRequest); + newRequest.onResponseSuccess(new Response.SuccessListener() { - client.getAuthenticationStore().addAuthenticationResult(authnResult); - } - }).send(null); + @Override + public void onSuccess(Response response) + { + client.getAuthenticationStore().addAuthenticationResult(authnResult); + } + }).send(null); + } + catch (Throwable x) + { + if (LOG.isDebugEnabled()) + LOG.debug("Authentication failed", x); + forwardFailureComplete(request, null, response, x); + } } private void forwardSuccessComplete(HttpRequest request, Response response) diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientAuthenticationTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientAuthenticationTest.java index aa897174e3..f14f0562ed 100644 --- a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientAuthenticationTest.java +++ b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientAuthenticationTest.java @@ -34,6 +34,8 @@ import org.eclipse.jetty.client.api.Authentication; import org.eclipse.jetty.client.api.AuthenticationStore; import org.eclipse.jetty.client.api.ContentResponse; import org.eclipse.jetty.client.api.Request; +import org.eclipse.jetty.client.api.Response; +import org.eclipse.jetty.client.api.Result; import org.eclipse.jetty.client.util.BasicAuthentication; import org.eclipse.jetty.client.util.DigestAuthentication; import org.eclipse.jetty.security.Authenticator; @@ -47,6 +49,7 @@ import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.AbstractHandler; import org.eclipse.jetty.toolchain.test.MavenTestingUtils; +import org.eclipse.jetty.util.Attributes; import org.eclipse.jetty.util.URIUtil; import org.eclipse.jetty.util.security.Constraint; import org.eclipse.jetty.util.ssl.SslContextFactory; @@ -320,4 +323,47 @@ public class HttpClientAuthenticationTest extends AbstractHttpClientServerTest Assert.assertNotNull(response); Assert.assertEquals(401, response.getStatus()); } + + @Test + public void test_Authentication_ThrowsException() throws Exception + { + startBasic(new EmptyServerHandler()); + + // Request without Authentication would cause a 401, + // but the client will throw an exception trying to + // send the credentials to the server. + final String cause = "thrown_explicitly_by_test"; + client.getAuthenticationStore().addAuthentication(new Authentication() + { + @Override + public boolean matches(String type, URI uri, String realm) + { + return true; + } + + @Override + public Result authenticate(Request request, ContentResponse response, HeaderInfo headerInfo, Attributes context) + { + throw new RuntimeException(cause); + } + }); + + final CountDownLatch latch = new CountDownLatch(1); + client.newRequest("localhost", connector.getLocalPort()) + .scheme(scheme) + .path("/secure") + .timeout(5, TimeUnit.SECONDS) + .send(new Response.CompleteListener() + { + @Override + public void onComplete(Result result) + { + Assert.assertTrue(result.isFailed()); + Assert.assertEquals(cause, result.getFailure().getMessage()); + latch.countDown(); + } + }); + + Assert.assertTrue(latch.await(5, TimeUnit.SECONDS)); + } } diff --git a/jetty-osgi/jetty-osgi-httpservice/contexts/httpservice.xml b/jetty-osgi/jetty-osgi-httpservice/contexts/httpservice.xml index e1044c88bc..98c00314b9 100644 --- a/jetty-osgi/jetty-osgi-httpservice/contexts/httpservice.xml +++ b/jetty-osgi/jetty-osgi-httpservice/contexts/httpservice.xml @@ -1,31 +1,17 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd"> -<!-- - Copyright (c) 2009-2011 Intalio, Inc. - - All rights reserved. This program and the accompanying materials - are made available under the terms of the Eclipse Public License v1.0 - and Apache License v2.0 which accompanies this distribution. - The Eclipse Public License is available at - http://www.eclipse.org/legal/epl-v10.html - The Apache License v2.0 is available at - http://www.opensource.org/licenses/apache2.0.php - You may elect to redistribute this code under either of these licenses. - Contributors: - Hugues Malphettes - initial API and implementation ---> <Configure class="org.eclipse.jetty.servlet.ServletContextHandler"> -<!-- this configures the servlet session manager --> + <!-- this configures the servlet session manager --> <Set name="SessionHandler"> <New class="org.eclipse.jetty.server.session.SessionHandler"/> </Set> -<!-- this servlet provides the OSGi HTTP Service once it is initialized --> + <!-- this servlet provides the OSGi HTTP Service once it is initialized --> <Call name="addServlet"> <Arg>org.eclipse.equinox.http.servlet.HttpServiceServlet</Arg> <Arg>/*</Arg> <Set name="InitOrder">1</Set> </Call> -<!-- custom pluggable error handler --> + <!-- custom pluggable error handler --> <Set name="ErrorHandler"> <New class="org.eclipse.jetty.osgi.httpservice.HttpServiceErrorPageErrorHandler"/> </Set> @@ -330,7 +330,7 @@ <Bundle-Vendor>Eclipse Jetty Project</Bundle-Vendor> <Bundle-Classpath>.</Bundle-Classpath> <Export-Package>${bundle-symbolic-name}.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"</Export-Package> - <Bundle-Copyright>Copyright (c) 2008-2015 Mort Bay Consulting Pty. Ltd.</Bundle-Copyright> + <Bundle-Copyright>Copyright (c) 2008-2016 Mort Bay Consulting Pty. Ltd.</Bundle-Copyright> <Import-Package>javax.servlet*;version="[2.6.0,3.2)",javax.transaction*;version="[1.1,1.3)",org.eclipse.jetty*;version="[$(version;===;${parsedVersion.osgiVersion}),$(version;==+;${parsedVersion.osgiVersion}))",*</Import-Package> </instructions> </configuration> |