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 ae...@apache.org on 2005/03/30 13:19:18 UTC

cvs commit: ws-xmlrpc/src/java/org/apache/xmlrpc CommonsXmlRpcTransport.java DefaultXmlRpcTransport.java LiteXmlRpcTransport.java XmlRpc.java XmlRpcClientWorker.java XmlRpcTransport.java

aevers      2005/03/30 03:19:18

  Modified:    src/java/org/apache/xmlrpc CommonsXmlRpcTransport.java
                        DefaultXmlRpcTransport.java
                        LiteXmlRpcTransport.java XmlRpc.java
                        XmlRpcClientWorker.java XmlRpcTransport.java
  Log:
  Bug 20339: LiteXmlRpcTransport throws IOExcpetion 'socket closed'
  
  Fix general resource leaks regarding connections in client side
  transpot code. There is now an endClientRequest() in the
  XmlRpcTransport interface. Appropriate implementations have been
  filled in for all shipped transports.
  
  Passes all tests except Base64 (was already broken). Note, for
  tests to pass you must have commons-logging installed as
  it is used by commons-httpclient.
  
  PR: 20339
  
  Revision  Changes    Path
  1.3       +28 -10    ws-xmlrpc/src/java/org/apache/xmlrpc/CommonsXmlRpcTransport.java
  
  Index: CommonsXmlRpcTransport.java
  ===================================================================
  RCS file: /home/cvs/ws-xmlrpc/src/java/org/apache/xmlrpc/CommonsXmlRpcTransport.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- CommonsXmlRpcTransport.java	26 Dec 2003 16:57:51 -0000	1.2
  +++ CommonsXmlRpcTransport.java	30 Mar 2005 11:19:18 -0000	1.3
  @@ -76,20 +76,28 @@
    * @version $Id$
    * @since 1.2
    */
  -public class CommonsXmlRpcTransport implements XmlRpcTransport {
  +public class CommonsXmlRpcTransport implements XmlRpcTransport 
  +{
       
  +    protected PostMethod method;
  +
       /** Creates a new instance of CommonsXmlRpcTransport */
  -    public CommonsXmlRpcTransport(URL url, HttpClient client) {
  +    public CommonsXmlRpcTransport(URL url, HttpClient client) 
  +    {
           this.url = url;
  -        if (client == null) {
  +        if (client == null) 
  +        {
               HttpClient newClient = new HttpClient();
               this.client = newClient;
  -        } else {
  +        } 
  +        else 
  +        {
               this.client = client;
           }
       }
       
  -    public CommonsXmlRpcTransport(URL url) {
  +    public CommonsXmlRpcTransport(URL url) 
  +    {
           this(url, null);
       }
       
  @@ -98,8 +106,9 @@
       private final Header userAgentHeader = new Header("User-Agent", XmlRpc.version);
       private boolean http11 = false; // defaults to HTTP 1.0
       
  -    public InputStream sendXmlRpc(byte[] request) throws IOException, XmlRpcClientException {
  -        PostMethod method = new PostMethod(url.toString());
  +    public InputStream sendXmlRpc(byte[] request) throws IOException, XmlRpcClientException 
  +    {
  +        method = new PostMethod(url.toString());
           method.setHttp11(http11);
           method.setRequestHeader(new Header("Content-Type", "text/xml"));
           method.setRequestHeader(userAgentHeader);
  @@ -112,11 +121,20 @@
           return method.getResponseBodyAsStream();
       }
       
  -    public void setHttp11(boolean http11) {
  +    public void setHttp11(boolean http11) 
  +    {
           this.http11 = http11;
       }
       
  -    public void setUserAgent(String userAgent) {
  +    public void setUserAgent(String userAgent) 
  +    {
           userAgentHeader.setValue(userAgent);
       }
  +
  +    public void endClientRequest()
  +    throws XmlRpcClientException
  +    {
  +        // Rlease connection resources
  +        method.releaseConnection();
  +    }
   }
  
  
  
  1.3       +16 -2     ws-xmlrpc/src/java/org/apache/xmlrpc/DefaultXmlRpcTransport.java
  
  Index: DefaultXmlRpcTransport.java
  ===================================================================
  RCS file: /home/cvs/ws-xmlrpc/src/java/org/apache/xmlrpc/DefaultXmlRpcTransport.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- DefaultXmlRpcTransport.java	29 Jan 2003 00:46:37 -0000	1.2
  +++ DefaultXmlRpcTransport.java	30 Mar 2005 11:19:18 -0000	1.3
  @@ -75,6 +75,7 @@
   {
       protected URL url;
       protected String auth;
  +    protected URLConnection con;
   
       /**
        * Create a new DefaultXmlRpcTransport with the specified URL and basic
  @@ -104,7 +105,7 @@
       public InputStream sendXmlRpc(byte [] request)
       throws IOException
       {
  -        URLConnection con = url.openConnection();
  +        con = url.openConnection();
           con.setDoInput(true);
           con.setDoOutput(true);
           con.setUseCaches(false);
  @@ -133,4 +134,17 @@
       {
           auth = HttpUtil.encodeBasicAuthentication(user, password);
       }
  +
  +    public void endClientRequest()
  +    throws XmlRpcClientException
  +    {
  +        try
  +        {
  +            con.getInputStream().close();
  +        }
  +        catch (Exception e)
  +        {
  +            throw new XmlRpcClientException("Exception closing URLConnection", e);
  +        }
  +    }
   }
  
  
  
  1.4       +10 -7     ws-xmlrpc/src/java/org/apache/xmlrpc/LiteXmlRpcTransport.java
  
  Index: LiteXmlRpcTransport.java
  ===================================================================
  RCS file: /home/cvs/ws-xmlrpc/src/java/org/apache/xmlrpc/LiteXmlRpcTransport.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- LiteXmlRpcTransport.java	1 May 2003 16:53:15 -0000	1.3
  +++ LiteXmlRpcTransport.java	30 Mar 2005 11:19:18 -0000	1.4
  @@ -147,12 +147,6 @@
                   }
               }
   
  -            // eepalive is always false if XmlRpc.keepalive is false
  -            if (!keepalive)
  -            {
  -                closeConnection ();
  -            }
  -
               return in;
           }
           catch (IOException iox)
  @@ -326,6 +320,15 @@
           auth = HttpUtil.encodeBasicAuthentication(user, password);
       }
   
  +    public void endClientRequest()
  +    {
  +        // eepalive is always false if XmlRpc.keepalive is false
  +        if (!keepalive)
  +        {
  +            closeConnection ();
  +        }
  +    }
  +
       /**
        *
        * @return
  
  
  
  1.38      +41 -2     ws-xmlrpc/src/java/org/apache/xmlrpc/XmlRpc.java
  
  Index: XmlRpc.java
  ===================================================================
  RCS file: /home/cvs/ws-xmlrpc/src/java/org/apache/xmlrpc/XmlRpc.java,v
  retrieving revision 1.37
  retrieving revision 1.38
  diff -u -r1.37 -r1.38
  --- XmlRpc.java	30 Jun 2004 06:11:55 -0000	1.37
  +++ XmlRpc.java	30 Mar 2005 11:19:18 -0000	1.38
  @@ -56,6 +56,7 @@
    */
   
   import java.io.InputStream;
  +import java.io.InputStreamReader;
   import java.util.Hashtable;
   import java.util.Stack;
   import java.util.Vector;
  @@ -188,6 +189,15 @@
        */
       static String encoding = XmlWriter.ISO8859_1;
   
  +    /**
  +     * Java's name for the input encoding we're using.  Defaults to
  +     * <code>null</code>, signifying the platform default. This may
  +     * need to be overridden on platforms where the default encoding
  +     * is not compatible with ASCII (eg. EBCDIC) but the network is
  +     * still ASCII-like.
  +     */
  +    static String inputEncoding = null;
  + 
       private TypeFactory typeFactory;
   
       /**
  @@ -342,6 +352,28 @@
       }
   
       /**
  +     * Set the input encoding of the XML.
  +     * This is used only if set.
  +     *
  +     * @param enc The Java name of the encoding.
  +     */
  +    public static void setInputEncoding(String enc)
  +    {
  +        inputEncoding = enc;
  +    }
  +
  +    /**
  +     * Return the input encoding. This may be null. This is always a
  +     * Java encoding name, it is not transformed.
  +     *
  +     * @return the Java encoding name to use, if set, otherwise null.
  +     */
  +    public static String getInputEncoding ()
  +    {
  +        return inputEncoding;
  +    }
  +
  +    /**
        * Gets the maximum number of threads used at any given moment.
        */
       public static int getMaxThreads()
  @@ -440,7 +472,14 @@
           }
           try
           {
  -            parser.parse(new InputSource (is));
  +            if(inputEncoding == null)
  +            {         
  +              parser.parse(new InputSource (is));
  +            }
  +            else
  +            {
  +              parser.parse( new InputSource( new InputStreamReader(is, inputEncoding)));
  +            }
           }
           finally
           {
  
  
  
  1.2       +8 -0      ws-xmlrpc/src/java/org/apache/xmlrpc/XmlRpcClientWorker.java
  
  Index: XmlRpcClientWorker.java
  ===================================================================
  RCS file: /home/cvs/ws-xmlrpc/src/java/org/apache/xmlrpc/XmlRpcClientWorker.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XmlRpcClientWorker.java	5 Dec 2002 08:49:24 -0000	1.1
  +++ XmlRpcClientWorker.java	30 Mar 2005 11:19:18 -0000	1.2
  @@ -136,6 +136,14 @@
                   System.out.println("Spent " + (System.currentTimeMillis() - now)
                                      + " millis in request/process/response");
               }
  +            try
  +            {
  +                transport.endClientRequest();
  +            }
  +            catch (RuntimeException re)
  +            {
  +                throw new XmlRpcClientException("Transport exception in endClientRequest()", re);
  +            }
           }
       }
   
  
  
  
  1.2       +19 -1     ws-xmlrpc/src/java/org/apache/xmlrpc/XmlRpcTransport.java
  
  Index: XmlRpcTransport.java
  ===================================================================
  RCS file: /home/cvs/ws-xmlrpc/src/java/org/apache/xmlrpc/XmlRpcTransport.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XmlRpcTransport.java	5 Dec 2002 08:49:24 -0000	1.1
  +++ XmlRpcTransport.java	30 Mar 2005 11:19:18 -0000	1.2
  @@ -68,6 +68,24 @@
    */
   public interface XmlRpcTransport
   {
  +  /**
  +   * Send an XML-RPC message. This method is called to send a message to the
  +   * other party.
  +   *
  +   * @param request the request in network encoding.
  +   *
  +   * @throws IOException if an IOException occurs in the IO level of the transport.
  +   * @throws XmlRpcClientException if an exception occurs in the transport.
  +   */
     public InputStream sendXmlRpc(byte [] request)
     throws IOException, XmlRpcClientException;
  +
  +  /**
  +   * End an XML-RPC request. This method is called by the XmlRpcClient when then
  +   * request has been sent and the response (or an exception) recieved.
  +   *
  +   * @throws XmlRpcClientException if an exception occurs in the transport.
  +   */
  +  public void endClientRequest()
  +  throws XmlRpcClientException;
   }
  
  
  

Re: cvs commit: ws-xmlrpc/src/java/org/apache/xmlrpc CommonsXmlRpcTransport.java DefaultXmlRpcTransport.java LiteXmlRpcTransport.java XmlRpc.java XmlRpcClientWorker.java XmlRpcTransport.java

Posted by Henri Gomez <he...@gmail.com>.
What about adding my fixes to support gzip compression ?


On 30 Mar 2005 11:19:18 -0000, aevers@apache.org <ae...@apache.org> wrote:
> aevers      2005/03/30 03:19:18
> 
>   Modified:    src/java/org/apache/xmlrpc CommonsXmlRpcTransport.java
>                         DefaultXmlRpcTransport.java
>                         LiteXmlRpcTransport.java XmlRpc.java
>                         XmlRpcClientWorker.java XmlRpcTransport.java
>   Log:
>   Bug 20339: LiteXmlRpcTransport throws IOExcpetion 'socket closed'
> 
>   Fix general resource leaks regarding connections in client side
>   transpot code. There is now an endClientRequest() in the
>   XmlRpcTransport interface. Appropriate implementations have been
>   filled in for all shipped transports.
> 
>   Passes all tests except Base64 (was already broken). Note, for
>   tests to pass you must have commons-logging installed as
>   it is used by commons-httpclient.
> 
>   PR: 20339
> 
>   Revision  Changes    Path
>   1.3       +28 -10    ws-xmlrpc/src/java/org/apache/xmlrpc/CommonsXmlRpcTransport.java
> 
>   Index: CommonsXmlRpcTransport.java
>   ===================================================================
>   RCS file: /home/cvs/ws-xmlrpc/src/java/org/apache/xmlrpc/CommonsXmlRpcTransport.java,v
>   retrieving revision 1.2
>   retrieving revision 1.3
>   diff -u -r1.2 -r1.3
>   --- CommonsXmlRpcTransport.java       26 Dec 2003 16:57:51 -0000      1.2
>   +++ CommonsXmlRpcTransport.java       30 Mar 2005 11:19:18 -0000      1.3
>   @@ -76,20 +76,28 @@
>     * @version $Id$
>     * @since 1.2
>     */
>   -public class CommonsXmlRpcTransport implements XmlRpcTransport {
>   +public class CommonsXmlRpcTransport implements XmlRpcTransport
>   +{
> 
>   +    protected PostMethod method;
>   +
>        /** Creates a new instance of CommonsXmlRpcTransport */
>   -    public CommonsXmlRpcTransport(URL url, HttpClient client) {
>   +    public CommonsXmlRpcTransport(URL url, HttpClient client)
>   +    {
>            this.url = url;
>   -        if (client == null) {
>   +        if (client == null)
>   +        {
>                HttpClient newClient = new HttpClient();
>                this.client = newClient;
>   -        } else {
>   +        }
>   +        else
>   +        {
>                this.client = client;
>            }
>        }
> 
>   -    public CommonsXmlRpcTransport(URL url) {
>   +    public CommonsXmlRpcTransport(URL url)
>   +    {
>            this(url, null);
>        }
> 
>   @@ -98,8 +106,9 @@
>        private final Header userAgentHeader = new Header("User-Agent", XmlRpc.version);
>        private boolean http11 = false; // defaults to HTTP 1.0
> 
>   -    public InputStream sendXmlRpc(byte[] request) throws IOException, XmlRpcClientException {
>   -        PostMethod method = new PostMethod(url.toString());
>   +    public InputStream sendXmlRpc(byte[] request) throws IOException, XmlRpcClientException
>   +    {
>   +        method = new PostMethod(url.toString());
>            method.setHttp11(http11);
>            method.setRequestHeader(new Header("Content-Type", "text/xml"));
>            method.setRequestHeader(userAgentHeader);
>   @@ -112,11 +121,20 @@
>            return method.getResponseBodyAsStream();
>        }
> 
>   -    public void setHttp11(boolean http11) {
>   +    public void setHttp11(boolean http11)
>   +    {
>            this.http11 = http11;
>        }
> 
>   -    public void setUserAgent(String userAgent) {
>   +    public void setUserAgent(String userAgent)
>   +    {
>            userAgentHeader.setValue(userAgent);
>        }
>   +
>   +    public void endClientRequest()
>   +    throws XmlRpcClientException
>   +    {
>   +        // Rlease connection resources
>   +        method.releaseConnection();
>   +    }
>    }
> 
>   1.3       +16 -2     ws-xmlrpc/src/java/org/apache/xmlrpc/DefaultXmlRpcTransport.java
> 
>   Index: DefaultXmlRpcTransport.java
>   ===================================================================
>   RCS file: /home/cvs/ws-xmlrpc/src/java/org/apache/xmlrpc/DefaultXmlRpcTransport.java,v
>   retrieving revision 1.2
>   retrieving revision 1.3
>   diff -u -r1.2 -r1.3
>   --- DefaultXmlRpcTransport.java       29 Jan 2003 00:46:37 -0000      1.2
>   +++ DefaultXmlRpcTransport.java       30 Mar 2005 11:19:18 -0000      1.3
>   @@ -75,6 +75,7 @@
>    {
>        protected URL url;
>        protected String auth;
>   +    protected URLConnection con;
> 
>        /**
>         * Create a new DefaultXmlRpcTransport with the specified URL and basic
>   @@ -104,7 +105,7 @@
>        public InputStream sendXmlRpc(byte [] request)
>        throws IOException
>        {
>   -        URLConnection con = url.openConnection();
>   +        con = url.openConnection();
>            con.setDoInput(true);
>            con.setDoOutput(true);
>            con.setUseCaches(false);
>   @@ -133,4 +134,17 @@
>        {
>            auth = HttpUtil.encodeBasicAuthentication(user, password);
>        }
>   +
>   +    public void endClientRequest()
>   +    throws XmlRpcClientException
>   +    {
>   +        try
>   +        {
>   +            con.getInputStream().close();
>   +        }
>   +        catch (Exception e)
>   +        {
>   +            throw new XmlRpcClientException("Exception closing URLConnection", e);
>   +        }
>   +    }
>    }
> 
>   1.4       +10 -7     ws-xmlrpc/src/java/org/apache/xmlrpc/LiteXmlRpcTransport.java
> 
>   Index: LiteXmlRpcTransport.java
>   ===================================================================
>   RCS file: /home/cvs/ws-xmlrpc/src/java/org/apache/xmlrpc/LiteXmlRpcTransport.java,v
>   retrieving revision 1.3
>   retrieving revision 1.4
>   diff -u -r1.3 -r1.4
>   --- LiteXmlRpcTransport.java  1 May 2003 16:53:15 -0000       1.3
>   +++ LiteXmlRpcTransport.java  30 Mar 2005 11:19:18 -0000      1.4
>   @@ -147,12 +147,6 @@
>                    }
>                }
> 
>   -            // eepalive is always false if XmlRpc.keepalive is false
>   -            if (!keepalive)
>   -            {
>   -                closeConnection ();
>   -            }
>   -
>                return in;
>            }
>            catch (IOException iox)
>   @@ -326,6 +320,15 @@
>            auth = HttpUtil.encodeBasicAuthentication(user, password);
>        }
> 
>   +    public void endClientRequest()
>   +    {
>   +        // eepalive is always false if XmlRpc.keepalive is false
>   +        if (!keepalive)
>   +        {
>   +            closeConnection ();
>   +        }
>   +    }
>   +
>        /**
>         *
>         * @return
> 
>   1.38      +41 -2     ws-xmlrpc/src/java/org/apache/xmlrpc/XmlRpc.java
> 
>   Index: XmlRpc.java
>   ===================================================================
>   RCS file: /home/cvs/ws-xmlrpc/src/java/org/apache/xmlrpc/XmlRpc.java,v
>   retrieving revision 1.37
>   retrieving revision 1.38
>   diff -u -r1.37 -r1.38
>   --- XmlRpc.java       30 Jun 2004 06:11:55 -0000      1.37
>   +++ XmlRpc.java       30 Mar 2005 11:19:18 -0000      1.38
>   @@ -56,6 +56,7 @@
>     */
> 
>    import java.io.InputStream;
>   +import java.io.InputStreamReader;
>    import java.util.Hashtable;
>    import java.util.Stack;
>    import java.util.Vector;
>   @@ -188,6 +189,15 @@
>         */
>        static String encoding = XmlWriter.ISO8859_1;
> 
>   +    /**
>   +     * Java's name for the input encoding we're using.  Defaults to
>   +     * <code>null</code>, signifying the platform default. This may
>   +     * need to be overridden on platforms where the default encoding
>   +     * is not compatible with ASCII (eg. EBCDIC) but the network is
>   +     * still ASCII-like.
>   +     */
>   +    static String inputEncoding = null;
>   +
>        private TypeFactory typeFactory;
> 
>        /**
>   @@ -342,6 +352,28 @@
>        }
> 
>        /**
>   +     * Set the input encoding of the XML.
>   +     * This is used only if set.
>   +     *
>   +     * @param enc The Java name of the encoding.
>   +     */
>   +    public static void setInputEncoding(String enc)
>   +    {
>   +        inputEncoding = enc;
>   +    }
>   +
>   +    /**
>   +     * Return the input encoding. This may be null. This is always a
>   +     * Java encoding name, it is not transformed.
>   +     *
>   +     * @return the Java encoding name to use, if set, otherwise null.
>   +     */
>   +    public static String getInputEncoding ()
>   +    {
>   +        return inputEncoding;
>   +    }
>   +
>   +    /**
>         * Gets the maximum number of threads used at any given moment.
>         */
>        public static int getMaxThreads()
>   @@ -440,7 +472,14 @@
>            }
>            try
>            {
>   -            parser.parse(new InputSource (is));
>   +            if(inputEncoding == null)
>   +            {
>   +              parser.parse(new InputSource (is));
>   +            }
>   +            else
>   +            {
>   +              parser.parse( new InputSource( new InputStreamReader(is, inputEncoding)));
>   +            }
>            }
>            finally
>            {
> 
>   1.2       +8 -0      ws-xmlrpc/src/java/org/apache/xmlrpc/XmlRpcClientWorker.java
> 
>   Index: XmlRpcClientWorker.java
>   ===================================================================
>   RCS file: /home/cvs/ws-xmlrpc/src/java/org/apache/xmlrpc/XmlRpcClientWorker.java,v
>   retrieving revision 1.1
>   retrieving revision 1.2
>   diff -u -r1.1 -r1.2
>   --- XmlRpcClientWorker.java   5 Dec 2002 08:49:24 -0000       1.1
>   +++ XmlRpcClientWorker.java   30 Mar 2005 11:19:18 -0000      1.2
>   @@ -136,6 +136,14 @@
>                    System.out.println("Spent " + (System.currentTimeMillis() - now)
>                                       + " millis in request/process/response");
>                }
>   +            try
>   +            {
>   +                transport.endClientRequest();
>   +            }
>   +            catch (RuntimeException re)
>   +            {
>   +                throw new XmlRpcClientException("Transport exception in endClientRequest()", re);
>   +            }
>            }
>        }
> 
>   1.2       +19 -1     ws-xmlrpc/src/java/org/apache/xmlrpc/XmlRpcTransport.java
> 
>   Index: XmlRpcTransport.java
>   ===================================================================
>   RCS file: /home/cvs/ws-xmlrpc/src/java/org/apache/xmlrpc/XmlRpcTransport.java,v
>   retrieving revision 1.1
>   retrieving revision 1.2
>   diff -u -r1.1 -r1.2
>   --- XmlRpcTransport.java      5 Dec 2002 08:49:24 -0000       1.1
>   +++ XmlRpcTransport.java      30 Mar 2005 11:19:18 -0000      1.2
>   @@ -68,6 +68,24 @@
>     */
>    public interface XmlRpcTransport
>    {
>   +  /**
>   +   * Send an XML-RPC message. This method is called to send a message to the
>   +   * other party.
>   +   *
>   +   * @param request the request in network encoding.
>   +   *
>   +   * @throws IOException if an IOException occurs in the IO level of the transport.
>   +   * @throws XmlRpcClientException if an exception occurs in the transport.
>   +   */
>      public InputStream sendXmlRpc(byte [] request)
>      throws IOException, XmlRpcClientException;
>   +
>   +  /**
>   +   * End an XML-RPC request. This method is called by the XmlRpcClient when then
>   +   * request has been sent and the response (or an exception) recieved.
>   +   *
>   +   * @throws XmlRpcClientException if an exception occurs in the transport.
>   +   */
>   +  public void endClientRequest()
>   +  throws XmlRpcClientException;
>    }
> 
>