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 jo...@apache.org on 2005/05/21 04:37:08 UTC

cvs commit: ws-xmlrpc/src/java/org/apache/xmlrpc/webserver Connection.java ServerInputStream.java

jochen      2005/05/20 19:37:08

  Modified:    src/java/org/apache/xmlrpc/util Tag: b20050512_streaming
                        HttpUtil.java
               src/java/org/apache/xmlrpc/client Tag: b20050512_streaming
                        XmlRpcStreamTransport.java
                        XmlRpcLocalStreamTransport.java
                        XmlRpcLocalStreamTransportFactory.java
                        XmlRpcSunHttpTransportFactory.java
                        XmlRpcCommonsTransport.java
                        XmlRpcSunHttpTransport.java
                        XmlRpcHttpTransport.java
                        XmlRpcCommonsTransportFactory.java
               src/test/org/apache/xmlrpc/test Tag: b20050512_streaming
                        SunHttpTransportProvider.java
                        WebServerProvider.java BaseTest.java
                        CommonsProvider.java
               src/java/org/apache/xmlrpc/webserver Tag:
                        b20050512_streaming Connection.java
  Added:       src/java/org/apache/xmlrpc/util Tag: b20050512_streaming
                        LimitedInputStream.java
               src/java/org/apache/xmlrpc/client Tag: b20050512_streaming
                        XmlRpcLiteHttpTransport.java
                        XmlRpcLiteHttpTransportFactory.java
               src/test/org/apache/xmlrpc/test Tag: b20050512_streaming
                        LiteTransportProvider.java MiniTest.java
  Removed:     src/java/org/apache/xmlrpc/webserver Tag:
                        b20050512_streaming ServerInputStream.java
  Log:
  Ported the Lite transport.
  
  Revision  Changes    Path
  No                   revision
  No                   revision
  1.4.2.2   +29 -0     ws-xmlrpc/src/java/org/apache/xmlrpc/util/HttpUtil.java
  
  Index: HttpUtil.java
  ===================================================================
  RCS file: /home/cvs/ws-xmlrpc/src/java/org/apache/xmlrpc/util/HttpUtil.java,v
  retrieving revision 1.4.2.1
  retrieving revision 1.4.2.2
  diff -u -r1.4.2.1 -r1.4.2.2
  --- HttpUtil.java	12 May 2005 01:58:53 -0000	1.4.2.1
  +++ HttpUtil.java	21 May 2005 02:37:07 -0000	1.4.2.2
  @@ -15,6 +15,8 @@
    */
   package org.apache.xmlrpc.util;
   
  +import java.io.IOException;
  +import java.io.InputStream;
   import java.io.UnsupportedEncodingException;
   import java.util.StringTokenizer;
   
  @@ -65,4 +67,31 @@
           }
           return false;
       }
  +
  +	/** Reads a header line from the input stream <code>pIn</code>
  +	 * and converts it into a string.
  +	 * @param pIn The input stream being read.
  +	 * @param pBuffer A buffer being used for temporary storage.
  +	 * The buffers length is a limit of the header lines length.
  +	 * @return Next header line or null, if no more header lines
  +	 * are available.
  +	 * @throws IOException Reading the header line failed.
  +	 */
  +	public static String readLine(InputStream pIn, byte[] pBuffer) throws IOException {
  +        int next;
  +        int count = 0;
  +        while (true) {
  +            next = pIn.read();
  +            if (next < 0 || next == '\n') {
  +                break;
  +            }
  +            if (next != '\r') {
  +                pBuffer[count++] = (byte) next;
  +            }
  +            if (count >= pBuffer.length) {
  +                throw new IOException ("HTTP Header too long");
  +            }
  +        }
  +        return new String(pBuffer, 0, count);
  +    }
   }
  
  
  
  No                   revision
  
  Index: HttpUtil.java
  ===================================================================
  RCS file: /home/cvs/ws-xmlrpc/src/java/org/apache/xmlrpc/util/HttpUtil.java,v
  retrieving revision 1.4.2.1
  retrieving revision 1.4.2.2
  diff -u -r1.4.2.1 -r1.4.2.2
  --- HttpUtil.java	12 May 2005 01:58:53 -0000	1.4.2.1
  +++ HttpUtil.java	21 May 2005 02:37:07 -0000	1.4.2.2
  @@ -15,6 +15,8 @@
    */
   package org.apache.xmlrpc.util;
   
  +import java.io.IOException;
  +import java.io.InputStream;
   import java.io.UnsupportedEncodingException;
   import java.util.StringTokenizer;
   
  @@ -65,4 +67,31 @@
           }
           return false;
       }
  +
  +	/** Reads a header line from the input stream <code>pIn</code>
  +	 * and converts it into a string.
  +	 * @param pIn The input stream being read.
  +	 * @param pBuffer A buffer being used for temporary storage.
  +	 * The buffers length is a limit of the header lines length.
  +	 * @return Next header line or null, if no more header lines
  +	 * are available.
  +	 * @throws IOException Reading the header line failed.
  +	 */
  +	public static String readLine(InputStream pIn, byte[] pBuffer) throws IOException {
  +        int next;
  +        int count = 0;
  +        while (true) {
  +            next = pIn.read();
  +            if (next < 0 || next == '\n') {
  +                break;
  +            }
  +            if (next != '\r') {
  +                pBuffer[count++] = (byte) next;
  +            }
  +            if (count >= pBuffer.length) {
  +                throw new IOException ("HTTP Header too long");
  +            }
  +        }
  +        return new String(pBuffer, 0, count);
  +    }
   }
  
  
  
  No                   revision
  
  Index: HttpUtil.java
  ===================================================================
  RCS file: /home/cvs/ws-xmlrpc/src/java/org/apache/xmlrpc/util/HttpUtil.java,v
  retrieving revision 1.4.2.1
  retrieving revision 1.4.2.2
  diff -u -r1.4.2.1 -r1.4.2.2
  --- HttpUtil.java	12 May 2005 01:58:53 -0000	1.4.2.1
  +++ HttpUtil.java	21 May 2005 02:37:07 -0000	1.4.2.2
  @@ -15,6 +15,8 @@
    */
   package org.apache.xmlrpc.util;
   
  +import java.io.IOException;
  +import java.io.InputStream;
   import java.io.UnsupportedEncodingException;
   import java.util.StringTokenizer;
   
  @@ -65,4 +67,31 @@
           }
           return false;
       }
  +
  +	/** Reads a header line from the input stream <code>pIn</code>
  +	 * and converts it into a string.
  +	 * @param pIn The input stream being read.
  +	 * @param pBuffer A buffer being used for temporary storage.
  +	 * The buffers length is a limit of the header lines length.
  +	 * @return Next header line or null, if no more header lines
  +	 * are available.
  +	 * @throws IOException Reading the header line failed.
  +	 */
  +	public static String readLine(InputStream pIn, byte[] pBuffer) throws IOException {
  +        int next;
  +        int count = 0;
  +        while (true) {
  +            next = pIn.read();
  +            if (next < 0 || next == '\n') {
  +                break;
  +            }
  +            if (next != '\r') {
  +                pBuffer[count++] = (byte) next;
  +            }
  +            if (count >= pBuffer.length) {
  +                throw new IOException ("HTTP Header too long");
  +            }
  +        }
  +        return new String(pBuffer, 0, count);
  +    }
   }
  
  
  
  1.1.2.1   +91 -0     ws-xmlrpc/src/java/org/apache/xmlrpc/util/Attic/LimitedInputStream.java
  
  
  
  
  No                   revision
  No                   revision
  1.1.2.5   +52 -14    ws-xmlrpc/src/java/org/apache/xmlrpc/client/Attic/XmlRpcStreamTransport.java
  
  Index: XmlRpcStreamTransport.java
  ===================================================================
  RCS file: /home/cvs/ws-xmlrpc/src/java/org/apache/xmlrpc/client/Attic/XmlRpcStreamTransport.java,v
  retrieving revision 1.1.2.4
  retrieving revision 1.1.2.5
  diff -u -r1.1.2.4 -r1.1.2.5
  --- XmlRpcStreamTransport.java	14 May 2005 21:17:48 -0000	1.1.2.4
  +++ XmlRpcStreamTransport.java	21 May 2005 02:37:08 -0000	1.1.2.5
  @@ -42,7 +42,6 @@
    * the response,
    */
   public abstract class XmlRpcStreamTransport extends XmlRpcTransportImpl {
  -	private final XmlRpcTransportFactory factory;
   	private static final SAXParserFactory spf;
   	static {
   		spf = SAXParserFactory.newInstance();
  @@ -52,16 +51,8 @@
   
   	/** Creates a new instance on behalf of the given client.
   	 */
  -	protected XmlRpcStreamTransport(XmlRpcClient pClient, XmlRpcTransportFactory pFactory) {
  +	protected XmlRpcStreamTransport(XmlRpcClient pClient) {
   		super(pClient);
  -		factory = pFactory;
  -	}
  -
  -	/** Returns the factory, which created this transport.
  -	 * @return The transport factory.
  -	 */
  -	public XmlRpcTransportFactory getFactory() {
  -		return factory;
   	}
   
   	/** Creates the connection object. The connection object is a
  @@ -126,6 +117,18 @@
   	protected abstract InputStream newInputStream(XmlRpcStreamRequestConfig pConfig, Object pConnection)
   			throws XmlRpcException;
   
  +	/** Creates a new input stream for reading the response.
  +	 * @param pConfig The clients configuration.
  +	 * @param pConnection The connection object.
  +	 * @param pContent A byte array with the response.
  +	 * @return Opened input stream for reading data.
  +	 * @throws XmlRpcException Creating the input stream failed.
  +	 */
  +	protected abstract InputStream newInputStream(XmlRpcStreamRequestConfig pConfig,
  +												  Object pConnection,
  +												  byte[] pContent)
  +			throws XmlRpcException;
  +
   	/** Closes the opened input stream, indicating that no more data is being
   	 * read.
   	 * @param pStream The stream being closed.
  @@ -146,9 +149,15 @@
   	 */
   	protected abstract boolean isResponseGzipCompressed(XmlRpcStreamRequestConfig pConfig, Object pConnection);
   
  -	protected InputStream getInputStream(XmlRpcStreamRequestConfig pConfig, Object pConnection)
  +	protected InputStream getInputStream(XmlRpcStreamRequestConfig pConfig, Object pConnection,
  +										 byte[] pContent)
   			throws XmlRpcException {
  -		InputStream istream = newInputStream(pConfig, pConnection);
  +		InputStream istream;
  +		if (pContent == null) {
  +			istream = newInputStream(pConfig, pConnection);
  +		} else {
  +			istream = newInputStream(pConfig, pConnection, pContent);
  +		}
   		if (isResponseGzipCompressed(pConfig, pConnection)) {
   			try {
   				istream = new GZIPInputStream(istream);
  @@ -159,12 +168,41 @@
   		return istream;
   	}
   
  +	/** If this method returns true, then the method
  +	 * {@link #newInputStream(XmlRpcStreamRequestConfig, Object, byte[])}
  +	 * will be invoked to create the response. Otherwise, the methods
  +	 * {@link #getOutputStream(XmlRpcStreamRequestConfig, Object)}, and
  +	 * {@link #newInputStream(XmlRpcStreamRequestConfig, Object)} will
  +	 * be used.
  +	 * @return Whether conversion into a byte array is required to create
  +	 * the response.
  +	 */
  +	protected boolean isUsingByteArrayOutput(XmlRpcStreamRequestConfig pConfig) {
  +		return false;
  +	}
  +
   	public Object sendRequest(XmlRpcRequest pRequest) throws XmlRpcException {
   		XmlRpcStreamRequestConfig config = (XmlRpcStreamRequestConfig) pRequest.getConfig();
   		Object connection = newConnection(config);
   		try {
   			initConnection(config, connection);
  -			OutputStream ostream = getOutputStream(config, connection);
  +			OutputStream ostream;
  +			ByteArrayOutputStream baos;
  +			if (isUsingByteArrayOutput(config)) {
  +				baos = new ByteArrayOutputStream();
  +				if (config.isGzipCompressing()) {
  +					try {
  +						ostream = new GZIPOutputStream(baos);
  +					} catch (IOException e) {
  +						throw new XmlRpcClientException("Failed to create GZIPOutputStream: " + e.getMessage(), e);
  +					}
  +				} else {
  +					ostream = baos;
  +				}
  +			} else {
  +				baos = null;
  +				ostream = getOutputStream(config, connection);
  +			}
   			try {
   				writeRequest(config, ostream, pRequest);
   				closeOutputStream(ostream);
  @@ -172,7 +210,7 @@
   			} finally {
   				if (ostream != null) { try { closeOutputStream(ostream); } catch (Throwable ignore) {} }
   			}
  -			InputStream istream = getInputStream(config, connection);
  +			InputStream istream = getInputStream(config, connection, baos == null ? null : baos.toByteArray());
   			Object result;
   			try {
   				result = readResponse(config, istream);
  
  
  
  1.1.2.2   +6 -3      ws-xmlrpc/src/java/org/apache/xmlrpc/client/Attic/XmlRpcLocalStreamTransport.java
  
  Index: XmlRpcLocalStreamTransport.java
  ===================================================================
  RCS file: /home/cvs/ws-xmlrpc/src/java/org/apache/xmlrpc/client/Attic/XmlRpcLocalStreamTransport.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- XmlRpcLocalStreamTransport.java	12 May 2005 01:58:51 -0000	1.1.2.1
  +++ XmlRpcLocalStreamTransport.java	21 May 2005 02:37:08 -0000	1.1.2.2
  @@ -65,10 +65,9 @@
   
   	/** Creates a new instance.
   	 * @param pClient The client, which is controlling the transport.
  -	 * @param pFactory The factory creating the transport.
   	 */
  -	public XmlRpcLocalStreamTransport(XmlRpcClient pClient, XmlRpcLocalStreamTransportFactory pFactory) {
  -		super(pClient, pFactory);
  +	public XmlRpcLocalStreamTransport(XmlRpcClient pClient) {
  +		super(pClient);
   	}
   
   	protected Object newConnection(XmlRpcStreamRequestConfig pConfig) throws XmlRpcClientException {
  @@ -102,4 +101,8 @@
   	protected boolean isResponseGzipCompressed(XmlRpcStreamRequestConfig pConfig, Object pConnection) {
   		return pConfig.isGzipRequesting();
   	}
  +
  +	protected InputStream newInputStream(XmlRpcStreamRequestConfig pConfig, Object pConnection, byte[] pContent) throws XmlRpcException {
  +		throw new IllegalStateException("Not implemented");
  +	}
   }
  
  
  
  1.1.2.2   +1 -1      ws-xmlrpc/src/java/org/apache/xmlrpc/client/Attic/XmlRpcLocalStreamTransportFactory.java
  
  Index: XmlRpcLocalStreamTransportFactory.java
  ===================================================================
  RCS file: /home/cvs/ws-xmlrpc/src/java/org/apache/xmlrpc/client/Attic/XmlRpcLocalStreamTransportFactory.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- XmlRpcLocalStreamTransportFactory.java	12 May 2005 01:58:51 -0000	1.1.2.1
  +++ XmlRpcLocalStreamTransportFactory.java	21 May 2005 02:37:08 -0000	1.1.2.2
  @@ -30,7 +30,7 @@
   	 */
   	public XmlRpcLocalStreamTransportFactory(XmlRpcClient pClient) {
   		super(pClient);
  -		LOCAL_STREAM_TRANSPORT = new XmlRpcLocalStreamTransport(pClient, this);
  +		LOCAL_STREAM_TRANSPORT = new XmlRpcLocalStreamTransport(pClient);
   	}
   
   	public XmlRpcTransport getTransport() { return LOCAL_STREAM_TRANSPORT; }
  
  
  
  1.1.2.2   +1 -1      ws-xmlrpc/src/java/org/apache/xmlrpc/client/Attic/XmlRpcSunHttpTransportFactory.java
  
  Index: XmlRpcSunHttpTransportFactory.java
  ===================================================================
  RCS file: /home/cvs/ws-xmlrpc/src/java/org/apache/xmlrpc/client/Attic/XmlRpcSunHttpTransportFactory.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- XmlRpcSunHttpTransportFactory.java	14 May 2005 21:17:48 -0000	1.1.2.1
  +++ XmlRpcSunHttpTransportFactory.java	21 May 2005 02:37:08 -0000	1.1.2.2
  @@ -29,7 +29,7 @@
   	 */
   	public XmlRpcSunHttpTransportFactory(XmlRpcClient pClient) {
   		super(pClient);
  -		HTTP_TRANSPORT = new XmlRpcSunHttpTransport(getClient(), this);
  +		HTTP_TRANSPORT = new XmlRpcSunHttpTransport(pClient);
   	 }
   
   	public XmlRpcTransport getTransport() { return HTTP_TRANSPORT; }
  
  
  
  1.1.2.2   +20 -8     ws-xmlrpc/src/java/org/apache/xmlrpc/client/Attic/XmlRpcCommonsTransport.java
  
  Index: XmlRpcCommonsTransport.java
  ===================================================================
  RCS file: /home/cvs/ws-xmlrpc/src/java/org/apache/xmlrpc/client/Attic/XmlRpcCommonsTransport.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- XmlRpcCommonsTransport.java	14 May 2005 21:17:48 -0000	1.1.2.1
  +++ XmlRpcCommonsTransport.java	21 May 2005 02:37:08 -0000	1.1.2.2
  @@ -42,22 +42,22 @@
   	private class CommonsConnection {
   		final HttpClient client = new HttpClient();
   		final PostMethod method;
  -		final ByteArrayOutputStream content = new ByteArrayOutputStream();
   		CommonsConnection(XmlRpcHttpClientConfig pConfig) {
   			method = new PostMethod(pConfig.getServerURL().toString());
   	        method.setHttp11(true);
   		}
   	}
   
  +	private String userAgent = super.getUserAgent() + " (Jakarta Commons httpclient Transport)";
  +
   	/** Creates a new instance.
   	 * @param pClient The client, which will be invoking the transport.
  -	 * @param pFactory The factory, which is creating the transport.
   	 */
  -	public XmlRpcCommonsTransport(XmlRpcClient pClient, XmlRpcTransportFactoryImpl pFactory) {
  -		super(pClient, pFactory);
  +	public XmlRpcCommonsTransport(XmlRpcClient pClient) {
  +		super(pClient);
   	}
   
  -	protected String getUserAgent() { return super.getUserAgent() + " (Jakarta Commons httpclient Transport)"; }
  +	protected String getUserAgent() { return userAgent; }
   
   	protected void setRequestHeader(Object pConnection, String pHeader, String pValue) {
   		PostMethod method = ((CommonsConnection) pConnection).method;
  @@ -82,15 +82,27 @@
   	}
   
   	protected OutputStream newOutputStream(XmlRpcStreamRequestConfig pConfig, Object pConnection) throws XmlRpcClientException {
  -		return ((CommonsConnection) pConnection).content;
  +		throw new IllegalStateException("Not implemented");
   	}
   
  +	protected boolean isUsingByteArrayOutput(XmlRpcStreamRequestConfig pConfig) { return true; }
  +
   	protected InputStream newInputStream(XmlRpcStreamRequestConfig pConfig, Object pConnection) throws XmlRpcException {
  +		throw new IllegalStateException("Not implemented");
  +	}
  +
  +	protected void setContentLength(Object pConnection, int pLength) {
  +		CommonsConnection conn = (CommonsConnection) pConnection;
  +		PostMethod method = conn.method;
  +		method.setRequestContentLength(pLength);
  +	}
  +
  +	protected InputStream newInputStream(XmlRpcStreamRequestConfig pConfig, Object pConnection, byte[] pContents)
  +			throws XmlRpcException {
   		XmlRpcHttpClientConfig config = (XmlRpcHttpClientConfig) pConfig;
   		CommonsConnection conn = (CommonsConnection) pConnection;
   		PostMethod method = conn.method;
  -		method.setRequestBody(new ByteArrayInputStream(conn.content.toByteArray()));
  -		method.setRequestContentLength(conn.content.size());
  +		method.setRequestBody(new ByteArrayInputStream(pContents));
   		HostConfiguration hostConfig;
   		try {
   			URI hostURI = new URI(config.getServerURL().toString());
  
  
  
  1.1.2.2   +19 -4     ws-xmlrpc/src/java/org/apache/xmlrpc/client/Attic/XmlRpcSunHttpTransport.java
  
  Index: XmlRpcSunHttpTransport.java
  ===================================================================
  RCS file: /home/cvs/ws-xmlrpc/src/java/org/apache/xmlrpc/client/Attic/XmlRpcSunHttpTransport.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- XmlRpcSunHttpTransport.java	14 May 2005 21:17:48 -0000	1.1.2.1
  +++ XmlRpcSunHttpTransport.java	21 May 2005 02:37:08 -0000	1.1.2.2
  @@ -14,15 +14,16 @@
    * {@link java.net.HttpURLConnection} class.
    */
   public class XmlRpcSunHttpTransport extends XmlRpcHttpTransport {
  +	private final String userAgent = super.getUserAgent() + " (Sun HTTP Transport)";
  +
   	/** Creates a new instance.
   	 * @param pClient The client controlling this instance.
  -	 * @param pFactory The factory creating this instance on behalf of the client.
   	 */
  -	public XmlRpcSunHttpTransport(XmlRpcClient pClient, XmlRpcTransportFactoryImpl pFactory) {
  -		super(pClient, pFactory);
  +	public XmlRpcSunHttpTransport(XmlRpcClient pClient) {
  +		super(pClient);
   	}
   
  -	protected String getUserAgent() { return super.getUserAgent() + " (Sun HTTP Transport)"; }
  +	protected String getUserAgent() { return userAgent; }
   
   	protected void setRequestHeader(Object pConnection, String pHeader, String pValue) {
   		URLConnection conn = (URLConnection) pConnection;
  @@ -66,6 +67,20 @@
   		}
   	}
   
  +	protected InputStream newInputStream(XmlRpcStreamRequestConfig pConfig, Object pConnection,
  +										 byte[] pContent)
  +			throws XmlRpcClientException {
  +		URLConnection conn = (URLConnection) pConnection;
  +		try {
  +			OutputStream ostream = conn.getOutputStream();
  +			ostream.write(pContent);
  +			ostream.close();
  +		} catch (IOException e) {
  +			throw new XmlRpcClientException("Failed to send request to server: " + e.getMessage(), e);
  +		}
  +		return newInputStream(pConfig, pConnection);
  +	}
  +
   	protected boolean isResponseGzipCompressed(XmlRpcStreamRequestConfig pConfig, Object pConnection) {
   		if (pConnection instanceof HttpURLConnection) {
   			HttpURLConnection conn = (HttpURLConnection) pConnection;
  
  
  
  1.1.2.4   +21 -3     ws-xmlrpc/src/java/org/apache/xmlrpc/client/Attic/XmlRpcHttpTransport.java
  
  Index: XmlRpcHttpTransport.java
  ===================================================================
  RCS file: /home/cvs/ws-xmlrpc/src/java/org/apache/xmlrpc/client/Attic/XmlRpcHttpTransport.java,v
  retrieving revision 1.1.2.3
  retrieving revision 1.1.2.4
  diff -u -r1.1.2.3 -r1.1.2.4
  --- XmlRpcHttpTransport.java	14 May 2005 21:17:48 -0000	1.1.2.3
  +++ XmlRpcHttpTransport.java	21 May 2005 02:37:08 -0000	1.1.2.4
  @@ -1,7 +1,9 @@
   package org.apache.xmlrpc.client;
   
  +import java.io.InputStream;
   import java.io.UnsupportedEncodingException;
   
  +import org.apache.xmlrpc.XmlRpcException;
   import org.apache.xmlrpc.common.XmlRpcStreamRequestConfig;
   import org.apache.xmlrpc.util.HttpUtil;
   
  @@ -15,8 +17,8 @@
   	 */
   	public static final String USER_AGENT = "Apache XML RPC 3.0";
   
  -	protected XmlRpcHttpTransport(XmlRpcClient pClient, XmlRpcTransportFactoryImpl pFactory) {
  -		super(pClient, pFactory);
  +	protected XmlRpcHttpTransport(XmlRpcClient pClient) {
  +		super(pClient);
   	}
   
   	protected abstract void setRequestHeader(Object pConnection, String pHeader, String pValue);
  @@ -36,6 +38,17 @@
   		}
   	}
   
  +	protected void setContentLength(Object pConnection, int pLength) {
  +		setRequestHeader(pConnection, "Content-Length", Integer.toString(pLength));
  +	}
  +
  +	protected InputStream getInputStream(XmlRpcStreamRequestConfig pConfig, Object pConnection, byte[] pContent) throws XmlRpcException {
  +		if (pContent != null) {
  +			setContentLength(pConnection, pContent.length);
  +		}
  +		return super.getInputStream(pConfig, pConnection, pContent);
  +	}
  +
   	protected void setCompressionHeaders(XmlRpcHttpClientConfig pConfig, Object pConnection) {
   		if (pConfig.isGzipCompressing()) {
   			setRequestHeader(pConnection, "Content-Encoding", "gzip");
  @@ -50,11 +63,16 @@
   	protected void initConnection(XmlRpcStreamRequestConfig pConfig, Object pConnection) throws XmlRpcClientException {
   		super.initConnection(pConfig, pConnection);
   		XmlRpcHttpClientConfig config = (XmlRpcHttpClientConfig) pConfig;
  -		setRequestHeader(pConnection, "Content-Type", "text/html");
  +		setRequestHeader(pConnection, "Content-Type", "text/xml");
   		setRequestHeader(pConnection, "User-Agent", getUserAgent());
   		setCredentials(config, pConnection);
   		setCompressionHeaders(config, pConnection);
   	}
   
   	protected abstract boolean isResponseGzipCompressed(XmlRpcStreamRequestConfig pConfig, Object pConnection);
  +
  +	protected boolean isUsingByteArrayOutput(XmlRpcStreamRequestConfig pConfig) {
  +		return !pConfig.isEnabledForExtensions()
  +			|| !((XmlRpcHttpClientConfig) pConfig).isContentLengthOptional();
  +	}
   }
  
  
  
  1.1.2.2   +1 -1      ws-xmlrpc/src/java/org/apache/xmlrpc/client/Attic/XmlRpcCommonsTransportFactory.java
  
  Index: XmlRpcCommonsTransportFactory.java
  ===================================================================
  RCS file: /home/cvs/ws-xmlrpc/src/java/org/apache/xmlrpc/client/Attic/XmlRpcCommonsTransportFactory.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- XmlRpcCommonsTransportFactory.java	14 May 2005 21:17:48 -0000	1.1.2.1
  +++ XmlRpcCommonsTransportFactory.java	21 May 2005 02:37:08 -0000	1.1.2.2
  @@ -27,7 +27,7 @@
   	 */
   	public XmlRpcCommonsTransportFactory(XmlRpcClient pClient) {
   		super(pClient);
  -		COMMONS_TRANSPORT = new XmlRpcCommonsTransport(pClient, this);
  +		COMMONS_TRANSPORT = new XmlRpcCommonsTransport(pClient);
   	}
   
   	public XmlRpcTransport getTransport() {
  
  
  
  No                   revision
  
  Index: XmlRpcCommonsTransportFactory.java
  ===================================================================
  RCS file: /home/cvs/ws-xmlrpc/src/java/org/apache/xmlrpc/client/Attic/XmlRpcCommonsTransportFactory.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- XmlRpcCommonsTransportFactory.java	14 May 2005 21:17:48 -0000	1.1.2.1
  +++ XmlRpcCommonsTransportFactory.java	21 May 2005 02:37:08 -0000	1.1.2.2
  @@ -27,7 +27,7 @@
   	 */
   	public XmlRpcCommonsTransportFactory(XmlRpcClient pClient) {
   		super(pClient);
  -		COMMONS_TRANSPORT = new XmlRpcCommonsTransport(pClient, this);
  +		COMMONS_TRANSPORT = new XmlRpcCommonsTransport(pClient);
   	}
   
   	public XmlRpcTransport getTransport() {
  
  
  
  No                   revision
  
  Index: XmlRpcCommonsTransportFactory.java
  ===================================================================
  RCS file: /home/cvs/ws-xmlrpc/src/java/org/apache/xmlrpc/client/Attic/XmlRpcCommonsTransportFactory.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- XmlRpcCommonsTransportFactory.java	14 May 2005 21:17:48 -0000	1.1.2.1
  +++ XmlRpcCommonsTransportFactory.java	21 May 2005 02:37:08 -0000	1.1.2.2
  @@ -27,7 +27,7 @@
   	 */
   	public XmlRpcCommonsTransportFactory(XmlRpcClient pClient) {
   		super(pClient);
  -		COMMONS_TRANSPORT = new XmlRpcCommonsTransport(pClient, this);
  +		COMMONS_TRANSPORT = new XmlRpcCommonsTransport(pClient);
   	}
   
   	public XmlRpcTransport getTransport() {
  
  
  
  1.1.2.1   +257 -0    ws-xmlrpc/src/java/org/apache/xmlrpc/client/Attic/XmlRpcLiteHttpTransport.java
  
  
  
  
  1.1.2.1   +31 -0     ws-xmlrpc/src/java/org/apache/xmlrpc/client/Attic/XmlRpcLiteHttpTransportFactory.java
  
  
  
  
  No                   revision
  No                   revision
  1.1.2.2   +2 -2      ws-xmlrpc/src/test/org/apache/xmlrpc/test/Attic/SunHttpTransportProvider.java
  
  Index: SunHttpTransportProvider.java
  ===================================================================
  RCS file: /home/cvs/ws-xmlrpc/src/test/org/apache/xmlrpc/test/Attic/SunHttpTransportProvider.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- SunHttpTransportProvider.java	14 May 2005 21:17:48 -0000	1.1.2.1
  +++ SunHttpTransportProvider.java	21 May 2005 02:37:08 -0000	1.1.2.2
  @@ -30,8 +30,8 @@
   	/** Creates a new instance.
   	 * @param pMapping The test servers handler mapping.
   	 */
  -	public SunHttpTransportProvider(XmlRpcHandlerMapping pMapping) {
  -		super(pMapping);
  +	public SunHttpTransportProvider(XmlRpcHandlerMapping pMapping, boolean pContentLength) {
  +		super(pMapping, pContentLength);
   	}
   
   	protected XmlRpcTransportFactory getTransportFactory(XmlRpcClient pClient) {
  
  
  
  1.1.2.2   +5 -1      ws-xmlrpc/src/test/org/apache/xmlrpc/test/Attic/WebServerProvider.java
  
  Index: WebServerProvider.java
  ===================================================================
  RCS file: /home/cvs/ws-xmlrpc/src/test/org/apache/xmlrpc/test/Attic/WebServerProvider.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- WebServerProvider.java	14 May 2005 21:17:48 -0000	1.1.2.1
  +++ WebServerProvider.java	21 May 2005 02:37:08 -0000	1.1.2.2
  @@ -29,12 +29,14 @@
   public abstract class WebServerProvider extends ClientProviderImpl {
   	protected final WebServer webServer = new WebServer(0);
   	private boolean isActive;
  +	private final boolean contentLength;
   
   	/** Creates a new instance.
   	 * @param pMapping The test servers handler mapping.
   	 */
  -	protected WebServerProvider(XmlRpcHandlerMapping pMapping) {
  +	protected WebServerProvider(XmlRpcHandlerMapping pMapping, boolean pContentLength) {
   		super(pMapping);
  +		contentLength = pContentLength;
   	}
   
   	public final XmlRpcClientConfigImpl getConfig() throws Exception {
  @@ -45,6 +47,7 @@
   	protected XmlRpcClientConfigImpl getConfig(URL pServerURL) throws Exception {
   		XmlRpcClientConfigImpl config = super.getConfig();
   		config.setServerURL(pServerURL);
  +		config.setContentLengthOptional(!contentLength);
   		return config;
   	}
   
  @@ -54,6 +57,7 @@
   			server.setHandlerMapping(mapping);
   			XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl) server.getConfig();
   			serverConfig.setEnabledForExtensions(true);
  +			serverConfig.setContentLengthOptional(!contentLength);
   			webServer.start();
   			isActive = true;
   		}
  
  
  
  1.1.2.2   +4 -1      ws-xmlrpc/src/test/org/apache/xmlrpc/test/Attic/BaseTest.java
  
  Index: BaseTest.java
  ===================================================================
  RCS file: /home/cvs/ws-xmlrpc/src/test/org/apache/xmlrpc/test/Attic/BaseTest.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- BaseTest.java	14 May 2005 21:17:48 -0000	1.1.2.1
  +++ BaseTest.java	21 May 2005 02:37:08 -0000	1.1.2.2
  @@ -46,7 +46,10 @@
   			providers = new ClientProvider[]{
   				new LocalTransportProvider(mapping),
   				new LocalStreamTransportProvider(mapping),
  -				new SunHttpTransportProvider(mapping),
  +				new LiteTransportProvider(mapping, true),
  +				new LiteTransportProvider(mapping, false),
  +				new SunHttpTransportProvider(mapping, true),
  +				new SunHttpTransportProvider(mapping, false),
   				new CommonsProvider(mapping)
   			};
   		}
  
  
  
  1.1.2.2   +16 -1     ws-xmlrpc/src/test/org/apache/xmlrpc/test/Attic/CommonsProvider.java
  
  Index: CommonsProvider.java
  ===================================================================
  RCS file: /home/cvs/ws-xmlrpc/src/test/org/apache/xmlrpc/test/Attic/CommonsProvider.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- CommonsProvider.java	14 May 2005 21:17:48 -0000	1.1.2.1
  +++ CommonsProvider.java	21 May 2005 02:37:08 -0000	1.1.2.2
  @@ -1,3 +1,18 @@
  +/*
  + * Copyright 1999,2005 The Apache Software Foundation.
  + * 
  + * Licensed under the Apache License, Version 2.0 (the "License");
  + * you may not use this file except in compliance with the License.
  + * You may obtain a copy of the License at
  + * 
  + *      http://www.apache.org/licenses/LICENSE-2.0
  + * 
  + * Unless required by applicable law or agreed to in writing, software
  + * distributed under the License is distributed on an "AS IS" BASIS,
  + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  + * See the License for the specific language governing permissions and
  + * limitations under the License.
  + */
   package org.apache.xmlrpc.test;
   
   import org.apache.xmlrpc.client.XmlRpcClient;
  @@ -14,7 +29,7 @@
   	 * @param pMapping The test servers handler mapping.
   	 */
   	public CommonsProvider(XmlRpcHandlerMapping pMapping) {
  -		super(pMapping);
  +		super(pMapping, true);
   	}
   
   	protected XmlRpcTransportFactory getTransportFactory(XmlRpcClient pClient) {
  
  
  
  No                   revision
  
  Index: CommonsProvider.java
  ===================================================================
  RCS file: /home/cvs/ws-xmlrpc/src/test/org/apache/xmlrpc/test/Attic/CommonsProvider.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- CommonsProvider.java	14 May 2005 21:17:48 -0000	1.1.2.1
  +++ CommonsProvider.java	21 May 2005 02:37:08 -0000	1.1.2.2
  @@ -1,3 +1,18 @@
  +/*
  + * Copyright 1999,2005 The Apache Software Foundation.
  + * 
  + * Licensed under the Apache License, Version 2.0 (the "License");
  + * you may not use this file except in compliance with the License.
  + * You may obtain a copy of the License at
  + * 
  + *      http://www.apache.org/licenses/LICENSE-2.0
  + * 
  + * Unless required by applicable law or agreed to in writing, software
  + * distributed under the License is distributed on an "AS IS" BASIS,
  + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  + * See the License for the specific language governing permissions and
  + * limitations under the License.
  + */
   package org.apache.xmlrpc.test;
   
   import org.apache.xmlrpc.client.XmlRpcClient;
  @@ -14,7 +29,7 @@
   	 * @param pMapping The test servers handler mapping.
   	 */
   	public CommonsProvider(XmlRpcHandlerMapping pMapping) {
  -		super(pMapping);
  +		super(pMapping, true);
   	}
   
   	protected XmlRpcTransportFactory getTransportFactory(XmlRpcClient pClient) {
  
  
  
  No                   revision
  
  Index: CommonsProvider.java
  ===================================================================
  RCS file: /home/cvs/ws-xmlrpc/src/test/org/apache/xmlrpc/test/Attic/CommonsProvider.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- CommonsProvider.java	14 May 2005 21:17:48 -0000	1.1.2.1
  +++ CommonsProvider.java	21 May 2005 02:37:08 -0000	1.1.2.2
  @@ -1,3 +1,18 @@
  +/*
  + * Copyright 1999,2005 The Apache Software Foundation.
  + * 
  + * Licensed under the Apache License, Version 2.0 (the "License");
  + * you may not use this file except in compliance with the License.
  + * You may obtain a copy of the License at
  + * 
  + *      http://www.apache.org/licenses/LICENSE-2.0
  + * 
  + * Unless required by applicable law or agreed to in writing, software
  + * distributed under the License is distributed on an "AS IS" BASIS,
  + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  + * See the License for the specific language governing permissions and
  + * limitations under the License.
  + */
   package org.apache.xmlrpc.test;
   
   import org.apache.xmlrpc.client.XmlRpcClient;
  @@ -14,7 +29,7 @@
   	 * @param pMapping The test servers handler mapping.
   	 */
   	public CommonsProvider(XmlRpcHandlerMapping pMapping) {
  -		super(pMapping);
  +		super(pMapping, true);
   	}
   
   	protected XmlRpcTransportFactory getTransportFactory(XmlRpcClient pClient) {
  
  
  
  1.1.2.1   +40 -0     ws-xmlrpc/src/test/org/apache/xmlrpc/test/Attic/LiteTransportProvider.java
  
  
  
  
  1.1.2.1   +258 -0    ws-xmlrpc/src/test/org/apache/xmlrpc/test/Attic/MiniTest.java
  
  
  
  
  No                   revision
  No                   revision
  1.1.2.3   +15 -5     ws-xmlrpc/src/java/org/apache/xmlrpc/webserver/Attic/Connection.java
  
  Index: Connection.java
  ===================================================================
  RCS file: /home/cvs/ws-xmlrpc/src/java/org/apache/xmlrpc/webserver/Attic/Connection.java,v
  retrieving revision 1.1.2.2
  retrieving revision 1.1.2.3
  diff -u -r1.1.2.2 -r1.1.2.3
  --- Connection.java	14 May 2005 21:17:48 -0000	1.1.2.2
  +++ Connection.java	21 May 2005 02:37:08 -0000	1.1.2.3
  @@ -32,6 +32,7 @@
   import org.apache.xmlrpc.server.XmlRpcHttpServerConfig;
   import org.apache.xmlrpc.server.XmlRpcStreamServer;
   import org.apache.xmlrpc.util.Base64;
  +import org.apache.xmlrpc.util.LimitedInputStream;
   import org.apache.xmlrpc.util.ThreadPool;
   
   
  @@ -92,7 +93,14 @@
   		socket = pSocket;
   		// set read timeout to 30 seconds
           socket.setSoTimeout (30000);
  -        input = new BufferedInputStream(socket.getInputStream());
  +        input = new BufferedInputStream(socket.getInputStream()){
  +    		/** It may happen, that the XML parser invokes close().
  +    		 * Closing the input stream must not occur, because
  +    		 * that would close the whole socket. So we suppress it.
  +    		 */
  +        	public void close() throws IOException {
  +        	}
  +        };
           output = new BufferedOutputStream(socket.getOutputStream());
   	}
   
  @@ -218,7 +226,7 @@
   		if (contentLength == -1) {
   			return input;
   		} else {
  -			return new ServerInputStream(input, contentLength);
  +			return new LimitedInputStream(input, contentLength);
   		}
   	}
   
  @@ -266,11 +274,13 @@
           output.write(serverName);
           output.write(pData.isKeepAlive() ? conkeep : conclose);
           output.write(ctype);
  -        output.write(clength);
   		if (pContentLength != -1) {
  +	        output.write(clength);
   			output.write(toHTTPBytes(Integer.toString(pContentLength)));
  +	        output.write(doubleNewline);
  +		} else {
  +			output.write(newline);
   		}
  -        output.write(doubleNewline);
   		pData.setSuccess(true);
   	}
   
  @@ -318,8 +328,8 @@
   	        output.write(serverName);
   	        output.write(conclose);
   	        output.write(ctype);
  -	        output.write(clength);
   			if (pContentLength != -1) {
  +		        output.write(clength);
   				output.write(toHTTPBytes(Integer.toString(pContentLength)));
   			}
   	        output.write(doubleNewline);