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 2006/04/20 22:52:54 UTC

svn commit: r395693 - in /webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc: server/XmlRpcHttpServer.java server/XmlRpcStreamServer.java webserver/Connection.java webserver/ConnectionServer.java webserver/XmlRpcServletServer.java

Author: jochen
Date: Thu Apr 20 13:52:51 2006
New Revision: 395693

URL: http://svn.apache.org/viewcvs?rev=395693&view=rev
Log:
XMLRPC-79: The "Content-Encoding" header wasn't set for a gzipped response.

Added:
    webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcHttpServer.java
Modified:
    webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcStreamServer.java
    webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/Connection.java
    webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/ConnectionServer.java
    webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/XmlRpcServletServer.java

Added: webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcHttpServer.java
URL: http://svn.apache.org/viewcvs/webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcHttpServer.java?rev=395693&view=auto
==============================================================================
--- webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcHttpServer.java (added)
+++ webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcHttpServer.java Thu Apr 20 13:52:51 2006
@@ -0,0 +1,23 @@
+package org.apache.xmlrpc.server;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import org.apache.xmlrpc.common.ServerStreamConnection;
+import org.apache.xmlrpc.common.XmlRpcStreamRequestConfig;
+
+
+
+/** Abstract extension of {@link XmlRpcStreamServer} for deriving
+ * HTTP servers.
+ */
+public abstract class XmlRpcHttpServer extends XmlRpcStreamServer {
+	protected abstract void setResponseHeader(ServerStreamConnection pConnection, String pHeader, String pValue);
+
+	protected OutputStream getOutputStream(ServerStreamConnection pConnection, XmlRpcStreamRequestConfig pConfig, OutputStream pStream) throws IOException {
+		if (pConfig.isEnabledForExtensions()  &&  pConfig.isGzipRequesting()) {
+			setResponseHeader(pConnection, "Content-Encoding", "gzip");
+		}
+		return super.getOutputStream(pConnection, pConfig, pStream);
+	}
+}

Modified: webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcStreamServer.java
URL: http://svn.apache.org/viewcvs/webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcStreamServer.java?rev=395693&r1=395692&r2=395693&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcStreamServer.java (original)
+++ webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcStreamServer.java Thu Apr 20 13:52:51 2006
@@ -147,8 +147,8 @@
 	/** Called to prepare the output stream. Typically used for enabling
 	 * compression, or similar filters.
 	 */
