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:
Oleg Kalnichevski 2014-06-05 13:09:47 +00:00
parent 6b6ad6075d
commit 07e7a0c281
6 changed files with 129 additions and 6 deletions

View File

@ -53,7 +53,8 @@ import org.apache.http.util.EncodingUtils;
@NotThreadSafe
public class BasicScheme extends RFC2617Scheme {
private final Base64 base64codec;
private static final long serialVersionUID = -1931571557597830536L;
/** Whether the basic authentication process is complete */
private boolean complete;
@ -62,7 +63,6 @@ public class BasicScheme extends RFC2617Scheme {
*/
public BasicScheme(final Charset credentialsCharset) {
super(credentialsCharset);
this.base64codec = new Base64(0);
this.complete = false;
}
@ -77,7 +77,6 @@ public class BasicScheme extends RFC2617Scheme {
@Deprecated
public BasicScheme(final ChallengeState challengeState) {
super(challengeState);
this.base64codec = new Base64(0);
}
public BasicScheme() {
@ -166,6 +165,7 @@ public class BasicScheme extends RFC2617Scheme {
tmp.append(":");
tmp.append((credentials.getPassword() == null) ? "null" : credentials.getPassword());
final Base64 base64codec = new Base64(0);
final byte[] base64password = base64codec.encode(
EncodingUtils.getBytes(tmp.toString(), getCredentialsCharset(request)));
@ -220,4 +220,11 @@ public class BasicScheme extends RFC2617Scheme {
return new BufferedHeader(buffer);
}
@Override
public String toString() {
final StringBuilder builder = new StringBuilder();
builder.append("BASIC [complete=").append(complete)
.append("]");
return builder.toString();
}
}

View File

@ -74,6 +74,8 @@ import org.apache.http.util.EncodingUtils;
@NotThreadSafe
public class DigestScheme extends RFC2617Scheme {
private static final long serialVersionUID = 3883908186234566916L;
/**
* Hexa values used when creating 32 character long digest in HTTP DigestScheme
* in case of authentication.

View File

@ -26,6 +26,11 @@
*/
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.util.HashMap;
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.ParserCursor;
import org.apache.http.util.CharArrayBuffer;
import org.apache.http.util.CharsetUtils;
/**
* Abstract authentication scheme class that lays foundation for all
@ -52,10 +58,12 @@ import org.apache.http.util.CharArrayBuffer;
*/
@SuppressWarnings("deprecation")
@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 Charset credentialsCharset;
private transient Charset credentialsCharset;
/**
* Creates an instance of <tt>RFC2617Scheme</tt> with the given challenge
@ -90,7 +98,7 @@ public abstract class RFC2617Scheme extends AuthSchemeBase {
* @since 4.3
*/
public Charset getCredentialsCharset() {
return credentialsCharset;
return credentialsCharset != null ? credentialsCharset : Consts.ASCII;
}
String getCredentialsCharset(final HttpRequest request) {
@ -150,4 +158,21 @@ public abstract class RFC2617Scheme extends AuthSchemeBase {
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 {
}
}

View File

@ -26,6 +26,11 @@
*/
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.http.Consts;
import org.apache.http.Header;
@ -118,4 +123,25 @@ public class TestBasicScheme {
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());
}
}

View File

@ -27,7 +27,10 @@
package org.apache.http.impl.auth;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.Map;
@ -618,4 +621,28 @@ public class TestDigestScheme {
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());
}
}

View File

@ -27,6 +27,13 @@
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.HttpRequest;
import org.apache.http.auth.AUTH;
@ -43,6 +50,14 @@ public class TestRFC2617Scheme {
static class TestAuthScheme extends RFC2617Scheme {
public TestAuthScheme() {
super();
}
public TestAuthScheme(final Charset charset) {
super(charset);
}
@Override
@Deprecated
public Header authenticate(
@ -139,5 +154,26 @@ public class TestRFC2617Scheme {
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"));
}
}