HTTPCLIENT-951: Test cases
Contributed by Thierry Guérin <thi.guerin at laposte.net> git-svn-id: https://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk@953890 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
ade1571f00
commit
555237285c
|
@ -41,16 +41,20 @@ import org.apache.http.client.CredentialsProvider;
|
||||||
import org.apache.http.client.NonRepeatableRequestException;
|
import org.apache.http.client.NonRepeatableRequestException;
|
||||||
import org.apache.http.client.methods.HttpGet;
|
import org.apache.http.client.methods.HttpGet;
|
||||||
import org.apache.http.client.methods.HttpPost;
|
import org.apache.http.client.methods.HttpPost;
|
||||||
|
import org.apache.http.client.methods.HttpPut;
|
||||||
import org.apache.http.entity.InputStreamEntity;
|
import org.apache.http.entity.InputStreamEntity;
|
||||||
import org.apache.http.entity.StringEntity;
|
import org.apache.http.entity.StringEntity;
|
||||||
|
import org.apache.http.localserver.BasicAuthTokenExtractor;
|
||||||
import org.apache.http.localserver.BasicServerTestBase;
|
import org.apache.http.localserver.BasicServerTestBase;
|
||||||
import org.apache.http.localserver.LocalTestServer;
|
import org.apache.http.localserver.LocalTestServer;
|
||||||
import org.apache.http.localserver.RequestBasicAuth;
|
import org.apache.http.localserver.RequestBasicAuth;
|
||||||
import org.apache.http.localserver.ResponseBasicUnauthorized;
|
import org.apache.http.localserver.ResponseBasicUnauthorized;
|
||||||
|
import org.apache.http.params.CoreProtocolPNames;
|
||||||
import org.apache.http.protocol.BasicHttpContext;
|
import org.apache.http.protocol.BasicHttpContext;
|
||||||
import org.apache.http.protocol.BasicHttpProcessor;
|
import org.apache.http.protocol.BasicHttpProcessor;
|
||||||
import org.apache.http.protocol.HTTP;
|
import org.apache.http.protocol.HTTP;
|
||||||
import org.apache.http.protocol.HttpContext;
|
import org.apache.http.protocol.HttpContext;
|
||||||
|
import org.apache.http.protocol.HttpExpectationVerifier;
|
||||||
import org.apache.http.protocol.HttpRequestHandler;
|
import org.apache.http.protocol.HttpRequestHandler;
|
||||||
import org.apache.http.protocol.ResponseConnControl;
|
import org.apache.http.protocol.ResponseConnControl;
|
||||||
import org.apache.http.protocol.ResponseContent;
|
import org.apache.http.protocol.ResponseContent;
|
||||||
|
@ -58,6 +62,7 @@ import org.apache.http.protocol.ResponseDate;
|
||||||
import org.apache.http.protocol.ResponseServer;
|
import org.apache.http.protocol.ResponseServer;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
|
import org.junit.Ignore;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -96,6 +101,29 @@ public class TestClientAuthentication extends BasicServerTestBase {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static class AuthExpectationVerifier implements HttpExpectationVerifier {
|
||||||
|
|
||||||
|
private final BasicAuthTokenExtractor authTokenExtractor;
|
||||||
|
|
||||||
|
public AuthExpectationVerifier() {
|
||||||
|
super();
|
||||||
|
this.authTokenExtractor = new BasicAuthTokenExtractor();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void verify(
|
||||||
|
final HttpRequest request,
|
||||||
|
final HttpResponse response,
|
||||||
|
final HttpContext context) throws HttpException {
|
||||||
|
String creds = this.authTokenExtractor.extract(request);
|
||||||
|
if (creds == null || !creds.equals("test:test")) {
|
||||||
|
response.setStatusCode(HttpStatus.SC_UNAUTHORIZED);
|
||||||
|
} else {
|
||||||
|
response.setStatusCode(HttpStatus.SC_CONTINUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
static class TestCredentialsProvider implements CredentialsProvider {
|
static class TestCredentialsProvider implements CredentialsProvider {
|
||||||
|
|
||||||
private final Credentials creds;
|
private final Credentials creds;
|
||||||
|
@ -191,6 +219,68 @@ public class TestClientAuthentication extends BasicServerTestBase {
|
||||||
Assert.assertEquals("test realm", authscope.getRealm());
|
Assert.assertEquals("test realm", authscope.getRealm());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test @Ignore
|
||||||
|
public void testBasicAuthenticationSuccessOnNonRepeatablePutExpectContinue() throws Exception {
|
||||||
|
BasicHttpProcessor httpproc = new BasicHttpProcessor();
|
||||||
|
httpproc.addInterceptor(new ResponseDate());
|
||||||
|
httpproc.addInterceptor(new ResponseServer());
|
||||||
|
httpproc.addInterceptor(new ResponseContent());
|
||||||
|
httpproc.addInterceptor(new ResponseConnControl());
|
||||||
|
httpproc.addInterceptor(new RequestBasicAuth());
|
||||||
|
httpproc.addInterceptor(new ResponseBasicUnauthorized());
|
||||||
|
localServer = new LocalTestServer(
|
||||||
|
httpproc, null, null, new AuthExpectationVerifier(), null, null);
|
||||||
|
localServer.register("*", new AuthHandler());
|
||||||
|
localServer.start();
|
||||||
|
|
||||||
|
TestCredentialsProvider credsProvider = new TestCredentialsProvider(
|
||||||
|
new UsernamePasswordCredentials("test", "test"));
|
||||||
|
|
||||||
|
DefaultHttpClient httpclient = new DefaultHttpClient();
|
||||||
|
httpclient.setCredentialsProvider(credsProvider);
|
||||||
|
|
||||||
|
HttpPut httpput = new HttpPut("/");
|
||||||
|
httpput.setEntity(new InputStreamEntity(
|
||||||
|
new ByteArrayInputStream(
|
||||||
|
new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 } ),
|
||||||
|
-1));
|
||||||
|
httpput.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, true);
|
||||||
|
|
||||||
|
HttpResponse response = httpclient.execute(getServerHttp(), httpput);
|
||||||
|
HttpEntity entity = response.getEntity();
|
||||||
|
Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
|
||||||
|
Assert.assertNotNull(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected=ClientProtocolException.class)
|
||||||
|
public void testBasicAuthenticationFailureOnNonRepeatablePutDontExpectContinue() throws Exception {
|
||||||
|
localServer.register("*", new AuthHandler());
|
||||||
|
localServer.start();
|
||||||
|
|
||||||
|
TestCredentialsProvider credsProvider = new TestCredentialsProvider(
|
||||||
|
new UsernamePasswordCredentials("test", "test"));
|
||||||
|
|
||||||
|
DefaultHttpClient httpclient = new DefaultHttpClient();
|
||||||
|
httpclient.setCredentialsProvider(credsProvider);
|
||||||
|
|
||||||
|
HttpPut httpput = new HttpPut("/");
|
||||||
|
httpput.setEntity(new InputStreamEntity(
|
||||||
|
new ByteArrayInputStream(
|
||||||
|
new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 } ),
|
||||||
|
-1));
|
||||||
|
httpput.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false);
|
||||||
|
|
||||||
|
try {
|
||||||
|
httpclient.execute(getServerHttp(), httpput);
|
||||||
|
Assert.fail("ClientProtocolException should have been thrown");
|
||||||
|
} catch (ClientProtocolException ex) {
|
||||||
|
Throwable cause = ex.getCause();
|
||||||
|
Assert.assertNotNull(cause);
|
||||||
|
Assert.assertTrue(cause instanceof NonRepeatableRequestException);
|
||||||
|
throw ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testBasicAuthenticationSuccessOnRepeatablePost() throws Exception {
|
public void testBasicAuthenticationSuccessOnRepeatablePost() throws Exception {
|
||||||
localServer.register("*", new AuthHandler());
|
localServer.register("*", new AuthHandler());
|
||||||
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
/*
|
||||||
|
* ====================================================================
|
||||||
|
* 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
|
||||||
|
* <http://www.apache.org/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.http.localserver;
|
||||||
|
|
||||||
|
import org.apache.commons.codec.BinaryDecoder;
|
||||||
|
import org.apache.commons.codec.DecoderException;
|
||||||
|
import org.apache.commons.codec.binary.Base64;
|
||||||
|
import org.apache.http.Header;
|
||||||
|
import org.apache.http.HttpException;
|
||||||
|
import org.apache.http.HttpRequest;
|
||||||
|
import org.apache.http.ProtocolException;
|
||||||
|
import org.apache.http.auth.AUTH;
|
||||||
|
import org.apache.http.util.EncodingUtils;
|
||||||
|
|
||||||
|
public class BasicAuthTokenExtractor {
|
||||||
|
|
||||||
|
public String extract(final HttpRequest request) throws HttpException {
|
||||||
|
String auth = null;
|
||||||
|
|
||||||
|
Header h = request.getFirstHeader(AUTH.WWW_AUTH_RESP);
|
||||||
|
if (h != null) {
|
||||||
|
String s = h.getValue();
|
||||||
|
if (s != null) {
|
||||||
|
auth = s.trim();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (auth != null) {
|
||||||
|
int i = auth.indexOf(' ');
|
||||||
|
if (i == -1) {
|
||||||
|
throw new ProtocolException("Invalid Authorization header: " + auth);
|
||||||
|
}
|
||||||
|
String authscheme = auth.substring(0, i);
|
||||||
|
if (authscheme.equalsIgnoreCase("basic")) {
|
||||||
|
String s = auth.substring(i + 1).trim();
|
||||||
|
try {
|
||||||
|
byte[] credsRaw = EncodingUtils.getAsciiBytes(s);
|
||||||
|
BinaryDecoder codec = new Base64();
|
||||||
|
auth = EncodingUtils.getAsciiString(codec.decode(credsRaw));
|
||||||
|
} catch (DecoderException ex) {
|
||||||
|
throw new ProtocolException("Malformed BASIC credentials");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return auth;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -54,6 +54,7 @@ import org.apache.http.params.SyncBasicHttpParams;
|
||||||
import org.apache.http.protocol.BasicHttpProcessor;
|
import org.apache.http.protocol.BasicHttpProcessor;
|
||||||
import org.apache.http.protocol.HttpContext;
|
import org.apache.http.protocol.HttpContext;
|
||||||
import org.apache.http.protocol.BasicHttpContext;
|
import org.apache.http.protocol.BasicHttpContext;
|
||||||
|
import org.apache.http.protocol.HttpExpectationVerifier;
|
||||||
import org.apache.http.protocol.HttpProcessor;
|
import org.apache.http.protocol.HttpProcessor;
|
||||||
import org.apache.http.protocol.HttpRequestHandler;
|
import org.apache.http.protocol.HttpRequestHandler;
|
||||||
import org.apache.http.protocol.HttpRequestHandlerRegistry;
|
import org.apache.http.protocol.HttpRequestHandlerRegistry;
|
||||||
|
@ -119,6 +120,7 @@ public class LocalTestServer {
|
||||||
final BasicHttpProcessor proc,
|
final BasicHttpProcessor proc,
|
||||||
final ConnectionReuseStrategy reuseStrat,
|
final ConnectionReuseStrategy reuseStrat,
|
||||||
final HttpResponseFactory responseFactory,
|
final HttpResponseFactory responseFactory,
|
||||||
|
final HttpExpectationVerifier expectationVerifier,
|
||||||
final HttpParams params,
|
final HttpParams params,
|
||||||
final SSLContext sslcontext) {
|
final SSLContext sslcontext) {
|
||||||
super();
|
super();
|
||||||
|
@ -129,7 +131,7 @@ public class LocalTestServer {
|
||||||
reuseStrat != null ? reuseStrat: newConnectionReuseStrategy(),
|
reuseStrat != null ? reuseStrat: newConnectionReuseStrategy(),
|
||||||
responseFactory != null ? responseFactory: newHttpResponseFactory(),
|
responseFactory != null ? responseFactory: newHttpResponseFactory(),
|
||||||
handlerRegistry,
|
handlerRegistry,
|
||||||
null,
|
expectationVerifier,
|
||||||
params != null ? params : newDefaultParams());
|
params != null ? params : newDefaultParams());
|
||||||
this.sslcontext = sslcontext;
|
this.sslcontext = sslcontext;
|
||||||
}
|
}
|
||||||
|
@ -140,7 +142,7 @@ public class LocalTestServer {
|
||||||
* @param sslcontext SSL context
|
* @param sslcontext SSL context
|
||||||
*/
|
*/
|
||||||
public LocalTestServer(final SSLContext sslcontext) {
|
public LocalTestServer(final SSLContext sslcontext) {
|
||||||
this(null, null, null, null, sslcontext);
|
this(null, null, null, null, null, sslcontext);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -156,7 +158,7 @@ public class LocalTestServer {
|
||||||
public LocalTestServer(
|
public LocalTestServer(
|
||||||
BasicHttpProcessor proc,
|
BasicHttpProcessor proc,
|
||||||
HttpParams params) {
|
HttpParams params) {
|
||||||
this(proc, null, null, params, null);
|
this(proc, null, null, null, params, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -29,54 +29,24 @@ package org.apache.http.localserver;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import org.apache.commons.codec.BinaryDecoder;
|
|
||||||
import org.apache.commons.codec.DecoderException;
|
|
||||||
import org.apache.commons.codec.binary.Base64;
|
|
||||||
import org.apache.http.Header;
|
|
||||||
import org.apache.http.HttpException;
|
import org.apache.http.HttpException;
|
||||||
import org.apache.http.HttpRequest;
|
import org.apache.http.HttpRequest;
|
||||||
import org.apache.http.HttpRequestInterceptor;
|
import org.apache.http.HttpRequestInterceptor;
|
||||||
import org.apache.http.ProtocolException;
|
|
||||||
import org.apache.http.auth.AUTH;
|
|
||||||
import org.apache.http.protocol.HTTP;
|
|
||||||
import org.apache.http.protocol.HttpContext;
|
import org.apache.http.protocol.HttpContext;
|
||||||
|
|
||||||
public class RequestBasicAuth implements HttpRequestInterceptor {
|
public class RequestBasicAuth implements HttpRequestInterceptor {
|
||||||
|
|
||||||
|
private final BasicAuthTokenExtractor authTokenExtractor;
|
||||||
|
|
||||||
|
public RequestBasicAuth() {
|
||||||
|
super();
|
||||||
|
this.authTokenExtractor = new BasicAuthTokenExtractor();
|
||||||
|
}
|
||||||
|
|
||||||
public void process(
|
public void process(
|
||||||
final HttpRequest request,
|
final HttpRequest request,
|
||||||
final HttpContext context) throws HttpException, IOException {
|
final HttpContext context) throws HttpException, IOException {
|
||||||
|
context.setAttribute("creds", this.authTokenExtractor.extract(request));
|
||||||
context.removeAttribute("creds");
|
|
||||||
|
|
||||||
String auth = null;
|
|
||||||
|
|
||||||
Header h = request.getFirstHeader(AUTH.WWW_AUTH_RESP);
|
|
||||||
if (h != null) {
|
|
||||||
String s = h.getValue();
|
|
||||||
if (s != null) {
|
|
||||||
auth = s.trim();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (auth != null) {
|
|
||||||
int i = auth.indexOf(' ');
|
|
||||||
if (i == -1) {
|
|
||||||
throw new ProtocolException("Invalid Authorization header: " + auth);
|
|
||||||
}
|
|
||||||
String authscheme = auth.substring(0, i);
|
|
||||||
if (authscheme.equalsIgnoreCase("basic")) {
|
|
||||||
String s = auth.substring(i + 1).trim();
|
|
||||||
byte[] credsRaw = s.getBytes(HTTP.ASCII);
|
|
||||||
BinaryDecoder codec = new Base64();
|
|
||||||
try {
|
|
||||||
String creds = new String(codec.decode(credsRaw), HTTP.ASCII);
|
|
||||||
context.setAttribute("creds", creds);
|
|
||||||
} catch (DecoderException ex) {
|
|
||||||
throw new ProtocolException("Malformed BASIC credentials");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue