Auth scheme state cache to use object serialization
git-svn-id: https://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk@1600641 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
6b6ad6075d
commit
07e7a0c281
|
@ -53,7 +53,8 @@ import org.apache.http.util.EncodingUtils;
|
||||||
@NotThreadSafe
|
@NotThreadSafe
|
||||||
public class BasicScheme extends RFC2617Scheme {
|
public class BasicScheme extends RFC2617Scheme {
|
||||||
|
|
||||||
private final Base64 base64codec;
|
private static final long serialVersionUID = -1931571557597830536L;
|
||||||
|
|
||||||
/** Whether the basic authentication process is complete */
|
/** Whether the basic authentication process is complete */
|
||||||
private boolean complete;
|
private boolean complete;
|
||||||
|
|
||||||
|
@ -62,7 +63,6 @@ public class BasicScheme extends RFC2617Scheme {
|
||||||
*/
|
*/
|
||||||
public BasicScheme(final Charset credentialsCharset) {
|
public BasicScheme(final Charset credentialsCharset) {
|
||||||
super(credentialsCharset);
|
super(credentialsCharset);
|
||||||
this.base64codec = new Base64(0);
|
|
||||||
this.complete = false;
|
this.complete = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,7 +77,6 @@ public class BasicScheme extends RFC2617Scheme {
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public BasicScheme(final ChallengeState challengeState) {
|
public BasicScheme(final ChallengeState challengeState) {
|
||||||
super(challengeState);
|
super(challengeState);
|
||||||
this.base64codec = new Base64(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public BasicScheme() {
|
public BasicScheme() {
|
||||||
|
@ -166,6 +165,7 @@ public class BasicScheme extends RFC2617Scheme {
|
||||||
tmp.append(":");
|
tmp.append(":");
|
||||||
tmp.append((credentials.getPassword() == null) ? "null" : credentials.getPassword());
|
tmp.append((credentials.getPassword() == null) ? "null" : credentials.getPassword());
|
||||||
|
|
||||||
|
final Base64 base64codec = new Base64(0);
|
||||||
final byte[] base64password = base64codec.encode(
|
final byte[] base64password = base64codec.encode(
|
||||||
EncodingUtils.getBytes(tmp.toString(), getCredentialsCharset(request)));
|
EncodingUtils.getBytes(tmp.toString(), getCredentialsCharset(request)));
|
||||||
|
|
||||||
|
@ -220,4 +220,11 @@ public class BasicScheme extends RFC2617Scheme {
|
||||||
return new BufferedHeader(buffer);
|
return new BufferedHeader(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
final StringBuilder builder = new StringBuilder();
|
||||||
|
builder.append("BASIC [complete=").append(complete)
|
||||||
|
.append("]");
|
||||||
|
return builder.toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,6 +74,8 @@ import org.apache.http.util.EncodingUtils;
|
||||||
@NotThreadSafe
|
@NotThreadSafe
|
||||||
public class DigestScheme extends RFC2617Scheme {
|
public class DigestScheme extends RFC2617Scheme {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 3883908186234566916L;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hexa values used when creating 32 character long digest in HTTP DigestScheme
|
* Hexa values used when creating 32 character long digest in HTTP DigestScheme
|
||||||
* in case of authentication.
|
* in case of authentication.
|
||||||
|
|
|
@ -26,6 +26,11 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.http.impl.auth;
|
package org.apache.http.impl.auth;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.ObjectInputStream;
|
||||||
|
import java.io.ObjectOutputStream;
|
||||||
|
import java.io.ObjectStreamException;
|
||||||
|
import java.io.Serializable;
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
@ -42,6 +47,7 @@ import org.apache.http.message.BasicHeaderValueParser;
|
||||||
import org.apache.http.message.HeaderValueParser;
|
import org.apache.http.message.HeaderValueParser;
|
||||||
import org.apache.http.message.ParserCursor;
|
import org.apache.http.message.ParserCursor;
|
||||||
import org.apache.http.util.CharArrayBuffer;
|
import org.apache.http.util.CharArrayBuffer;
|
||||||
|
import org.apache.http.util.CharsetUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Abstract authentication scheme class that lays foundation for all
|
* Abstract authentication scheme class that lays foundation for all
|
||||||
|
@ -52,10 +58,12 @@ import org.apache.http.util.CharArrayBuffer;
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
@NotThreadSafe // AuthSchemeBase, params
|
@NotThreadSafe // AuthSchemeBase, params
|
||||||
public abstract class RFC2617Scheme extends AuthSchemeBase {
|
public abstract class RFC2617Scheme extends AuthSchemeBase implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = -2845454858205884623L;
|
||||||
|
|
||||||
private final Map<String, String> params;
|
private final Map<String, String> params;
|
||||||
private final Charset credentialsCharset;
|
private transient Charset credentialsCharset;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates an instance of <tt>RFC2617Scheme</tt> with the given challenge
|
* Creates an instance of <tt>RFC2617Scheme</tt> with the given challenge
|
||||||
|
@ -90,7 +98,7 @@ public abstract class RFC2617Scheme extends AuthSchemeBase {
|
||||||
* @since 4.3
|
* @since 4.3
|
||||||
*/
|
*/
|
||||||
public Charset getCredentialsCharset() {
|
public Charset getCredentialsCharset() {
|
||||||
return credentialsCharset;
|
return credentialsCharset != null ? credentialsCharset : Consts.ASCII;
|
||||||
}
|
}
|
||||||
|
|
||||||
String getCredentialsCharset(final HttpRequest request) {
|
String getCredentialsCharset(final HttpRequest request) {
|
||||||
|
@ -150,4 +158,21 @@ public abstract class RFC2617Scheme extends AuthSchemeBase {
|
||||||
return getParameter("realm");
|
return getParameter("realm");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void writeObject(final ObjectOutputStream out) throws IOException {
|
||||||
|
out.defaultWriteObject();
|
||||||
|
out.writeUTF(this.credentialsCharset.name());
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private void readObject(final ObjectInputStream in) throws IOException, ClassNotFoundException {
|
||||||
|
in.defaultReadObject();
|
||||||
|
this.credentialsCharset = CharsetUtils.get(in.readUTF());
|
||||||
|
if (this.credentialsCharset == null) {
|
||||||
|
this.credentialsCharset = Consts.ASCII;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void readObjectNoData() throws ObjectStreamException {
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,11 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.http.impl.auth;
|
package org.apache.http.impl.auth;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.ObjectInputStream;
|
||||||
|
import java.io.ObjectOutputStream;
|
||||||
|
|
||||||
import org.apache.commons.codec.binary.Base64;
|
import org.apache.commons.codec.binary.Base64;
|
||||||
import org.apache.http.Consts;
|
import org.apache.http.Consts;
|
||||||
import org.apache.http.Header;
|
import org.apache.http.Header;
|
||||||
|
@ -118,4 +123,25 @@ public class TestBasicScheme {
|
||||||
Assert.assertFalse(authscheme.isConnectionBased());
|
Assert.assertFalse(authscheme.isConnectionBased());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSerialization() throws Exception {
|
||||||
|
final Header challenge = new BasicHeader(AUTH.PROXY_AUTH, "Basic realm=\"test\"");
|
||||||
|
|
||||||
|
final BasicScheme basicScheme = new BasicScheme();
|
||||||
|
basicScheme.processChallenge(challenge);
|
||||||
|
|
||||||
|
final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
|
||||||
|
final ObjectOutputStream out = new ObjectOutputStream(buffer);
|
||||||
|
out.writeObject(basicScheme);
|
||||||
|
out.flush();
|
||||||
|
final byte[] raw = buffer.toByteArray();
|
||||||
|
final ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(raw));
|
||||||
|
final BasicScheme authScheme = (BasicScheme) in.readObject();
|
||||||
|
|
||||||
|
Assert.assertEquals(basicScheme.getSchemeName(), authScheme.getSchemeName());
|
||||||
|
Assert.assertEquals(basicScheme.getRealm(), authScheme.getRealm());
|
||||||
|
Assert.assertEquals(basicScheme.isComplete(), authScheme.isComplete());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,10 @@
|
||||||
package org.apache.http.impl.auth;
|
package org.apache.http.impl.auth;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.ObjectInputStream;
|
||||||
|
import java.io.ObjectOutputStream;
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -618,4 +621,28 @@ public class TestDigestScheme {
|
||||||
authscheme.authenticate(cred, request, context);
|
authscheme.authenticate(cred, request, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSerialization() throws Exception {
|
||||||
|
final String challenge = "Digest realm=\"realm1\", nonce=\"f2a3f18799759d4f1a1c068b92b573cb\", " +
|
||||||
|
"qop=\"auth,auth-int\"";
|
||||||
|
final Header authChallenge = new BasicHeader(AUTH.WWW_AUTH, challenge);
|
||||||
|
final DigestScheme digestScheme = new DigestScheme();
|
||||||
|
digestScheme.processChallenge(authChallenge);
|
||||||
|
|
||||||
|
final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
|
||||||
|
final ObjectOutputStream out = new ObjectOutputStream(buffer);
|
||||||
|
out.writeObject(digestScheme);
|
||||||
|
out.flush();
|
||||||
|
final byte[] raw = buffer.toByteArray();
|
||||||
|
final ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(raw));
|
||||||
|
final DigestScheme authScheme = (DigestScheme) in.readObject();
|
||||||
|
|
||||||
|
Assert.assertEquals(digestScheme.getSchemeName(), authScheme.getSchemeName());
|
||||||
|
Assert.assertEquals(digestScheme.getRealm(), authScheme.getRealm());
|
||||||
|
Assert.assertEquals(digestScheme.isComplete(), authScheme.isComplete());
|
||||||
|
Assert.assertEquals(digestScheme.getA1(), authScheme.getA1());
|
||||||
|
Assert.assertEquals(digestScheme.getA2(), authScheme.getA2());
|
||||||
|
Assert.assertEquals(digestScheme.getCnonce(), authScheme.getCnonce());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,13 @@
|
||||||
|
|
||||||
package org.apache.http.impl.auth;
|
package org.apache.http.impl.auth;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.ObjectInputStream;
|
||||||
|
import java.io.ObjectOutputStream;
|
||||||
|
import java.nio.charset.Charset;
|
||||||
|
|
||||||
|
import org.apache.http.Consts;
|
||||||
import org.apache.http.Header;
|
import org.apache.http.Header;
|
||||||
import org.apache.http.HttpRequest;
|
import org.apache.http.HttpRequest;
|
||||||
import org.apache.http.auth.AUTH;
|
import org.apache.http.auth.AUTH;
|
||||||
|
@ -43,6 +50,14 @@ public class TestRFC2617Scheme {
|
||||||
|
|
||||||
static class TestAuthScheme extends RFC2617Scheme {
|
static class TestAuthScheme extends RFC2617Scheme {
|
||||||
|
|
||||||
|
public TestAuthScheme() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public TestAuthScheme(final Charset charset) {
|
||||||
|
super(charset);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public Header authenticate(
|
public Header authenticate(
|
||||||
|
@ -139,5 +154,26 @@ public class TestRFC2617Scheme {
|
||||||
authscheme.processChallenge(header);
|
authscheme.processChallenge(header);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSerialization() throws Exception {
|
||||||
|
final Header challenge = new BasicHeader(AUTH.WWW_AUTH, "test realm=\"test\", blah=blah, yada=\"yada yada\"");
|
||||||
|
|
||||||
|
final TestAuthScheme testScheme = new TestAuthScheme(Consts.ISO_8859_1);
|
||||||
|
testScheme.processChallenge(challenge);
|
||||||
|
|
||||||
|
final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
|
||||||
|
final ObjectOutputStream out = new ObjectOutputStream(buffer);
|
||||||
|
out.writeObject(testScheme);
|
||||||
|
out.flush();
|
||||||
|
final byte[] raw = buffer.toByteArray();
|
||||||
|
final ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(raw));
|
||||||
|
final TestAuthScheme authScheme = (TestAuthScheme) in.readObject();
|
||||||
|
|
||||||
|
Assert.assertEquals(Consts.ISO_8859_1, authScheme.getCredentialsCharset());
|
||||||
|
Assert.assertEquals("test", authScheme.getParameter("realm"));
|
||||||
|
Assert.assertEquals("blah", authScheme.getParameter("blah"));
|
||||||
|
Assert.assertEquals("yada yada", authScheme.getParameter("yada"));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue