mbecke 2003/12/10 17:19:33 Modified: httpclient/src/java/org/apache/commons/httpclient/params HttpMethodParams.java DefaultHttpParamsFactory.java httpclient/src/java/org/apache/commons/httpclient/auth AuthScheme.java NTLMScheme.java NTLM.java DigestScheme.java BasicScheme.java HttpAuthenticator.java httpclient/src/java/org/apache/commons/httpclient HttpConnection.java ConnectMethod.java MultiThreadedHttpConnectionManager.java HttpMethodBase.java httpclient/src/java/org/apache/commons/httpclient/util EncodingUtil.java Log: Adds support for configuring charsets in credentials and HTTP headers. PR: 24671 Submitted by: Michael Becke Reviewed by: Oleg Kalnichevski Revision Changes Path 1.6 +66 -5 jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/params/HttpMethodParams.java Index: HttpMethodParams.java =================================================================== RCS file: /home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/params/HttpMethodParams.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- HttpMethodParams.java 22 Oct 2003 19:31:00 -0000 1.5 +++ HttpMethodParams.java 11 Dec 2003 01:19:32 -0000 1.6 @@ -179,6 +179,24 @@ public static final String USE_EXPECT_CONTINUE = "http.protocol.expect-continue"; /** + * Defines the charset to be used when encoding + * [EMAIL PROTECTED] org.apache.commons.httpclient.Credentials}. If not defined then the + * [EMAIL PROTECTED] #HTTP_ELEMENT_CHARSET} should be used. + * <p> + * This parameter expects a value of type [EMAIL PROTECTED] String}. + * </p> + */ + public static final String CREDENTIAL_CHARSET = "http.protocol.credential-charset"; + + /** + * Defines the charset to be used for encoding HTTP protocol elements. + * <p> + * This parameter expects a value of type [EMAIL PROTECTED] String}. + * </p> + */ + public static final String HTTP_ELEMENT_CHARSET = "http.protocol.element-charset"; + + /** * Defines [EMAIL PROTECTED] CookiePolicy cookie policy} to be used for cookie management. * <p> * This parameter expects a value of type [EMAIL PROTECTED] String}. @@ -195,7 +213,7 @@ * @see #getDefaultParams() */ public HttpMethodParams() { - super(null); + super(getDefaultParams()); } /** @@ -213,6 +231,49 @@ super(defaults); } + /** + * Returns the charset to be used for writing HTTP headers. + * @return The charset + */ + public String getHttpElementCharset() { + String charset = (String) getParameter(HTTP_ELEMENT_CHARSET); + if (charset == null) { + LOG.warn("HTTP element charset not configured, using US-ASCII"); + charset = "US-ASCII"; + } + return charset; + } + + /** + * Sets the charset to be used for writing HTTP headers. + * @param charset The charset + */ + public void setHttpElementCharset(String charset) { + setParameter(HTTP_ELEMENT_CHARSET, charset); + } + + /** + * Returns the charset to be used for [EMAIL PROTECTED] org.apache.commons.httpclient.Credentials}. If + * not configured the [EMAIL PROTECTED] #HTTP_ELEMENT_CHARSET HTTP element charset} is used. + * @return The charset + */ + public String getCredentialCharset() { + String charset = (String) getParameter(CREDENTIAL_CHARSET); + if (charset == null) { + LOG.debug("Credential charset not configured, using HTTP element charset"); + charset = getHttpElementCharset(); + } + return charset; + } + + /** + * Sets the charset to be used for writing HTTP headers. + * @param charset The charset + */ + public void setCredentialCharset(String charset) { + setParameter(CREDENTIAL_CHARSET, charset); + } + /** * Returns [EMAIL PROTECTED] HttpVersion HTTP protocol version} to be used by the * [EMAIL PROTECTED] org.apache.commons.httpclient.HttpMethod HTTP methods} that 1.5 +4 -3 jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/params/DefaultHttpParamsFactory.java Index: DefaultHttpParamsFactory.java =================================================================== RCS file: /home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/params/DefaultHttpParamsFactory.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- DefaultHttpParamsFactory.java 20 Oct 2003 22:17:12 -0000 1.4 +++ DefaultHttpParamsFactory.java 11 Dec 2003 01:19:32 -0000 1.5 @@ -102,6 +102,7 @@ params.setVersion(HttpVersion.HTTP_1_1); params.setConnectionManagerClass(SimpleHttpConnectionManager.class); params.setCookiePolicy(CookiePolicy.RFC_2109); + params.setHttpElementCharset("US-ASCII"); ArrayList datePatterns = new ArrayList(); datePatterns.addAll( 1.6 +19 -4 jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/auth/AuthScheme.java Index: AuthScheme.java =================================================================== RCS file: /home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/auth/AuthScheme.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- AuthScheme.java 10 Dec 2003 21:04:13 -0000 1.5 +++ AuthScheme.java 11 Dec 2003 01:19:32 -0000 1.6 @@ -64,6 +64,7 @@ package org.apache.commons.httpclient.auth; import org.apache.commons.httpclient.Credentials; +import org.apache.commons.httpclient.HttpMethod; /** * <p> @@ -164,6 +165,8 @@ boolean isConnectionBased(); /** + * @deprecated Use [EMAIL PROTECTED] #authenticate(Credentials, String, String, HttpMethodParams)} + * * Produces an authorization string for the given set of [EMAIL PROTECTED] Credentials}, * method name and URI using the given authentication scheme in response to * the actual authorization challenge. @@ -185,5 +188,17 @@ */ String authenticate(Credentials credentials, String method, String uri) throws AuthenticationException; - + + /** + * Produces an authorization string for the given set of [EMAIL PROTECTED] Credentials}. + * + * @param credentials The set of credentials to be used for athentication + * @param method The method being authenticated + * @throws AuthenticationException if authorization string cannot + * be generated due to an authentication failure + * + * @return the authorization string + */ + String authenticate(Credentials credentials, HttpMethod method) throws AuthenticationException; + } 1.13 +72 -3 jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/auth/NTLMScheme.java Index: NTLMScheme.java =================================================================== RCS file: /home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/auth/NTLMScheme.java,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- NTLMScheme.java 10 Dec 2003 21:04:13 -0000 1.12 +++ NTLMScheme.java 11 Dec 2003 01:19:32 -0000 1.13 @@ -64,6 +64,7 @@ package org.apache.commons.httpclient.auth; import org.apache.commons.httpclient.Credentials; +import org.apache.commons.httpclient.HttpMethod; import org.apache.commons.httpclient.NTCredentials; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -224,6 +225,40 @@ credentials.getHost(), credentials.getDomain()); return "NTLM " + s; } + + /** + * Create a NTLM authorization string for the given + * challenge and NT credentials. + * + * @param challenge The challenge. + * @param credentials [EMAIL PROTECTED] NTCredentials} + * @param charset The charset to use for encoding the credentials + * + * @return a ntlm authorization string + * @throws AuthenticationException is thrown if authentication fails + */ + public static String authenticate( + final NTCredentials credentials, + final String challenge, + String charset + ) throws AuthenticationException { + + LOG.trace("enter NTLMScheme.authenticate(NTCredentials, String)"); + + if (credentials == null) { + throw new IllegalArgumentException("Credentials may not be null"); + } + + NTLM ntlm = new NTLM(); + ntlm.setCredentialCharset(charset); + String s = ntlm.getResponseFor( + challenge, + credentials.getUserName(), + credentials.getPassword(), + credentials.getHost(), + credentials.getDomain()); + return "NTLM " + s; + } /** * Produces NTLM authorization string for the given set of @@ -252,5 +287,39 @@ + credentials.getClass().getName()); } return NTLMScheme.authenticate(ntcredentials, this.ntlmchallenge); + } + + /** + * Produces NTLM authorization string for the given set of + * [EMAIL PROTECTED] Credentials}. + * + * @param credentials The set of credentials to be used for athentication + * @param method The method being authenticated + * + * @throws InvalidCredentialsException if authentication credentials + * are not valid or not applicable for this authentication scheme + * @throws AuthenticationException if authorization string cannot + * be generated due to an authentication failure + * + * @return an NTLM authorization string + */ + public String authenticate( + Credentials credentials, + HttpMethod method + ) throws AuthenticationException { + LOG.trace("enter NTLMScheme.authenticate(Credentials, HttpMethod)"); + + NTCredentials ntcredentials = null; + try { + ntcredentials = (NTCredentials) credentials; + } catch (ClassCastException e) { + throw new InvalidCredentialsException( + "Credentials cannot be used for NTLM authentication: " + + credentials.getClass().getName()); + } + return NTLMScheme.authenticate( + ntcredentials, + this.ntlmchallenge, + method.getParams().getCredentialCharset()); } } 1.5 +32 -35 jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/auth/NTLM.java Index: NTLM.java =================================================================== RCS file: /home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/auth/NTLM.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- NTLM.java 16 Aug 2003 00:41:24 -0000 1.4 +++ NTLM.java 11 Dec 2003 01:19:32 -0000 1.5 @@ -63,7 +63,6 @@ package org.apache.commons.httpclient.auth; -import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; @@ -75,8 +74,7 @@ import org.apache.commons.httpclient.HttpConstants; import org.apache.commons.httpclient.util.Base64; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +import org.apache.commons.httpclient.util.EncodingUtil; /** * Provides an implementation of the NTLM authentication protocol. @@ -102,18 +100,18 @@ */ final class NTLM { + /** Character encoding */ + public static final String DEFAULT_CHARSET = "ASCII"; + /** The current response */ private byte[] currentResponse; /** The current position */ private int currentPosition = 0; - /** Log object for this class. */ - private static final Log LOG = LogFactory.getLog(NTLM.class); - - /** Character encoding */ - public static final String DEFAULT_CHARSET = "ASCII"; - + /** The character set to use for encoding the credentials */ + private String credentialCharset = DEFAULT_CHARSET; + /** * Returns the response for the given message. * @@ -268,14 +266,14 @@ private String getType1Message(String host, String domain) { host = host.toUpperCase(); domain = domain.toUpperCase(); - byte[] hostBytes = getBytes(host); - byte[] domainBytes = getBytes(domain); + byte[] hostBytes = EncodingUtil.getBytes(host, DEFAULT_CHARSET); + byte[] domainBytes = EncodingUtil.getBytes(domain, DEFAULT_CHARSET); int finalLength = 32 + hostBytes.length + domainBytes.length; prepareResponse(finalLength); // The initial id string. - byte[] protocol = getBytes("NTLMSSP"); + byte[] protocol = EncodingUtil.getBytes("NTLMSSP", DEFAULT_CHARSET); addBytes(protocol); addByte((byte) 0); @@ -342,7 +340,7 @@ */ private byte[] parseType2Message(String message) { // Decode the message first. - byte[] msg = Base64.decode(getBytes(message)); + byte[] msg = Base64.decode(EncodingUtil.getBytes(message, DEFAULT_CHARSET)); byte[] nonce = new byte[8]; // The nonce is the 8 bytes starting from the byte in position 24. for (int i = 0; i < 8; i++) { @@ -373,16 +371,16 @@ domain = domain.toUpperCase(); host = host.toUpperCase(); user = user.toUpperCase(); - byte[] domainBytes = getBytes(domain); - byte[] hostBytes = getBytes(host); - byte[] userBytes = getBytes(user); + byte[] domainBytes = EncodingUtil.getBytes(domain, DEFAULT_CHARSET); + byte[] hostBytes = EncodingUtil.getBytes(host, DEFAULT_CHARSET); + byte[] userBytes = EncodingUtil.getBytes(user, credentialCharset); int domainLen = domainBytes.length; int hostLen = hostBytes.length; int userLen = userBytes.length; int finalLength = 64 + ntRespLen + lmRespLen + domainLen + userLen + hostLen; prepareResponse(finalLength); - byte[] ntlmssp = getBytes("NTLMSSP"); + byte[] ntlmssp = EncodingUtil.getBytes("NTLMSSP", DEFAULT_CHARSET); addBytes(ntlmssp); addByte((byte) 0); addByte((byte) 3); @@ -465,7 +463,7 @@ */ private byte[] hashPassword(String password, byte[] nonce) throws AuthenticationException { - byte[] passw = getBytes(password.toUpperCase()); + byte[] passw = EncodingUtil.getBytes(password.toUpperCase(), credentialCharset); byte[] lmPw1 = new byte[7]; byte[] lmPw2 = new byte[7]; @@ -585,18 +583,17 @@ } /** - * Convert a string to a byte array. - * @param s The string - * @return byte[] The resulting byte array. - */ - private static byte[] getBytes(final String s) { - if (s == null) { - throw new IllegalArgumentException("Parameter may not be null"); - } - try { - return s.getBytes(DEFAULT_CHARSET); - } catch (UnsupportedEncodingException unexpectedEncodingException) { - throw new RuntimeException("NTLM requires ASCII support"); - } + * @return Returns the credentialCharset. + */ + public String getCredentialCharset() { + return credentialCharset; + } + + /** + * @param credentialCharset The credentialCharset to set. + */ + public void setCredentialCharset(String credentialCharset) { + this.credentialCharset = credentialCharset; } + } 1.13 +62 -18 jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/auth/DigestScheme.java Index: DigestScheme.java =================================================================== RCS file: /home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/auth/DigestScheme.java,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- DigestScheme.java 10 Dec 2003 21:04:13 -0000 1.12 +++ DigestScheme.java 11 Dec 2003 01:19:32 -0000 1.13 @@ -63,14 +63,16 @@ package org.apache.commons.httpclient.auth; -import java.util.StringTokenizer; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.util.StringTokenizer; +import org.apache.commons.httpclient.Credentials; import org.apache.commons.httpclient.HttpClientError; import org.apache.commons.httpclient.HttpConstants; -import org.apache.commons.httpclient.Credentials; +import org.apache.commons.httpclient.HttpMethod; import org.apache.commons.httpclient.UsernamePasswordCredentials; +import org.apache.commons.httpclient.util.EncodingUtil; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -82,6 +84,14 @@ * is unsupported. If auth and auth-int are provided, auth is * used. * </p> + * <p> + * Credential charset is configured via the + * [EMAIL PROTECTED] org.apache.commons.httpclient.params.HttpMethodParams#CREDENTIAL_CHARSET credential + * charset} parameter. Since the digest username is included as clear text in the generated + * Authentication header, the charset of the username must be compatible with the + * [EMAIL PROTECTED] org.apache.commons.httpclient.params.HttpMethodParams#HTTP_ELEMENT_CHARSET http element + * charset}. + * </p> * TODO: make class more stateful regarding repeated authentication requests * * @author <a href="mailto:[EMAIL PROTECTED]">Remy Maucherat</a> @@ -282,28 +292,64 @@ } this.getParameters().put("methodname", method); this.getParameters().put("uri", uri); - String digest = createDigest(usernamepassword.getUserName(), - usernamepassword.getPassword()); + String digest = createDigest( + usernamepassword.getUserName(), + usernamepassword.getPassword(), + HttpConstants.DEFAULT_CONTENT_CHARSET); - return "Digest " + createDigestHeader(usernamepassword.getUserName(), - digest); + return "Digest " + createDigestHeader(usernamepassword.getUserName(), digest); } /** + * Produces a digest authorization string for the given set of + * [EMAIL PROTECTED] Credentials}, method name and URI. + * + * @param credentials A set of credentials to be used for athentication + * @param method The method being authenticated + * + * @throws InvalidCredentialsException if authentication credentials + * are not valid or not applicable for this authentication scheme + * @throws AuthenticationException if authorization string cannot + * be generated due to an authentication failure + * + * @return a digest authorization string + */ + public String authenticate(Credentials credentials, HttpMethod method) + throws AuthenticationException { + + LOG.trace("enter DigestScheme.authenticate(Credentials, HttpMethod)"); + + UsernamePasswordCredentials usernamepassword = null; + try { + usernamepassword = (UsernamePasswordCredentials) credentials; + } catch (ClassCastException e) { + throw new InvalidCredentialsException( + "Credentials cannot be used for digest authentication: " + + credentials.getClass().getName()); + } + this.getParameters().put("methodname", method.getName()); + this.getParameters().put("uri", method.getPath()); + String digest = createDigest( + usernamepassword.getUserName(), + usernamepassword.getPassword(), + method.getParams().getCredentialCharset()); + + return "Digest " + createDigestHeader(usernamepassword.getUserName(), + digest); + } + + /** * Creates an MD5 response digest. * * @param uname Username * @param pwd Password - * @param params The parameters necessary to construct the digest. - * The following parameters are expected: <code>uri</code>, - * <code>realm</code>, <code>nonce</code>, <code>nc</code>, - * <code>cnonce</code>, <code>qop</code>, <code>methodname</code>. + * @param charset The credential charset * * @return The created digest as string. This will be the response tag's * value in the Authentication HTTP header. * @throws AuthenticationException when MD5 is an unsupported algorithm */ - private String createDigest(String uname, String pwd) throws AuthenticationException { + private String createDigest(String uname, String pwd, String charset) throws AuthenticationException { LOG.trace("enter DigestScheme.createDigest(String, String, Map)"); @@ -322,7 +368,6 @@ algorithm="MD5"; } - if (qopVariant == QOP_AUTH_INT) { LOG.warn("qop=auth-int is not supported"); throw new AuthenticationException( @@ -354,8 +399,7 @@ // ":" unq(nonce-value) // ":" unq(cnonce-value) - String tmp2=encode(md5Helper.digest(HttpConstants.getBytes( - a1))); + String tmp2=encode(md5Helper.digest(EncodingUtil.getBytes(a1, charset))); StringBuffer tmp3 = new StringBuffer(tmp2.length() + nonce.length() + cnonce.length() + 2); tmp3.append(tmp2); tmp3.append(':'); @@ -366,7 +410,7 @@ } else if(!algorithm.equals("MD5")) { LOG.warn("Unhandled algorithm " + algorithm + " requested"); } - String md5a1 = encode(md5Helper.digest(HttpConstants.getBytes(a1))); + String md5a1 = encode(md5Helper.digest(EncodingUtil.getBytes(a1, charset))); String a2 = null; if (qopVariant == QOP_AUTH_INT) { 1.9 +59 -8 jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/auth/BasicScheme.java Index: BasicScheme.java =================================================================== RCS file: /home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/auth/BasicScheme.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- BasicScheme.java 10 Dec 2003 21:04:13 -0000 1.8 +++ BasicScheme.java 11 Dec 2003 01:19:32 -0000 1.9 @@ -63,10 +63,12 @@ package org.apache.commons.httpclient.auth; -import org.apache.commons.httpclient.HttpConstants; import org.apache.commons.httpclient.Credentials; +import org.apache.commons.httpclient.HttpConstants; +import org.apache.commons.httpclient.HttpMethod; import org.apache.commons.httpclient.UsernamePasswordCredentials; -import org.apache.commons.httpclient.util.Base64; +import org.apache.commons.httpclient.util.Base64; +import org.apache.commons.httpclient.util.EncodingUtil; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -163,7 +165,39 @@ } /** - * Return a basic <tt>Authorization</tt> header value for the given + * Produces basic authorization string for the given set of [EMAIL PROTECTED] Credentials}. + * + * @param credentials The set of credentials to be used for athentication + * @param method The method being authenticated + * @throws InvalidCredentialsException if authentication credentials + * are not valid or not applicable for this authentication scheme + * @throws AuthenticationException if authorization string cannot + * be generated due to an authentication failure + * + * @return a basic authorization string + */ + public String authenticate(Credentials credentials, HttpMethod method) throws AuthenticationException { + + LOG.trace("enter BasicScheme.authenticate(Credentials, HttpMethod)"); + + UsernamePasswordCredentials usernamepassword = null; + try { + usernamepassword = (UsernamePasswordCredentials) credentials; + } catch (ClassCastException e) { + throw new InvalidCredentialsException( + "Credentials cannot be used for basic authentication: " + + credentials.getClass().getName()); + } + + return BasicScheme.authenticate( + usernamepassword, + method.getParams().getCredentialCharset()); + } + + /** + * @deprecated Use [EMAIL PROTECTED] #authenticate(UsernamePasswordCredentials, String)} + * + * Returns a basic <tt>Authorization</tt> header value for the given * [EMAIL PROTECTED] UsernamePasswordCredentials}. * * @param credentials The credentials to encode. @@ -171,18 +205,35 @@ * @return a basic authorization string */ public static String authenticate(UsernamePasswordCredentials credentials) { + return authenticate(credentials, HttpConstants.DEFAULT_CONTENT_CHARSET); + } + + /** + * Returns a basic <tt>Authorization</tt> header value for the given + * [EMAIL PROTECTED] UsernamePasswordCredentials} and charset. + * + * @param credentials The credentials to encode. + * @param charset The charset to use for encoding the credentials + * + * @return a basic authorization string + */ + public static String authenticate(UsernamePasswordCredentials credentials, String charset) { - LOG.trace("enter BasicScheme.authenticate(UsernamePasswordCredentials)"); + LOG.trace("enter BasicScheme.authenticate(UsernamePasswordCredentials, String)"); if (credentials == null) { throw new IllegalArgumentException("Credentials may not be null"); } + if (charset == null || charset.length() == 0) { + throw new IllegalArgumentException("charset may not be null or empty"); + } StringBuffer buffer = new StringBuffer(); buffer.append(credentials.getUserName()); buffer.append(":"); buffer.append(credentials.getPassword()); return "Basic " + HttpConstants.getAsciiString( - Base64.encode(HttpConstants.getContentBytes(buffer.toString()))); + Base64.encode(EncodingUtil.getBytes(buffer.toString(), charset))); } + } 1.15 +7 -6 jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/auth/HttpAuthenticator.java Index: HttpAuthenticator.java =================================================================== RCS file: /home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/auth/HttpAuthenticator.java,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- HttpAuthenticator.java 10 Dec 2003 21:04:13 -0000 1.14 +++ HttpAuthenticator.java 11 Dec 2003 01:19:32 -0000 1.15 @@ -179,7 +179,6 @@ "Authentication scheme(s) not supported: " + challengemap.toString()); } - private static boolean doAuthenticateDefault( HttpMethod method, HttpConnection conn, @@ -206,7 +205,9 @@ "Credentials cannot be used for basic authentication: " + credentials.toString()); } - String auth = BasicScheme.authenticate((UsernamePasswordCredentials) credentials); + String auth = BasicScheme.authenticate( + (UsernamePasswordCredentials) credentials, + method.getParams().getCredentialCharset()); if (auth != null) { String s = proxy ? PROXY_AUTH_RESP : WWW_AUTH_RESP; Header header = new Header(s, auth, true); @@ -329,7 +330,7 @@ "No credentials available for the '" + realm + "' authentication realm at " + host); } - String auth = authscheme.authenticate(credentials, method.getName(), method.getPath()); + String auth = authscheme.authenticate(credentials, method); if (auth != null) { String s = proxy ? PROXY_AUTH_RESP : WWW_AUTH_RESP; Header header = new Header(s, auth, true); 1.82 +38 -4 jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpConnection.java Index: HttpConnection.java =================================================================== RCS file: /home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpConnection.java,v retrieving revision 1.81 retrieving revision 1.82 diff -u -r1.81 -r1.82 --- HttpConnection.java 11 Nov 2003 17:35:07 -0000 1.81 +++ HttpConnection.java 11 Dec 2003 01:19:32 -0000 1.82 @@ -79,6 +79,7 @@ import org.apache.commons.httpclient.protocol.Protocol; import org.apache.commons.httpclient.protocol.ProtocolSocketFactory; import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory; +import org.apache.commons.httpclient.util.EncodingUtil; import org.apache.commons.httpclient.util.TimeoutController; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -983,6 +984,8 @@ } /** + * @deprecated Use [EMAIL PROTECTED] #print(String, String)} + * * Writes the specified String (as bytes) to the output stream. * * @param data the string to be written @@ -996,6 +999,22 @@ } /** + * Writes the specified String (as bytes) to the output stream. + * + * @param data the string to be written + * @params charset the charset to use for writing the data + * @throws IllegalStateException if the connection is not open + * @throws IOException if an I/O problem occurs + */ + public void print(String data, String charset) + throws IOException, IllegalStateException { + LOG.trace("enter HttpConnection.print(String)"); + write(EncodingUtil.getBytes(data, charset)); + } + + /** + * @deprecated Use [EMAIL PROTECTED] #println(String, String)} + * * Writes the specified String (as bytes), followed by * <tt>"\r\n".getBytes()</tt> to the output stream. * @@ -1009,6 +1028,21 @@ writeLine(HttpConstants.getBytes(data)); } + /** + * Writes the specified String (as bytes), followed by + * <tt>"\r\n".getBytes()</tt> to the output stream. + * + * @param data the data to be written + * @params charset the charset to use for writing the data + * @throws IllegalStateException if the connection is not open + * @throws IOException if an I/O problem occurs + */ + public void printLine(String data, String charset) + throws IOException, IllegalStateException { + LOG.trace("enter HttpConnection.printLine(String)"); + writeLine(EncodingUtil.getBytes(data, charset)); + } + /** * Writes <tt>"\r\n".getBytes()</tt> to the output stream. * 1.24 +5 -5 jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/ConnectMethod.java Index: ConnectMethod.java =================================================================== RCS file: /home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/ConnectMethod.java,v retrieving revision 1.23 retrieving revision 1.24 diff -u -r1.23 -r1.24 --- ConnectMethod.java 10 Dec 2003 21:04:13 -0000 1.23 +++ ConnectMethod.java 11 Dec 2003 01:19:32 -0000 1.24 @@ -222,7 +222,7 @@ } buffer.append(" HTTP/1.1"); String line = buffer.toString(); - conn.printLine(line); + conn.printLine(line, getParams().getHttpElementCharset()); if (Wire.enabled()) { Wire.output(line); } 1.29 +38 -3 jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/MultiThreadedHttpConnectionManager.java Index: MultiThreadedHttpConnectionManager.java =================================================================== RCS file: /home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/MultiThreadedHttpConnectionManager.java,v retrieving revision 1.28 retrieving revision 1.29 diff -u -r1.28 -r1.29 --- MultiThreadedHttpConnectionManager.java 19 Nov 2003 00:43:12 -0000 1.28 +++ MultiThreadedHttpConnectionManager.java 11 Dec 2003 01:19:32 -0000 1.29 @@ -1360,6 +1360,41 @@ } } + /* (non-Javadoc) + * @see org.apache.commons.httpclient.HttpConnection#print(java.lang.String, java.lang.String) + */ + public void print(String data, String charset) throws IOException, IllegalStateException { + if (hasConnection()) { + wrappedConnection.print(data, charset); + } else { + throw new IllegalStateException("Connection has been released"); + } + } + + /* (non-Javadoc) + * @see org.apache.commons.httpclient.HttpConnection#printLine(java.lang.String, java.lang.String) + */ + public void printLine(String data, String charset) + throws IOException, IllegalStateException { + if (hasConnection()) { + wrappedConnection.printLine(data, charset); + } else { + throw new IllegalStateException("Connection has been released"); + } + } + + /* (non-Javadoc) + * @see org.apache.commons.httpclient.HttpConnection#setSocketTimeout(int) + */ + public void setSocketTimeout(int timeout) throws SocketException, IllegalStateException { + // TODO Auto-generated method stub + if (hasConnection()) { + wrappedConnection.setSocketTimeout(timeout); + } else { + throw new IllegalStateException("Connection has been released"); + } + } + } } 1.193 +8 -6 jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpMethodBase.java Index: HttpMethodBase.java =================================================================== RCS file: /home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpMethodBase.java,v retrieving revision 1.192 retrieving revision 1.193 diff -u -r1.192 -r1.193 --- HttpMethodBase.java 10 Dec 2003 21:37:41 -0000 1.192 +++ HttpMethodBase.java 11 Dec 2003 01:19:32 -0000 1.193 @@ -1949,13 +1949,15 @@ + "HttpConnection)"); addRequestHeaders(state, conn); + String charset = getParams().getHttpElementCharset(); + Header[] headers = getRequestHeaders(); for (int i = 0; i < headers.length; i++) { String s = headers[i].toExternalForm(); if (Wire.enabled()) { Wire.output(s); } - conn.print(s); + conn.print(s, charset); } } @@ -1986,7 +1988,7 @@ if (Wire.enabled()) { Wire.output(requestLine); } - conn.print(requestLine); + conn.print(requestLine, getParams().getHttpElementCharset()); } /** 1.2 +34 -3 jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/util/EncodingUtil.java Index: EncodingUtil.java =================================================================== RCS file: /home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/util/EncodingUtil.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- EncodingUtil.java 15 Jul 2003 12:46:33 -0000 1.1 +++ EncodingUtil.java 11 Dec 2003 01:19:33 -0000 1.2 @@ -62,6 +62,7 @@ */ package org.apache.commons.httpclient.util; +import java.io.UnsupportedEncodingException; import java.util.BitSet; import org.apache.commons.httpclient.NameValuePair; @@ -159,6 +160,36 @@ } return buf.toString(); } + + /** + * Converts the specified string to a byte array. If the charset is not supported the + * default system charset is used. + * + * @param data the string to be encoded + * @param charset the desired character encoding + * @return The resulting byte array. + */ + public static byte[] getBytes(final String data, String charset) { + + if (data == null) { + throw new IllegalArgumentException("data may not be null"); + } + + if (charset == null || charset.length() == 0) { + throw new IllegalArgumentException("charset may not be null or empty"); + } + + try { + return data.getBytes(charset); + } catch (UnsupportedEncodingException e) { + + if (LOG.isWarnEnabled()) { + LOG.warn("Unsupported encoding: " + charset + ". System encoding used."); + } + + return data.getBytes(); + } + } /** * This class should not be instantiated.
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]