You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xmlrpc-dev@ws.apache.org by "Jochen Wiedmann (JIRA)" <xm...@ws.apache.org> on 2006/04/12 00:01:22 UTC

[jira] Geschlossen: (XMLRPC-77) Base64 encoder wraps lines (HTTP auth not possible)

     [ http://issues.apache.org/jira/browse/XMLRPC-77?page=all ]
     
Jochen Wiedmann closed XMLRPC-77:
---------------------------------

    Resolution: Fixed

Fixed in the CVS version and the nightly builds.


> Base64 encoder wraps lines (HTTP auth not possible)
> ---------------------------------------------------
>
>          Key: XMLRPC-77
>          URL: http://issues.apache.org/jira/browse/XMLRPC-77
>      Project: XML-RPC
>         Type: Bug

>   Components: Source
>     Versions: 3.0a1
>  Environment: this bug affects all environments.
>     Reporter: Felix Schwarz

>
> I am using xmlrpc 3.0a1 and when I try to do http auth I always get 
> Exception in thread "main" java.lang.IllegalArgumentException: Illegal character(s) in message header value: Basic ZnM6dGVzdA==
> at sun.net.www.protocol.http.HttpURLConnection.checkMessageHeader(HttpURLConnection.java:301)
> at sun.net.www.protocol.http.HttpURLConnection.setRequestProperty(HttpURLConnection.java:1936)
> at org.apache.xmlrpc.client.XmlRpcSunHttpTransport.setRequestHeader(XmlRpcSunHttpTransport.java:30)
> at org.apache.xmlrpc.client.XmlRpcHttpTransport.setCredentials(XmlRpcHttpTransport.java:37)
> at org.apache.xmlrpc.client.XmlRpcHttpTransport.initConnection(XmlRpcHttpTransport.java:68)
> at org.apache.xmlrpc.client.XmlRpcStreamTransport.sendRequest(XmlRpcStreamTransport.java:188)
> at org.apache.xmlrpc.client.XmlRpcClientWorker.execute(XmlRpcClientWorker.java:53)
> at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:166)
> at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:136)
> at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:125)
> at SnSnXmlRpcAuth.main(SnSnXmlRpcAuth.java:36)
> code snippet is like:
> server = new URL("http://localhost/RPC2");
> config.setServerURL(server);
> config.setBasicEncoding("iso-8859-1");
> config.setBasicUserName("fs");
> config.setBasicPassword("test");
> XmlRpcClient client = new XmlRpcClient();
> client.setConfig(config);
> Object[] parameters = new Object[] { rootElement };
> client.execute("functionname", parameters);
> After some examination I found that the problem is
> related to encodeBasicAuthentication (org.apache.xmlrpc.util.httpUtil).
> "return new String(Base64.encode(s.getBytes(pEncoding)))" appends a
> "\n" to the string which is not allowed by the Sun libraries (see bug
> 4615330 [1] for a bug report to Sun which has some more details in the
> evaluation). Unfortunately bug 4447135 [2] is not publicly accessible.
> I noticed that xmlrpc 3 uses the Base64 class from common-utils
> instead of codec.binary. The later does not add a newline to the end
> of the encoded string which is the correct behavior.
> Further investigation revealed that the problem is in the call to:
> /** Converts the given byte array into a base64 encoded character
>   * array with the line size {@link #LINE_SIZE} and the separator
>   * {@link #LINE_SEPARATOR}.
>   * @param pBuffer The buffer being encoded.
>   * @return Character array of encoded bytes.
>   */
> public static String encode(byte[] pBuffer) {
>         return encode(pBuffer, 0, pBuffer.length);
> }
> As stated in the javadoc the message will perform a line wrap after
> LINE_SIZE - which is defined as
> /** Default size for line wrapping.
>  */
> public static final int LINE_SIZE = 76;
> As your encoded string is shorter than 76 characters, why does a line
> wrap occur?
>      Obviously the first problem is that there a line wrap at all -
>      but if the wrapping would occur only after 76 characters,
>      probably nobody would ever have noticed the bug...
> In order to explain that, look at the following method
> public void flush() throws IOException {
> which contains the following statement:
> if (wrapSize > 0  &&  lineChars > 0) {
>    wrap();
> }
> At there it is: If LINE_SIZE is not set to 0 (no wrapping), the Base64
> encoder will *always* add a newline at the end.
> I don't know if the authors wanted to have a base64 encoder which does
> wrapping by default (most encoders I know do not) but posted a
> test case which reveals both bugs (you will have to adapt the import
> statement though) in the user mailing 
> If the wrapping for encode(byte[] pBuffer) is a feature, I propose the
> addition of
>         /** Converts the given byte array into a base64 encoded character
>          * array without line wrapping.
>          * @param pBuffer The buffer being encoded.
>          * @return Character array of encoded bytes.
>          */
>         public static String encode_nowrap(byte[] pBuffer) {
>                 return encode(pBuffer, 0, pBuffer.length, 0, null);
>         }
> which does no wrapping at all.
> Furthermore I consider the javadoc for encode(byte[] pBuffer) to be
> broken as it does not state clearly that the call will append a
> newline every time.
> [1] http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4615330
> [2] http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4447135

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira