Hello,

Here are the patches that allow one to set default request headers from 
HttpClient.

Otis
Index: HttpClient.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpClient.java,v
retrieving revision 1.42
diff -u -r1.42 HttpClient.java
--- HttpClient.java     5 Jan 2002 11:15:59 -0000       1.42
+++ HttpClient.java     17 Jan 2002 20:07:03 -0000
@@ -254,6 +254,7 @@
         if(!connection.isOpen()) {
             connection.open();
         }
+       method.setDefaultRequestHeaders(method.getDefaultRequestHeaders());
         return method.execute(getState(),connection);
     }
 
Index: HttpMethod.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpMethod.java,v
retrieving revision 1.10
diff -u -r1.10 HttpMethod.java
--- HttpMethod.java     5 Jan 2002 11:16:00 -0000       1.10
+++ HttpMethod.java     17 Jan 2002 20:07:22 -0000
@@ -100,6 +100,38 @@
     public String getPath();
 
     /**
+     * Sets the specified request header as default, overwriting any
+     * previous value.  Specifying an empty or <code>null</code> value
+     * for the headerValue parameter will remove the specified header.
+     * Note that header-name matching is case-insensitive.
+     * @param headerName the header's name
+     * @param headerValue the header's value
+     */
+    public void setDefaultRequestHeader(String headerName, String headerValue);
+
+    /**
+     * Sets the default request headers.  Any previously set default request
+     * headers will be overwritten.
+     * @param requestHeaders the new default request headers
+     */
+    public void setDefaultRequestHeaders(Header[] headers);
+
+    /**
+     * Adds the specified request header, NOT overwriting any
+     * previous value.
+     * Note that header-name matching is case insensitive.
+     * @param headerName the header's name
+     * @param headerValue the header's value
+     */
+    public void addDefaultRequestHeader(String headerName, String headerValue);
+
+    /**
+     * Returns default request headers.
+     * @return a <code>HashMap</code> of default request headers
+     */
+    public Header[] getDefaultRequestHeaders();
+
+    /**
      * Set the specified request header, overwriting any
      * previous value.
      * Note that header-name matching is case insensitive.
@@ -150,6 +182,11 @@
     public void removeRequestHeader(String headerName);
 
     /**
+     * Return an array of my request headers.
+     */
+    public Header[] getRequestHeaders();
+
+    /**
      * Whether or not I should automatically follow
      * HTTP redirects (status code 302, etc.)
      * @return <tt>true</tt> if I will automatically follow HTTP redirects
@@ -180,11 +217,6 @@
      * @return my query string
      */
     public String getQueryString();
-
-    /**
-     * Return an array of my request headers.
-     */
-    public Header[] getRequestHeaders();
 
     // ---------------------------------------------------------------- Queries
 
Index: HttpMethodBase.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpMethodBase.java,v
retrieving revision 1.24
diff -u -r1.24 HttpMethodBase.java
--- HttpMethodBase.java 15 Jan 2002 20:53:47 -0000      1.24
+++ HttpMethodBase.java 17 Jan 2002 20:07:39 -0000
@@ -156,6 +156,74 @@
     }
 
     /**
+     * Sets the specified request header as default, overwriting any
+     * previous value.  Specifying an empty or <code>null</code> value
+     * for the headerValue parameter will remove the specified header.
+     * Note that header-name matching is case-insensitive.
+     * @param headerName the header's name
+     * @param headerValue the header's value
+     */
+     public void setDefaultRequestHeader(String headerName, String headerValue) {
+        if(null == headerValue || headerValue.equals("")) {
+           defaultRequestHeaders.remove(headerName.toLowerCase());
+       }
+       else {
+           Header header = new Header(headerName, headerValue);
+           defaultRequestHeaders.put(headerName.toLowerCase(), header);
+       }
+    }
+
+    /**
+     * Sets the default request headers.  Any previously set default request
+     * headers will be overwritten.
+     * @param requestHeaders the new default request headers
+     */
+    public void setDefaultRequestHeaders(Header[] headers) {
+       if((null == headers) || (headers.length < 1))
+           defaultRequestHeaders = new HashMap();
+       else {
+           int len = headers.length;
+           for (int i=0; i<len; i++) {
+               Header header = headers[i];
+               defaultRequestHeaders.put(header.getName().toLowerCase(), header);
+           }
+       }
+    }
+
+    /**
+     * Adds the specified request header, NOT overwriting any
+     * previous value.
+     * Note that header-name matching is case insensitive.
+     * @param headerName the header's name
+     * @param headerValue the header's value
+     */
+    public void addDefaultRequestHeader(String headerName, String headerValue) {
+        // "It must be possible to combine the multiple header fields into
+        // one "field-name: field-value" pair, without changing the
+        // semantics of the message, by appending each subsequent field-value
+        // to the first, each separated by a comma."
+        //   - HTTP/1.0 (4.3)
+       headerName = headerName.toLowerCase();
+        Header header = (Header)(defaultRequestHeaders.get(headerName));
+        if(null == header) {
+            header = new Header(headerName, headerValue);
+        } else {
+            header.setValue( (null == header.getValue() ? "" : header.getValue()) +
+                             ", " +
+                             (null == headerValue ? "" : headerValue));
+        }
+        defaultRequestHeaders.put(headerName, header);
+    }
+
+    /**
+     * Returns default request headers.
+     * @return an array of default request headers
+     */
+    public Header[] getDefaultRequestHeaders() {
+        return (Header[])(defaultRequestHeaders.values().toArray(new 
+Header[defaultRequestHeaders.size()]));
+    }
+
+    /**
      * Set the specified request header, overwriting any
      * previous value.
      * Note that header-name matching is case-insensitive.
@@ -245,6 +313,13 @@
     }
 
     /**
+     * Return an array of my request headers.
+     */
+    public Header[] getRequestHeaders() {
+        return (Header[])(requestHeaders.values().toArray(new 
+Header[requestHeaders.size()]));
+    }
+
+    /**
      * Whether or not I should automatically follow
      * HTTP redirects (status code 302, etc.)
      * @return <tt>true</tt> if I will automatically follow HTTP redirects
@@ -301,13 +376,6 @@
         return queryString;
     }
 
-    /**
-     * Return an array of my request headers.
-     */
-    public Header[] getRequestHeaders() {
-        return (Header[])(requestHeaders.values().toArray(new 
Header[requestHeaders.size()]));
-    }
-
     // ---------------------------------------------------------------- Queries
 
     /**
@@ -669,6 +737,14 @@
         while(it.hasNext()) {
             conn.print(((Header)it.next()).toExternalForm());
         }
+        it = defaultRequestHeaders.keySet().iterator();
+        while(it.hasNext()) {
+           String headerName = (String)it.next();
+           if(!requestHeaders.containsKey(headerName))
+           {
+               
+conn.print(((Header)defaultRequestHeaders.get(headerName)).toExternalForm());
+           }
+        }
     }
 
     /**
@@ -705,7 +781,8 @@
      * already exists.
      */
     protected void addUserAgentRequestHeader(HttpState state, HttpConnection conn) 