-	protected OutputStream getOutputStream(XmlRpcStreamRequestConfig pConfig,
-										   OutputStream pStream) throws IOException {
+	protected OutputStream getOutputStream(ServerStreamConnection pConnection,
+										   XmlRpcStreamRequestConfig pConfig, OutputStream pStream) throws IOException {
 		if (pConfig.isEnabledForExtensions()  &&  pConfig.isGzipRequesting()) {
 			return new GZIPOutputStream(pStream);
 		} else {
@@ -215,7 +215,7 @@
 				baos = null;
 				ostream = newOutputStream(pConfig, pConnection);
 			}
-			ostream = getOutputStream(pConfig, ostream);
+			ostream = getOutputStream(pConnection, pConfig, ostream);
 			try {
 				if (error == null) {
 					writeResponse(pConfig, ostream, result);

Modified: webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/Connection.java
URL: http://svn.apache.org/viewcvs/webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/Connection.java?rev=395693&r1=395692&r2=395693&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/Connection.java (original)
+++ webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/Connection.java Thu Apr 20 13:52:51 2006
@@ -23,6 +23,8 @@
 import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
 import java.net.Socket;
+import java.util.Iterator;
+import java.util.Map;
 import java.util.StringTokenizer;
 
 import org.apache.xmlrpc.common.ServerStreamConnection;
@@ -42,7 +44,7 @@
  * multiple requests via a single, physical connection.
  */
 public class Connection implements ThreadPool.Task, ServerStreamConnection {
-	private static final String US_ASCII = "US-ASCII";
+    private static final String US_ASCII = "US-ASCII";
     private static final byte[] ctype = toHTTPBytes("Content-Type: text/xml\r\n");
     private static final byte[] clength = toHTTPBytes("Content-Length: ");
     private static final byte[] newline = toHTTPBytes("\r\n");
@@ -53,31 +55,32 @@
     private static final byte[] serverName = toHTTPBytes("Server: Apache XML-RPC 1.0\r\n");
     private static final byte[] wwwAuthenticate = toHTTPBytes("WWW-Authenticate: Basic realm=XML-RPC\r\n");
 
-	private static class BadRequestException extends IOException {
-		private static final long serialVersionUID = 3257848779234554934L;
-		BadRequestException(String pMethod) {
-			super(pMethod);
-		}
-	}
+    private static class BadRequestException extends IOException {
+        private static final long serialVersionUID = 3257848779234554934L;
+        BadRequestException(String pMethod) {
+            super(pMethod);
+        }
+    }
 
-	/** Returns the US-ASCII encoded byte representation of text for
+    /** Returns the US-ASCII encoded byte representation of text for
      * HTTP use (as per section 2.2 of RFC 2068).
      */
     private static final byte[] toHTTPBytes(String text) {
         try {
             return text.getBytes(US_ASCII);
         } catch (UnsupportedEncodingException e) {
-			throw new Error(e.getMessage() +
-                            ": HTTP requires US-ASCII encoding");
+            throw new Error(e.getMessage() +
+            ": HTTP requires US-ASCII encoding");
         }
     }
 
-	private final WebServer webServer;
-	private final Socket socket;
+    private final WebServer webServer;
+    private final Socket socket;
     private final InputStream input;
     private final OutputStream output;
-	private final XmlRpcStreamServer server;
-	private byte[] buffer;
+    private final XmlRpcStreamServer server;
+    private byte[] buffer;
+    private Map headers;
 
     /** Creates a new webserver connection on the given socket.
      * @param pWebServer The webserver maintaining this connection.
@@ -87,95 +90,98 @@
      * @throws IOException
      */
     public Connection(WebServer pWebServer, XmlRpcStreamServer pServer, Socket pSocket)
-			throws IOException {
-		webServer = pWebServer;
-		server = pServer;
-		socket = pSocket;
-		// set read timeout to 30 seconds
+            throws IOException {
+        webServer = pWebServer;
+        server = pServer;
+        socket = pSocket;
+        // set read timeout to 30 seconds
         socket.setSoTimeout (30000);
         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 {
-        	}
+            /** 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());
-	}
+    }
+
+    /** Returns the connections request configuration by
+     * merging the HTTP request headers and the servers configuration.
+     * @return The connections request configuration.
+     * @throws IOException Reading the request headers failed.
+     */
+    private RequestData getRequestConfig() throws IOException {
+        RequestData result = new RequestData(this);
+        if (headers != null) {
+            headers.clear();
+        }
+        XmlRpcHttpServerConfig serverConfig = (XmlRpcHttpServerConfig) server.getConfig();
+        result.setBasicEncoding(serverConfig.getBasicEncoding());
+        result.setContentLengthOptional(serverConfig.isContentLengthOptional());
+        result.setEnabledForExtensions(serverConfig.isEnabledForExtensions());
+
+        // reset user authentication
+        String line = readLine();
+        // Netscape sends an extra \n\r after bodypart, swallow it
+        if (line != null && line.length() == 0) {
+            line = readLine();
+            if (line == null  ||  line.length() == 0) {
+                return null;
+            }
+        }
+
+        // tokenize first line of HTTP request
+        StringTokenizer tokens = new StringTokenizer(line);
+        String method = tokens.nextToken();
+        if (!"POST".equalsIgnoreCase(method)) {
+            throw new BadRequestException(method);
+        }
+        result.setMethod(method);
+        tokens.nextToken(); // Skip URI
+        String httpVersion = tokens.nextToken();
+        result.setHttpVersion(httpVersion);
+        result.setKeepAlive(serverConfig.isKeepAliveEnabled()
+                && WebServer.HTTP_11.equals(httpVersion));
+        do {
+            line = readLine();
+            if (line != null) {
+                String lineLower = line.toLowerCase();
+                if (lineLower.startsWith("content-length:")) {
+                    String cLength = line.substring("content-length:".length());
+                    result.setContentLength(Integer.parseInt(cLength.trim()));
+                } else if (lineLower.startsWith("connection:")) {
+                    result.setKeepAlive(serverConfig.isKeepAliveEnabled()
+                            &&  lineLower.indexOf("keep-alive") > -1);
+                } else if (lineLower.startsWith("authorization:")) {
+                    String credentials = line.substring("authorization:".length());
+                    HttpUtil.parseAuthorization(result, credentials);
+                }
+            }
+        }
+        while (line != null && line.length() != 0);
 
-	/** Returns the connections request configuration by
-	 * merging the HTTP request headers and the servers configuration.
-	 * @return The connections request configuration.
-	 * @throws IOException Reading the request headers failed.
-	 */
-	private RequestData getRequestConfig() throws IOException {
-		RequestData result = new RequestData(this);
-		XmlRpcHttpServerConfig serverConfig = (XmlRpcHttpServerConfig) server.getConfig();
-		result.setBasicEncoding(serverConfig.getBasicEncoding());
-		result.setContentLengthOptional(serverConfig.isContentLengthOptional());
-		result.setEnabledForExtensions(serverConfig.isEnabledForExtensions());
-
-		// reset user authentication
-		String line = readLine();
-		// Netscape sends an extra \n\r after bodypart, swallow it
-		if (line != null && line.length() == 0) {
-			line = readLine();
-			if (line == null  ||  line.length() == 0) {
-				return null;
-			}
-    	}
-
-		// tokenize first line of HTTP request
-		StringTokenizer tokens = new StringTokenizer(line);
-		String method = tokens.nextToken();
-		if (!"POST".equalsIgnoreCase(method)) {
-			throw new BadRequestException(method);
-		}
-		result.setMethod(method);
-		tokens.nextToken(); // Skip URI
-		String httpVersion = tokens.nextToken();
-		result.setHttpVersion(httpVersion);
-		result.setKeepAlive(serverConfig.isKeepAliveEnabled()
-							&& WebServer.HTTP_11.equals(httpVersion));
-		do {
-			line = readLine();
-			if (line != null) {
-				String lineLower = line.toLowerCase();
-				if (lineLower.startsWith("content-length:")) {
-					String cLength = line.substring("content-length:".length());
-					result.setContentLength(Integer.parseInt(cLength.trim()));
-				} else if (lineLower.startsWith("connection:")) {
-					result.setKeepAlive(serverConfig.isKeepAliveEnabled()
-										&&  lineLower.indexOf("keep-alive") > -1);
-				} else if (lineLower.startsWith("authorization:")) {
-					String credentials = line.substring("authorization:".length());
-					HttpUtil.parseAuthorization(result, credentials);
-				}
-			}
-		}
-		while (line != null && line.length() != 0);
-		
-		return result;
-	}
+        return result;
+    }
 
     public void run() {
         try {
-			for (int i = 0;  ;  i++) {
-				RequestData data = getRequestConfig();
-				if (data == null) {
-					break;
-				}
-				server.execute(data, this);
-				output.flush();
-				if (!data.isKeepAlive()  ||  !data.isSuccess()) {
-					break;
-				}
-			}
+            for (int i = 0;  ;  i++) {
+                RequestData data = getRequestConfig();
+                if (data == null) {
+                    break;
+                }
+                server.execute(data, this);
+                output.flush();
+                if (!data.isKeepAlive()  ||  !data.isSuccess()) {
+                    break;
+                }
+            }
         } catch (Throwable t) {
-			webServer.log(t);
+            webServer.log(t);
         } finally {
-			try { socket.close(); } catch (Throwable ignore) {}
+            try { socket.close(); } catch (Throwable ignore) {}
         }
     }
 
@@ -201,121 +207,135 @@
     }
 
     /** Returns the contents input stream.
-	 * @param pData The request data
-	 * @return The contents input stream.
-	 */
-	public InputStream getInputStream(RequestData pData) {
-		int contentLength = pData.getContentLength();
-		if (contentLength == -1) {
-			return input;
-		} else {
-			return new LimitedInputStream(input, contentLength);
-		}
-	}
-
-	/** Returns the output stream for writing the response.
-	 * @param pConfig The request configuration.
-	 * @return The response output stream.
-	 */
-	public OutputStream getOutputStream(XmlRpcStreamRequestConfig pConfig) {
-		boolean useContentLength;
-		if (pConfig instanceof XmlRpcHttpRequestConfig) {
-			useContentLength = !pConfig.isEnabledForExtensions()
-						||  !((XmlRpcHttpRequestConfig) pConfig).isContentLengthOptional();
-		} else {
-			useContentLength = true;
-		}
-		if (useContentLength) {
-			return new ByteArrayOutputStream();
-		} else {
-			return output;
-		}
-	}
-
-	/** Writes the response header and the response to the
-	 * output stream.
-	 * @param pData The request data.
-	 * @param pBuffer The {@link ByteArrayOutputStream} holding the response.
-	 * @throws IOException Writing the response failed.
-	 */
-	public void writeResponse(RequestData pData, OutputStream pBuffer)
-			throws IOException {
-		ByteArrayOutputStream response = (ByteArrayOutputStream) pBuffer;
-		writeResponseHeader(pData, response.size());
-		response.writeTo(output);
-	}
-
-	/** Writes the response header to the output stream.	 * 
-	 * @param pData The request data
-	 * @param pContentLength The content length, if known, or -1.
-	 * @throws IOException Writing the response failed.
-	 */
-	public void writeResponseHeader(RequestData pData, int pContentLength)
-			throws IOException {
+     * @param pData The request data
+     * @return The contents input stream.
+     */
+    public InputStream getInputStream(RequestData pData) {
+        int contentLength = pData.getContentLength();
+        if (contentLength == -1) {
+            return input;
+        } else {
+            return new LimitedInputStream(input, contentLength);
+        }
+    }
+
+    /** Returns the output stream for writing the response.
+     * @param pConfig The request configuration.
+     * @return The response output stream.
+     */
+    public OutputStream getOutputStream(XmlRpcStreamRequestConfig pConfig) {
+        boolean useContentLength;
+        if (pConfig instanceof XmlRpcHttpRequestConfig) {
+            useContentLength = !pConfig.isEnabledForExtensions()
+            ||  !((XmlRpcHttpRequestConfig) pConfig).isContentLengthOptional();
+        } else {
+            useContentLength = true;
+        }
+        if (useContentLength) {
+            return new ByteArrayOutputStream();
+        } else {
+            return output;
+        }
+    }
+
+    /** Writes the response header and the response to the
+     * output stream.
+     * @param pData The request data.
+     * @param pBuffer The {@link ByteArrayOutputStream} holding the response.
+     * @throws IOException Writing the response failed.
+     */
+    public void writeResponse(RequestData pData, OutputStream pBuffer)
+            throws IOException {
+        ByteArrayOutputStream response = (ByteArrayOutputStream) pBuffer;
+        writeResponseHeader(pData, response.size());
+        response.writeTo(output);
+    }
+
+    /** Writes the response header to the output stream.	 * 
+     * @param pData The request data
+     * @param pContentLength The content length, if known, or -1.
+     * @throws IOException Writing the response failed.
+     */
+    public void writeResponseHeader(RequestData pData, int pContentLength)
+            throws IOException {
         output.write(toHTTPBytes(pData.getHttpVersion()));
         output.write(ok);
         output.write(serverName);
         output.write(pData.isKeepAlive() ? conkeep : conclose);
         output.write(ctype);
-		if (pContentLength != -1) {
-	        output.write(clength);
-			output.write(toHTTPBytes(Integer.toString(pContentLength)));
-	        output.write(doubleNewline);
-		} else {
-			output.write(newline);
-		}
-		pData.setSuccess(true);
-	}
-
-	/** Writes an error response to the output stream.
-	 * @param pData The request data.
-	 * @param pError The error being reported.
-	 * @param pStream The {@link ByteArrayOutputStream} with the error response.
-	 * @throws IOException Writing the response failed.
-	 */
-	public void writeError(RequestData pData, Throwable pError, OutputStream pStream)
-			throws IOException {
-		ByteArrayOutputStream errorResponse = (ByteArrayOutputStream) pStream;
-		writeErrorHeader(pData, pError, errorResponse.size());
-		errorResponse.writeTo(output);
-	}
-
-	/** Writes an error responses headers to the output stream.
-	 * @param pData The request data.
-	 * @param pError The error being reported.
-	 * @param pContentLength The response length, if known, or -1.
-	 * @throws IOException Writing the response failed.
-	 */
-	public void writeErrorHeader(RequestData pData, Throwable pError, int pContentLength)
-			throws IOException {
-		if (pError instanceof BadRequestException) {
-	        output.write(toHTTPBytes(pData.getHttpVersion()));
-	        output.write(toHTTPBytes(" 400 Bad Request"));
-	        output.write(newline);
-	        output.write(serverName);
-	        output.write(doubleNewline);
-	        output.write(toHTTPBytes("Method " + pData.getMethod() +
-	                                 " not implemented (try POST)"));
-		} else if (pError instanceof XmlRpcNotAuthorizedException) {
-	        output.write(toHTTPBytes(pData.getHttpVersion()));
-	        output.write(toHTTPBytes(" 401 Unauthorized"));
-	        output.write(newline);
-	        output.write(serverName);
-	        output.write(wwwAuthenticate);
-	        output.write(doubleNewline);
-	        output.write(toHTTPBytes("Method " + pData.getMethod() + " requires a " +
-	                                 "valid user name and password"));
-		} else {
-	        output.write(toHTTPBytes(pData.getHttpVersion()));
-	        output.write(ok);
-	        output.write(serverName);
-	        output.write(conclose);
-	        output.write(ctype);
-			if (pContentLength != -1) {
-		        output.write(clength);
-				output.write(toHTTPBytes(Integer.toString(pContentLength)));
-			}
-	        output.write(doubleNewline);
-		}
-	}
+        if (headers != null) {
+            for (Iterator iter = headers.entrySet().iterator();  iter.hasNext();  ) {
+                Map.Entry entry = (Map.Entry) iter.next();
+                String header = (String) entry.getKey();
+                String value = (String) entry.getValue();
+                output.write(toHTTPBytes(header + ": " + value + "\r\n"));
+            }
+        }
+        if (pContentLength != -1) {
+            output.write(clength);
+            output.write(toHTTPBytes(Integer.toString(pContentLength)));
+            output.write(doubleNewline);
+        } else {
+            output.write(newline);
+        }
+        pData.setSuccess(true);
+    }
+
+    /** Writes an error response to the output stream.
+     * @param pData The request data.
+     * @param pError The error being reported.
+     * @param pStream The {@link ByteArrayOutputStream} with the error response.
+     * @throws IOException Writing the response failed.
+     */
+    public void writeError(RequestData pData, Throwable pError, OutputStream pStream)
+            throws IOException {
+        ByteArrayOutputStream errorResponse = (ByteArrayOutputStream) pStream;
+        writeErrorHeader(pData, pError, errorResponse.size());
+        errorResponse.writeTo(output);
+    }
+
+    /** Writes an error responses headers to the output stream.
+     * @param pData The request data.
+     * @param pError The error being reported.
+     * @param pContentLength The response length, if known, or -1.
+     * @throws IOException Writing the response failed.
+     */
+    public void writeErrorHeader(RequestData pData, Throwable pError, int pContentLength)
+            throws IOException {
+        if (pError instanceof BadRequestException) {
+            output.write(toHTTPBytes(pData.getHttpVersion()));
+            output.write(toHTTPBytes(" 400 Bad Request"));
+            output.write(newline);
+            output.write(serverName);
+            output.write(doubleNewline);
+            output.write(toHTTPBytes("Method " + pData.getMethod() +
+            " not implemented (try POST)"));
+        } else if (pError instanceof XmlRpcNotAuthorizedException) {
+            output.write(toHTTPBytes(pData.getHttpVersion()));
+            output.write(toHTTPBytes(" 401 Unauthorized"));
+            output.write(newline);
+            output.write(serverName);
+            output.write(wwwAuthenticate);
+            output.write(doubleNewline);
+            output.write(toHTTPBytes("Method " + pData.getMethod() + " requires a " +
+            "valid user name and password"));
+        } else {
+            output.write(toHTTPBytes(pData.getHttpVersion()));
+            output.write(ok);
+            output.write(serverName);
+            output.write(conclose);
+            output.write(ctype);
+            if (pContentLength != -1) {
+                output.write(clength);
+                output.write(toHTTPBytes(Integer.toString(pContentLength)));
+            }
+            output.write(doubleNewline);
+        }
+    }
+
+    /** Sets a response header value.
+     */
+    public void setResponseHeader(String pHeader, String pValue) {
+        headers.put(pHeader, pValue);
+    }
 }

Modified: webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/ConnectionServer.java
URL: http://svn.apache.org/viewcvs/webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/ConnectionServer.java?rev=395693&r1=395692&r2=395693&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/ConnectionServer.java (original)
+++ webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/ConnectionServer.java Thu Apr 20 13:52:51 2006
@@ -22,10 +22,10 @@
 import org.apache.xmlrpc.XmlRpcException;
 import org.apache.xmlrpc.common.ServerStreamConnection;
 import org.apache.xmlrpc.common.XmlRpcStreamRequestConfig;
-import org.apache.xmlrpc.server.XmlRpcStreamServer;
+import org.apache.xmlrpc.server.XmlRpcHttpServer;
 
 
-class ConnectionServer extends XmlRpcStreamServer {
+class ConnectionServer extends XmlRpcHttpServer {
 	protected void writeError(XmlRpcStreamRequestConfig pConfig, OutputStream pStream,
 							  Throwable pError) throws XmlRpcException {
 		RequestData data = (RequestData) pConfig;
@@ -68,5 +68,9 @@
 	}
 
 	protected void closeConnection(ServerStreamConnection pConnection) throws IOException {
+	}
+
+	protected void setResponseHeader(ServerStreamConnection pConnection, String pHeader, String pValue) {
+		((Connection) pConnection).setResponseHeader(pHeader, pValue);
 	}
 }

Modified: webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/XmlRpcServletServer.java
URL: http://svn.apache.org/viewcvs/webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/XmlRpcServletServer.java?rev=395693&r1=395692&r2=395693&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/XmlRpcServletServer.java (original)
+++ webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/XmlRpcServletServer.java Thu Apr 20 13:52:51 2006
@@ -25,18 +25,17 @@
 
 import org.apache.xmlrpc.XmlRpcException;
 import org.apache.xmlrpc.common.ServerStreamConnection;
-import org.apache.xmlrpc.common.XmlRpcHttpRequestConfig;
 import org.apache.xmlrpc.common.XmlRpcHttpRequestConfigImpl;
 import org.apache.xmlrpc.common.XmlRpcStreamRequestConfig;
+import org.apache.xmlrpc.server.XmlRpcHttpServer;
 import org.apache.xmlrpc.server.XmlRpcHttpServerConfig;
-import org.apache.xmlrpc.server.XmlRpcStreamServer;
 import org.apache.xmlrpc.util.HttpUtil;
 
 
 /** An extension of {@link org.apache.xmlrpc.server.XmlRpcServer},
  * which is suitable for processing servlet requests.
  */
-public class XmlRpcServletServer extends XmlRpcStreamServer {
+public class XmlRpcServletServer extends XmlRpcHttpServer {
 	protected static class ServletStreamConnection implements ServerStreamConnection {
 		private final HttpServletRequest request;
 		private final HttpServletResponse response;
@@ -127,5 +126,9 @@
 
 	protected void closeConnection(ServerStreamConnection pConnection) throws IOException {
 		((ServletStreamConnection) pConnection).getResponse().getOutputStream().close();
+	}
+
+	protected void setResponseHeader(ServerStreamConnection pConnection, String pHeader, String pValue) {
+		((ServletStreamConnection) pConnection).getResponse().setHeader(pHeader, pValue);
 	}
 }