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;
> }
>
>