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]>