throws IOException, HttpException {
-        if (!requestHeaders.containsKey("user-agent")) {
+        if (!requestHeaders.containsKey("user-agent") &&
+           !defaultRequestHeaders.containsKey("user-agent")) {
             setRequestHeader(HttpMethodBase.USER_AGENT);
         }
     }
@@ -717,7 +794,8 @@
      */
     protected void addHostRequestHeader(HttpState state, HttpConnection conn) throws 
IOException, HttpException {
         // add host (should do this conditionally?, i.e., don't send to http/1.0?)
-        if (!requestHeaders.containsKey("host")) {
+        if (!requestHeaders.containsKey("host") &&
+           !defaultRequestHeaders.containsKey("host")) {
             setRequestHeader("Host",conn.getHost());
         }
     }
@@ -728,7 +806,8 @@
      * already exists.
      */
     protected void addCookieRequestHeader(HttpState state, HttpConnection conn) 
throws IOException, HttpException {
-        if (!requestHeaders.containsKey("cookie")) {
+        if (!requestHeaders.containsKey("cookie") &&
+           !defaultRequestHeaders.containsKey("cookie")) {
             Header cookieHeader = Cookie.createCookieHeader(conn.getHost(), 
conn.getPort(), getPath(), conn.isSecure(), new Date(), state.getCookies());
             if(null != cookieHeader) {
                 setRequestHeader(cookieHeader);
@@ -743,7 +822,8 @@
      */
     protected void addAuthorizationRequestHeader(HttpState state, HttpConnection 
conn) throws IOException, HttpException {
         // add authorization header, if needed
-        if(!requestHeaders.containsKey("authorization")) {
+        if (!requestHeaders.containsKey("authorization") &&
+           !defaultRequestHeaders.containsKey("authorization")) {
             Header wwwAuthenticateHeader = 
(Header)(responseHeaders.get("www-authenticate"));
             if(null != wwwAuthenticateHeader) {
                 try {
@@ -764,7 +844,8 @@
     protected void addContentLengthRequestHeader(HttpState state, HttpConnection 
conn) throws IOException, HttpException {
         // add content length or chunking
         int len = getRequestContentLength();
-        if(!requestHeaders.containsKey("content-length")) {
+        if (!requestHeaders.containsKey("content-length") &&
+           !defaultRequestHeaders.containsKey("content-length")) {
             if(-1 < len) {
                 setRequestHeader("Content-Length",String.valueOf(len));
             } else if(http11 && (len < 0)) {
@@ -1122,7 +1203,7 @@
         path = null;
         followRedirects = false;
         queryString = null;
-        requestHeaders.clear();
+        requestHeaders = defaultRequestHeaders;
         responseHeaders.clear();
         statusCode = -1;
         statusText = null;
@@ -1218,6 +1299,8 @@
     private boolean followRedirects = false;
     /** My query string, if any. */
     private String queryString = null;
+    /** Default request headers, if any. */
+    private HashMap defaultRequestHeaders = new HashMap();
     /** My request headers, if any. */
     private HashMap requestHeaders = new HashMap();
     /** My response headers, if any. */

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to