Hi,
Attached is a patch to correct the
HttpMethodBase.addHostRequestHeader().
Currently, this method only adds the hostname to the header value,
however, if the target service is on a different port, then the
header provided will be incorrect.
The patch also includes some general formatting cleanup to the
class.
-rl
Index: HttpMethodBase.java
===================================================================
RCS file: /home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpMethodBase.java,v
retrieving revision 1.28
diff -u -r1.28 HttpMethodBase.java
--- HttpMethodBase.java 16 Apr 2002 14:30:42 -0000 1.28
+++ HttpMethodBase.java 4 Jun 2002 17:13:11 -0000
@@ -164,7 +164,8 @@
* in the same way that most Http user agent's do (and many HTTP servers
* expect.
*
- * NOTE: StrictMode is currently experimental and its functionlaity may change in the future.
+ * NOTE: StrictMode is currently experimental and its functionlaity
+ * may change in the future.
*
*/
public void setStrictMode(boolean strictMode)
@@ -175,7 +176,8 @@
/**
* Returns the value of strictMode.
*
- * NOTE: StrictMode is currently experimental and its functionlaity may change in the future.
+ * NOTE: StrictMode is currently experimental and its functionlaity
+ * may change in the future.
*
* @return true if strict mode is enabled.
*/
@@ -193,7 +195,7 @@
*/
public void setRequestHeader(String headerName, String headerValue) {
Header header = new Header(headerName, headerValue);
- requestHeaders.put(headerName.toLowerCase(),header);
+ requestHeaders.put(headerName.toLowerCase(), header);
}
/**
@@ -203,7 +205,7 @@
* @param header the header
*/
public void setRequestHeader(Header header) {
- requestHeaders.put(header.getName().toLowerCase(),header);
+ requestHeaders.put(header.getName().toLowerCase(), header);
}
/**
@@ -223,11 +225,10 @@
if (null == header) {
header = new Header(headerName, headerValue);
} else {
- header.setValue( (null == header.getValue() ? "" : header.getValue()) +
- ", " +
- (null == headerValue ? "" : headerValue));
+ header.setValue((null == header.getValue() ? "" : header.getValue()) +
+ ", " + (null == headerValue ? "" : headerValue));
}
- requestHeaders.put(headerName.toLowerCase(),header);
+ requestHeaders.put(headerName.toLowerCase(), header);
}
/**
@@ -242,15 +243,15 @@
// semantics of the message, by appending each subsequent field-value
// to the first, each separated by a comma."
// - HTTP/1.0 (4.3)
- Header orig = (Header)(requestHeaders.get(header.getName().toLowerCase()));
+ Header orig = (Header) requestHeaders.get(header.getName().toLowerCase());
if (null == orig) {
orig = header;
} else {
- orig.setValue( (null == orig.getValue() ? "" : orig.getValue()) +
+ orig.setValue((null == orig.getValue() ? "" : orig.getValue()) +
", " +
(null == header.getValue() ? "" : header.getValue()));
}
- requestHeaders.put(orig.getName().toLowerCase(),orig);
+ requestHeaders.put(orig.getName().toLowerCase(), orig);
}
/**
@@ -306,9 +307,9 @@
public void setQueryString(NameValuePair[] params) {
StringBuffer buf = new StringBuffer();
boolean needAmp = false;
- for(int i=0;i<params.length;i++) {
+ for (int i = 0; i < params.length; i++) {
if (needAmp) {
- buf.append("&");
+ buf.append('&');
} else {
needAmp = true;
}
@@ -316,7 +317,7 @@
buf.append(URIUtil.encode(params[i].getName()));
}
if (null != params[i].getValue()) {
- buf.append("=");
+ buf.append('=');
buf.append(URIUtil.encode(params[i].getValue()));
}
}
@@ -334,7 +335,7 @@
* Return an array of my request headers.
*/
public Header[] getRequestHeaders() {
- return (Header[])(requestHeaders.values().toArray(new Header[requestHeaders.size()]));
+ return (Header[]) requestHeaders.values().toArray(new Header[requestHeaders.size()]);
}
// ---------------------------------------------------------------- Queries
@@ -367,7 +368,7 @@
* Return an array my response headers.
*/
public Header[] getResponseHeaders() {
- return (Header[])(responseHeaders.values().toArray(new Header[responseHeaders.size()]));
+ return (Header[]) responseHeaders.values().toArray(new Header[responseHeaders.size()]);
}
/**
@@ -409,7 +410,7 @@
* but not recycled.
*/
public boolean hasBeenUsed() {
- return used;
+ return used;
}
@@ -451,14 +452,14 @@
Set visited = new HashSet();
Set realms = new HashSet();
int retryCount = 0;
- for(;;) {
- visited.add(connection.getHost() + ":" + connection.getPort() + "|" + HttpMethodBase.generateRequestLine(connection, getName(),getPath(),getQueryString(),(http11 ? "HTTP/1.1" : "HTTP/1.0")));
+ for (;;) {
+ visited.add(connection.getHost() + ':' + connection.getPort() + '|' + HttpMethodBase.generateRequestLine(connection, getName(), getPath(), getQueryString(), (http11 ? "HTTP/1.1" : "HTTP/1.0")));
if (log.isDebugEnabled()) {
log.debug("HttpMethodBase.execute(): looping.");
}
- try{
+ try {
if (!connection.isOpen()) {
if (log.isDebugEnabled()) {
log.debug("HttpMethodBase.execute(): opening connection.");
@@ -466,13 +467,13 @@
connection.open();
}
- writeRequest(state,connection);
+ writeRequest(state, connection);
used = true;
// need to close output?, but when?
- readResponse(state,connection);
- }catch(HttpRecoverableException e){
- if(retryCount >= maxRetries){
+ readResponse(state, connection);
+ } catch (HttpRecoverableException e) {
+ if (retryCount >= maxRetries) {
throw new HttpException(e.toString());
}
retryCount++;
@@ -482,12 +483,12 @@
}
if (HttpStatus.SC_CONTINUE == statusCode) {
if (!bodySent) {
- bodySent = writeRequestBody(state,connection);
+ bodySent = writeRequestBody(state, connection);
} else {
log.warn("HttpMethodBase.execute(): received 100 response, but I've already sent the response.");
// According to RFC 2616 this respose should be ignored
}
- readResponse(state,connection);
+ readResponse(state, connection);
}
if (!http11) {
@@ -520,8 +521,8 @@
boolean authenticated = false;
try {
- authenticated = Authenticator.authenticate(this,state);
- } catch(HttpException e) {
+ authenticated = Authenticator.authenticate(this, state);
+ } catch (HttpException e) {
// ignored
}
if (!authenticated) {
@@ -567,8 +568,8 @@
if (-1 == port) {
port = connection.isSecure() ? 443 : 80;
}
- url = new URL(protocol,connection.getHost(),port,location.getValue());
- } else if(!isStrictMode() && location.getValue().indexOf("://") < 0) {
+ url = new URL(protocol, connection.getHost(), port, location.getValue());
+ } else if (!isStrictMode() && location.getValue().indexOf("://") < 0) {
/*
* Location doesn't start with / but it doesn't contain a protocol.
* Per RFC 2616, that's an error. In non-strict mode we'll try
@@ -576,16 +577,16 @@
*/
String protocol = connection.isSecure() ? "https" : "http";
int port = connection.getPort();
- if(-1 == port) {
+ if (-1 == port) {
port = connection.isSecure() ? 443 : 80;
}
- URL currentUrl = new URL(protocol,connection.getHost(),port,getPath());
+ URL currentUrl = new URL(protocol, connection.getHost(), port, getPath());
url = new URL(currentUrl, location.getValue());
} else {
url = new URL(location.getValue());
}
- } catch(MalformedURLException e) {
- log.error("Exception while parsing location header \"" + location + "\"",e);
+ } catch (MalformedURLException e) {
+ log.error("Exception while parsing location header \"" + location + "\"", e);
throw new HttpException(e.toString());
}
if ("http".equalsIgnoreCase(url.getProtocol())) {
@@ -623,7 +624,7 @@
String qs = URIUtil.getQueryString(url.toString());
// if we haven't already, let's try it again with the new path
- if (visited.contains(connection.getHost() + ":" + connection.getPort() + "|" + HttpMethodBase.generateRequestLine(connection, getName(),absolutePath,qs,(http11 ? "HTTP/1.1" : "HTTP/1.0")))) {
+ if (visited.contains(connection.getHost() + ":" + connection.getPort() + "|" + HttpMethodBase.generateRequestLine(connection, getName(), absolutePath, qs, (http11 ? "HTTP/1.1" : "HTTP/1.0")))) {
throw new HttpException("Redirect going into a loop, visited \"" + absolutePath + "\" already.");
} else {
if (log.isDebugEnabled()) {
@@ -687,12 +688,12 @@
*/
protected void writeRequest(HttpState state, HttpConnection conn) throws IOException, HttpException {
if (log.isDebugEnabled()) {
- log.debug("HttpMethodBase.writeRequest(HttpState,HttpConnection)");
+ log.debug("HttpMethodBase.writeRequest(HttpState, HttpConnection)");
}
- writeRequestLine(state,conn);
- writeRequestHeaders(state,conn);
+ writeRequestLine(state, conn);
+ writeRequestHeaders(state, conn);
conn.writeLine(); // close head
- bodySent = writeRequestBody(state,conn);
+ bodySent = writeRequestBody(state, conn);
}
@@ -709,9 +710,9 @@
*/
protected void writeRequestLine(HttpState state, HttpConnection conn) throws IOException, HttpException {
if (log.isDebugEnabled()) {
- log.debug("HttpMethodBase.writeRequestLine(HttpState,HttpConnection)");
+ log.debug("HttpMethodBase.writeRequestLine(HttpState, HttpConnection)");
}
- String requestLine = HttpMethodBase.generateRequestLine(conn, getName(),getPath(),getQueryString(),(http11 ? "HTTP/1.1" : "HTTP/1.0"));
+ String requestLine = HttpMethodBase.generateRequestLine(conn, getName(), getPath(), getQueryString(), (http11 ? "HTTP/1.1" : "HTTP/1.0"));
conn.print(requestLine);
}
@@ -733,11 +734,11 @@
*/
protected void writeRequestHeaders(HttpState state, HttpConnection conn) throws IOException, HttpException {
if (log.isDebugEnabled()) {
- log.debug("HttpMethodBase.writeRequestHeaders(HttpState,HttpConnection)");
+ log.debug("HttpMethodBase.writeRequestHeaders(HttpState, HttpConnection)");
}
- addRequestHeaders(state,conn);
+ addRequestHeaders(state, conn);
Iterator it = requestHeaders.values().iterator();
- while(it.hasNext()) {
+ while (it.hasNext()) {
conn.print(((Header)it.next()).toExternalForm());
}
}
@@ -763,11 +764,11 @@
* @param conn the {@link HttpConnection} the headers will eventually be written to
*/
protected void addRequestHeaders(HttpState state, HttpConnection conn) throws IOException, HttpException {
- addUserAgentRequestHeader(state,conn);
- addHostRequestHeader(state,conn);
- addCookieRequestHeader(state,conn);
- addAuthorizationRequestHeader(state,conn);
- addContentLengthRequestHeader(state,conn);
+ addUserAgentRequestHeader(state, conn);
+ addHostRequestHeader(state, conn);
+ addCookieRequestHeader(state, conn);
+ addAuthorizationRequestHeader(state, conn);
+ addContentLengthRequestHeader(state, conn);
}
/**
@@ -789,7 +790,12 @@
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")) {
- setRequestHeader("Host",conn.getHost());
+ int port = conn.getPort();
+ if (port != 80) {
+ setRequestHeader("Host", conn.getHost() + ':' + port);
+ } else {
+ setRequestHeader("Host", conn.getHost());
+ }
}
}
@@ -798,7 +804,7 @@
*/
protected void addCookieRequestHeader(HttpState state, HttpConnection conn) throws IOException, HttpException {
Header cookieHeader = Cookie.createCookieHeader(conn.getHost(), conn.getPort(), getPath(), conn.isSecure(), new Date(), state.getCookies());
- if(null != cookieHeader) {
+ if (null != cookieHeader) {
setRequestHeader(cookieHeader);
}
}
@@ -814,8 +820,8 @@
Header wwwAuthenticateHeader = (Header)(responseHeaders.get("www-authenticate"));
if (null != wwwAuthenticateHeader) {
try {
- Authenticator.authenticate(this,state);
- } catch(HttpException e) {
+ Authenticator.authenticate(this, state);
+ } catch (HttpException e) {
// ignored
}
}
@@ -833,9 +839,9 @@
int len = getRequestContentLength();
if (!requestHeaders.containsKey("content-length")) {
if (0 < len) {
- setRequestHeader("Content-Length",String.valueOf(len));
+ setRequestHeader("Content-Length", String.valueOf(len));
} else if (http11 && (len < 0)) {
- setRequestHeader("Transfer-Encoding","chunked");
+ setRequestHeader("Transfer-Encoding", "chunked");
}
}
}
@@ -916,14 +922,14 @@
*/
protected void readResponse(HttpState state, HttpConnection conn) throws IOException, HttpException {
if (log.isDebugEnabled()) {
- log.debug("HttpMethodBase.readResponse(HttpState,HttpConnection)");
+ log.debug("HttpMethodBase.readResponse(HttpState, HttpConnection)");
}
- readStatusLine(state,conn);
- processStatusLine(state,conn);
- readResponseHeaders(state,conn);
- processResponseHeaders(state,conn);
- readResponseBody(state,conn);
- processResponseBody(state,conn);
+ readStatusLine(state, conn);
+ processStatusLine(state, conn);
+ readResponseHeaders(state, conn);
+ processResponseHeaders(state, conn);
+ readResponseBody(state, conn);
+ processResponseBody(state, conn);
}
/**
@@ -942,14 +948,14 @@
*/
protected void readStatusLine(HttpState state, HttpConnection conn) throws IOException, HttpException {
if (log.isDebugEnabled()) {
- log.debug("HttpMethodBase.readStatusLine(HttpState,HttpConnection)");
+ log.debug("HttpMethodBase.readStatusLine(HttpState, HttpConnection)");
}
statusCode = -1;
statusText = null;
String statusLine = conn.readLine();
- while(statusLine != null && !statusLine.startsWith("HTTP/")) {
+ while (statusLine != null && !statusLine.startsWith("HTTP/")) {
statusLine = conn.readLine();
}
if (statusLine == null) {
@@ -1032,7 +1038,7 @@
}
responseHeaders.clear();
- for(;;) {
+ for (;;) {
String line = conn.readLine();
if ((line == null) || (line.length() < 1)) {
break;
@@ -1052,9 +1058,9 @@
} else {
String oldvalue = header.getValue();
if (null != oldvalue) {
- header = new Header(name,oldvalue + ", " + value);
+ header = new Header(name, oldvalue + ", " + value);
} else {
- header = new Header(name,value);
+ header = new Header(name, value);
}
}
responseHeaders.put(match, header);
@@ -1087,7 +1093,7 @@
// add cookies, if any
// should we set cookies?
Header setCookieHeader = getResponseHeader("set-cookie2");
- if (null == setCookieHeader) { //ignore old-style if new is supported
+ if (null == setCookieHeader) { // ignore old-style if new is supported
setCookieHeader = getResponseHeader("set-cookie");
}
@@ -1096,7 +1102,7 @@
Cookie[] cookies = Cookie.parse(conn.getHost(), conn.getPort(), getPath(), conn.isSecure(), setCookieHeader);
state.addCookies(cookies);
} catch (Exception e) {
- log.error("processResponseHeaders(HttpState,HttpConnection)",e);
+ log.error("processResponseHeaders(HttpState, HttpConnection)", e);
}
}
}
@@ -1159,14 +1165,14 @@
if (null != lengthHeader) {
try {
expectedLength = Integer.parseInt(lengthHeader.getValue());
- } catch(NumberFormatException e) {
+ } catch (NumberFormatException e) {
// ignored
}
} else if (null != transferEncodingHeader) {
if ("chunked".equalsIgnoreCase(transferEncodingHeader.getValue())) {
expectedLength = -1;
}
- } else if(canResponseHaveBody(statusCode)){
+ } else if (canResponseHaveBody(statusCode)) {
/*
* According to the specification, a response with neither Content-Length
* nor Transfer-Encoding indicates that the response has no body. In
@@ -1180,7 +1186,7 @@
InputStream is = conn.getResponseInputStream(this);
byte[] buffer = new byte[4096];
int nb = 0;
- while(expectedLength == -1 || foundLength < expectedLength) {
+ while (expectedLength == -1 || foundLength < expectedLength) {
nb = is.read(buffer);
if (nb == -1) {
break;
@@ -1287,7 +1293,7 @@
*/
protected static String generateRequestLine(HttpConnection connection, String name, String reqPath, String qString, String protocol) {
StringBuffer buf = new StringBuffer();
- buf.append(null == reqPath ? "/" : URIUtil.encode(reqPath,URIUtil.pathSafe()));
+ buf.append(null == reqPath ? "/" : URIUtil.encode(reqPath, URIUtil.pathSafe()));
if (null != qString) {
if (qString.indexOf("?") < 0) {
buf.append("?");
@@ -1302,7 +1308,7 @@
return (name +
" https://" +
connection.getHost() +
- ((443 == connection.getPort() || -1 == connection.getPort()) ? "" : (":" + connection.getPort()) ) +
+ ((443 == connection.getPort() || -1 == connection.getPort()) ? "" : (":" + connection.getPort())) +
buf.toString() +
" " +
protocol +
@@ -1311,7 +1317,7 @@
return (name +
" http://" +
connection.getHost() +
- ((80 == connection.getPort() || -1 == connection.getPort()) ? "" : (":" + connection.getPort()) ) +
+ ((80 == connection.getPort() || -1 == connection.getPort()) ? "" : (":" + connection.getPort())) +
buf.toString() +
" " +
protocol +
@@ -1331,9 +1337,9 @@
{
boolean result = true;
- if((status >= 100 && status <= 199) || // 1XX
+ if ((status >= 100 && status <= 199) || // 1XX
status == 204 || // NO CONTENT
- status == 304){ // NOT MODIFIED
+ status == 304) { // NOT MODIFIED
result = false;
}
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>