You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by di...@apache.org on 2002/08/02 08:37:26 UTC

cvs commit: jakarta-commons/httpclient/src/java/org/apache/commons/httpclient HttpMethodBase.java

dion        2002/08/01 23:37:26

  Modified:    httpclient/src/java/org/apache/commons/httpclient
                        HttpMethodBase.java
  Log:
  Refactored execute method out
  
  Revision  Changes    Path
  1.41      +284 -201  jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpMethodBase.java
  
  Index: HttpMethodBase.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpMethodBase.java,v
  retrieving revision 1.40
  retrieving revision 1.41
  diff -u -r1.40 -r1.41
  --- HttpMethodBase.java	30 Jul 2002 03:01:47 -0000	1.40
  +++ HttpMethodBase.java	2 Aug 2002 06:37:26 -0000	1.41
  @@ -167,7 +167,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) {
  @@ -177,7 +178,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.
        */
  @@ -194,7 +196,7 @@
        */
       public void setRequestHeader(String headerName, String headerValue) {
           Header header = new Header(headerName, headerValue);
  -        requestHeaders.put(headerName.toLowerCase(),header);
  +        setRequestHeader(header);
       }
   
       /**
  @@ -222,16 +224,34 @@
           //   - HTTP/1.0 (4.3)
           Header header = (Header)(requestHeaders.get(headerName.toLowerCase()));
           if (null == header) {
  +            // header doesn't exist already, simply create with name and value
               header = new Header(headerName, headerValue);
           } else {
  -            header.setValue( (null == header.getValue() ? "" : header.getValue()) +
  -                             ", " +
  -                             (null == headerValue ? "" : headerValue));
  +            // header exists, add this value to the comma separated list
  +            header.setValue(getNewHeaderValue(header, headerValue));
           }
  -        requestHeaders.put(headerName.toLowerCase(),header);
  +        setRequestHeader(header);
       }
   
       /**
  +     * "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."
  +     */
  +    private String getNewHeaderValue(Header existingHeader, String value) {
  +        String existingValue = existingHeader.getValue();
  +        if (existingValue == null) {
  +            existingValue = "";
  +        }
  +        String newValue = value;
  +        if (value == null) {
  +            newValue = "";
  +        }
  +        return existingValue + ", " + newValue;
  +    }
  +    
  +    /**
        * Add the specified request header.
        *
        * If a header of the same name already exists, the new value will be
  @@ -242,26 +262,13 @@
        * @param header the header to add to the request
        */
       public void addRequestHeader(Header header) {
  -        // "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)
           log.trace("HttpMethodBase.addRequestHeader(Header)");
   
  -        if (header == null){
  -	   log.debug("null header value ignored");
  -	}
  -
  -	// Preserve the original header if it exists
  -        Header orig = (Header)(requestHeaders.get(header.getName().toLowerCase()));
  -        if (null == orig) {
  -            orig = header;
  +        if (header == null) {
  +          log.debug("null header value ignored");
           } else {
  -            orig.setValue((null == orig.getValue() ? "" : orig.getValue())
  -                + ", " + (null == header.getValue() ? "" : header.getValue()));
  +            addRequestHeader(header.getName(), header.getValue());
           }
  -        requestHeaders.put(orig.getName().toLowerCase(), orig);
       }
   
       /**
  @@ -315,21 +322,20 @@
        */
       public void setQueryString(NameValuePair[] params) {
           log.trace("enter HttpMethodBase.setQueryString(NameValuePair[])");
  -
           StringBuffer buf = new StringBuffer();
           boolean needAmp = false;
  -        for(int i=0;i<params.length;i++) {
  -            if (needAmp) {
  -                buf.append("&");
  -            } else {
  -                needAmp = true;
  -            }
  -            if (null != params[i].getName()) {
  -                buf.append(URIUtil.encode(params[i].getName()));
  -            }
  -            if (null != params[i].getValue()) {
  -                buf.append("=");
  -                buf.append(URIUtil.encode(params[i].getValue()));
  +        for(int i = 0;i < params.length; i++) {
  +            if (params[i].getName() != null) {
  +                if (needAmp) {
  +                    buf.append("&");
  +                } else {
  +                    needAmp = true;
  +                }
  +                buf.append(URIUtil.encode(params[i].getName()))
  +                    .append("=");
  +                if (params[i].getValue() != null) {
  +                    buf.append(URIUtil.encode(params[i].getValue()));
  +                }
               }
           }
           queryString = buf.toString();
  @@ -346,7 +352,8 @@
        * 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
  @@ -369,7 +376,8 @@
       }
   
       /**
  -     * Return the status text (or "reason phrase") associated with the latest response.
  +     * Return the status text (or "reason phrase") associated with the latest
  +     * response.
        */
       public String getStatusText() {
           return statusText;
  @@ -379,7 +387,8 @@
        * 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()]));
       }
   
       /**
  @@ -413,7 +422,8 @@
        * Otherwise return <tt>null</tt>.
        */
       public InputStream getResponseBodyAsStream() throws IOException {
  -        return null == responseBody ? null : new ByteArrayInputStream(responseBody);
  +        return null == responseBody ? null : 
  +            new ByteArrayInputStream(responseBody);
       }
   
       /**
  @@ -424,26 +434,198 @@
          return used;
       }
   
  +    /**
  +     * Write a request and read the response. Retry, if needed, up to 
  +     * {@link #maxRetries} times.
  +     *
  +     * @param state the current state
  +     * @param connection the connection for communication
  +     * @throws HttpException when errors occur as part of the HTTP protocol
  +     *      conversation
  +     * @throws IOException when an I/O error occurs communicating with the 
  +     *      server
  +     */
  +    private void processRequest(HttpState state, HttpConnection connection)
  +    throws HttpException, IOException {
  +        for (int retryCount = 1; retryCount <= maxRetries; retryCount++) {
  +            try {
  +                if (!connection.isOpen()) {
  +                    log.debug("HttpMethodBase.execute(): opening connection.");
  +                    connection.open();
  +                }
  +                writeRequest(state, connection);
  +                used = true;
  +                readResponse(state,connection);
  +                return;
  +            } catch (HttpRecoverableException e) {
  +                connection.close();
  +                log.debug("HttpMethodBase.processRequest():  retrying...");
  +                if (retryCount == maxRetries) {
  +                    throw e;
  +                }
  +            }
  +        }
  +        // should never happen
  +        throw new HttpException("HttpMethodBase.processRequest(): retry count"
  +            + " exceeded");
  +    }
  +    
  +    /**
  +     * On a {@link HttpStatus#SC_CONTINUE continue}, if there are more request
  +     * bytes to be sent, write them to the connection
  +     *
  +     * @param state the current state
  +     * @param connection the connection for communication
  +     * @throws HttpException when errors occur as part of the HTTP protocol
  +     *      conversation
  +     * @throws IOException when an I/O error occurs communicating with the 
  +     *      server
  +     */
  +    private void writeRemainingRequestBody(HttpState state, 
  +    HttpConnection connection) throws HttpException, IOException {
  +        if (HttpStatus.SC_CONTINUE == statusCode) {
  +            if (!bodySent) {
  +                bodySent = writeRequestBody(state, connection);
  +            } else {
  +                log.warn("HttpMethodBase.execute(): received 100 response, "
  +                    + "but I've already sent the response. Ignoring.");
  +                // According to RFC 2616 this respose should be ignored
  +            }
  +            readResponse(state,connection);
  +        }
  +    }
  +
  +    /**
  +     * Close the provided HTTP connection, if:
  +     *  http 1.0 and not using the 'connect' method, or
  +     *  http 1.1 and the Connection: close header is sent
  +     *
  +     * @param connection the HTTP connection to process
  +     */
  +    private void closeConnection(HttpConnection connection) {
  +        if (!http11) {
  +            if (getName().equals(ConnectMethod.NAME) 
  +                && (statusCode == HttpStatus.SC_OK)) {
  +                log.debug("HttpMethodBase.execute(): leaving connection "
  +                    + "open for tunneling");
  +            } else {
  +                log.debug("HttpMethodBase.execute(): closing connection "
  +                    + "since we're using HTTP/1.0");
  +                connection.close();
  +            }
  +        } else {
  +            Header connectionHeader = getResponseHeader("connection");
  +            if (null != connectionHeader
  +                && "close".equalsIgnoreCase(connectionHeader.getValue())) {
  +                log.debug("HttpMethodBase.execute(): closing connection "
  +                    + "since \"Connection: close\" header found.");
  +                connection.close();
  +            }
  +        }
  +
  +    }
  +    
  +    /**
  +     * process a response that requires authentication
  +     *
  +     * @param state the current state
  +     * @param connection the connection for communication
  +     * @return true if the request has completed process, false if more attempts
  +     *      are needed
  +     */
  +    private boolean processAuthenticationResponse(HttpState state, 
  +    HttpConnection connection) {
  +
  +        Set realms = new HashSet();
  +        Set proxyRealms = new HashSet();
  +
  +        // handle authentication required
  +        Header wwwauth = null;
  +        Set realmsUsed = null;
  +        switch (statusCode) {
  +            case HttpStatus.SC_UNAUTHORIZED:
  +                wwwauth = getResponseHeader(Authenticator.WWW_AUTH);
  +                realmsUsed = realms;
  +                break;
   
  +            case HttpStatus.SC_PROXY_AUTHENTICATION_REQUIRED:
  +                wwwauth = getResponseHeader(Authenticator.PROXY_AUTH);
  +                realmsUsed = proxyRealms;
  +                break;
  +        }
  +        boolean authenticated = false;
  +        // if there was a header requesting authentication
  +        if (null != wwwauth) {
  +            String pathAndCreds = getPath() + ":" + wwwauth.getValue();
  +            if (realmsUsed.contains(pathAndCreds)) {
  +                if (log.isInfoEnabled()) {
  +                    log.info("Already tried to authenticate to \"" 
  +                        + wwwauth.getValue() + "\" but still receiving "
  +                        + statusCode + ".");
  +                }
  +                return true;
  +            } else {
  +                realmsUsed.add(pathAndCreds);
  +            }
  +
  +            try {
  +                //remove preemptive header and reauthenticate
  +                switch (statusCode) {
  +                    case HttpStatus.SC_UNAUTHORIZED:
  +                        removeRequestHeader(Authenticator.WWW_AUTH_RESP);
  +                        authenticated = Authenticator.authenticate(this, state);
  +                        break;
  +                    case HttpStatus.SC_PROXY_AUTHENTICATION_REQUIRED:
  +                        removeRequestHeader(Authenticator.PROXY_AUTH_RESP); 
  +                        authenticated = Authenticator.authenticateProxy(this,state);
  +                        break;
  +                }
  +            } catch (HttpException httpe) {
  +                log.warn("Exception thrown authenticating", httpe);
  +                return true; // finished request
  +            } catch (UnsupportedOperationException uoe) {
  +                log.warn("Exception thrown authenticating", uoe);
  +                return true; // finished request
  +            }
  +
  +            if (!authenticated) {
  +                // won't be able to authenticate to this challenge
  +                // without additional information
  +                log.debug("HttpMethodBase.execute(): Server demands "
  +                    + "authentication credentials, but none are "
  +                    + "available, so aborting.");
  +            } else {
  +                log.debug("HttpMethodBase.execute(): Server demanded "
  +                    + "authentication credentials, will try again.");
  +                // let's try it again, using the credentials
  +            }
  +        }
  +        
  +        return !authenticated; // finished processing if we aren't authenticated
  +    }
  +    
       // --------------------------------------------------------- Action Methods
   
   
       /**
        * Execute this method.
        *
  -     * @param state {@link HttpState} information to associate with this request. Must be non-null.
  -     * @param connection the {@link HttpConnection} to write to/read from. Must be non-null.
  +     * @param state {@link HttpState} information to associate with this 
  +     *      request. Must be non-null.
  +     * @param connection the {@link HttpConnection} to write to/read from.
  +     *      Must be non-null.
        *
        * @throws IOException if an I/O error occurs
        * @throws HttpException  if an protocol exception occurs
        *
        * @return the integer status code if one was obtained, or <tt>-1</tt>
        */
  -    public int execute(HttpState state, HttpConnection connection)
  +    public int execute(HttpState state, HttpConnection connection) 
       throws HttpException, IOException {
           // FIXME: This method is too large
           log.trace("enter HttpMethodBase.execute(HttpState, HttpConnection)");
   
  +
           if (null == state) {
               throw new NullPointerException("HttpState parameter");
           }
  @@ -462,138 +644,39 @@
   
           //pre-emptively add the authorization header, if required.
           Authenticator.authenticate(this, state);
  -        if (connection.isProxied()) Authenticator.authenticateProxy(this, state);
  +        if (connection.isProxied()) {
  +            Authenticator.authenticateProxy(this, state);
  +        }
   
           Set visited = new HashSet();
  -        Set realms = new HashSet();
  -        Set proxyRealms = new HashSet();
  -        int retryCount = 0;
  +        retryCount = 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{
  -                if (!connection.isOpen()) {
  -                    if (log.isDebugEnabled()) {
  -                        log.debug("HttpMethodBase.execute(): opening connection.");
  -                    }
  -                    connection.open();
  -                }
  -
  -                writeRequest(state,connection);
  -                used = true;
  -
  -                // need to close output?, but when?
  -                readResponse(state,connection);
  -            }catch(HttpRecoverableException e){
  -                if(retryCount >= maxRetries){
  -                    throw new HttpException(e.toString());
  -                }
  -                retryCount++;
  -                connection.close();
  -                log.debug("HttpMethodBase.execute():  Caught recoverable exception, retrying...");
  -                continue;
  -            }
  -            if (HttpStatus.SC_CONTINUE == statusCode) {
  -                if (!bodySent) {
  -                    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);
  -            }
  -
  -            if (!http11) {
  -                if (getName().equals(ConnectMethod.NAME) && (statusCode == HttpStatus.SC_OK)) {
  -                    log.debug("HttpMethodBase.execute(): leaving connection open for tunneling");
  -                } else {
  -                if (log.isDebugEnabled()) {
  -                	log.debug("HttpMethodBase.execute(): closing connection since we're using HTTP/1.0");
  -                }
  -                connection.close();
  -                }
  -            } else {
  -                Header connectionHeader = getResponseHeader("connection");
  -                if (null != connectionHeader && "close".equalsIgnoreCase(connectionHeader.getValue())) {
  -                    if (log.isDebugEnabled()) {
  -                    		log.debug("HttpMethodBase.execute(): closing connection since \"Connection: close\" header found.");
  -                    }
  -                    connection.close();
  -                }
  -            }
  +            visited.add(connection.getHost() + ":" + connection.getPort() + "|"
  +                + HttpMethodBase.generateRequestLine(
  +                connection, getName(), getPath(), getQueryString(), 
  +                (http11 ? "HTTP/1.1" : "HTTP/1.0")));
  +
  +            log.debug("HttpMethodBase.execute(): looping.");
  +
  +            processRequest(state, connection);
  +            writeRemainingRequestBody(state, connection);
  +            closeConnection(connection); // if needed
   
  +            // process authentication response
               if ((HttpStatus.SC_UNAUTHORIZED == statusCode)
                   || (HttpStatus.SC_PROXY_AUTHENTICATION_REQUIRED == statusCode)) {
  -
  -                Header wwwauth = null;
  -                Set realmsUsed = null;
  -                switch (statusCode) {
  -                    case HttpStatus.SC_UNAUTHORIZED:
  -                        wwwauth = getResponseHeader(Authenticator.WWW_AUTH);
  -                        realmsUsed = realms;
  -                        break;
  -
  -                    case HttpStatus.SC_PROXY_AUTHENTICATION_REQUIRED:
  -                        wwwauth = getResponseHeader(Authenticator.PROXY_AUTH);
  -                        realmsUsed = proxyRealms;
  -                        break;
  -                }
  -                if (null != wwwauth) {
  -                    String pathAndCreds = getPath() + ":" + wwwauth.getValue();
  -                    if (realmsUsed.contains(pathAndCreds)) {
  -                        if (log.isInfoEnabled()) {
  -                            log.info("Already tried to authenticate to \"" + wwwauth.getValue() + "\" but still receiving " + statusCode + ".");
  -                        }
  -                        break;
  -                    } else {
  -                        realmsUsed.add(pathAndCreds);
  -                    }
  -
  -                    boolean authenticated = false;
  -                    try {
  -                        switch (statusCode) {
  -                            case HttpStatus.SC_UNAUTHORIZED:
  -                                removeRequestHeader(Authenticator.WWW_AUTH_RESP); //remove preemptively header
  -                        authenticated = Authenticator.authenticate(this, state);
  -                                break;
  -
  -                            case HttpStatus.SC_PROXY_AUTHENTICATION_REQUIRED:
  -                                removeRequestHeader(Authenticator.PROXY_AUTH_RESP); //remove preemptively header
  -                                authenticated = Authenticator.authenticateProxy(this,state);
  -                                break;
  -                        }
  -                    } catch (HttpException httpe) {
  -                        log.warn(httpe.getMessage());
  -                    } catch (UnsupportedOperationException uoe) {
  -                        log.warn(uoe.getMessage());
  -                    }
  -
  -                    if (!authenticated) {
  -                        // won't be able to authenticate to this challenge
  -                        // without additional information
  -                        if (log.isDebugEnabled()) {
  -                            log.debug("HttpMethodBase.execute(): Server demands authentication credentials, but none are available, so aborting.");
  -                        }
  -                        break;
  -                    } else {
  -                        if (log.isDebugEnabled()) {
  -                            log.debug("HttpMethodBase.execute(): Server demanded authentication credentials, will try again.");
  -                        }
  -                        // let's try it again, using the credentials
  -                        continue;
  -                    }
  +                if (processAuthenticationResponse(state, connection)) {
  +                    break;
  +                } else {
  +                    continue;
                   }
               } else if (HttpStatus.SC_MOVED_TEMPORARILY == statusCode ||
  -               HttpStatus.SC_MOVED_PERMANENTLY == statusCode ||
  -               HttpStatus.SC_TEMPORARY_REDIRECT == statusCode) {
  +                HttpStatus.SC_MOVED_PERMANENTLY == statusCode ||
  +                HttpStatus.SC_TEMPORARY_REDIRECT == statusCode) {
  +                // process redirect
                   if (getFollowRedirects()) {
                       //
  -                    // Note that we cannot current support
  +                    // Note that we cannot currently support
                       // redirects that change the HttpConnection
                       // parameters (host, port, protocol)
                       // because we don't yet have a good way to
  @@ -746,10 +829,9 @@
        * @param state the client state
        * @param conn the {@link HttpConnection} to write the request to
        */
  -    protected void writeRequest(HttpState state, HttpConnection conn) 
  +    protected void writeRequest(HttpState state, HttpConnection conn)
       throws IOException, HttpException {
           log.trace("enter HttpMethodBase.writeRequest(HttpState, HttpConnection)");
  -	
           writeRequestLine(state,conn);
           writeRequestHeaders(state,conn);
           conn.writeLine(); // close head
  @@ -771,9 +853,8 @@
       protected void writeRequestLine(HttpState state, HttpConnection conn)
       throws IOException, HttpException {
           log.trace("enter 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);
       }
   
  @@ -795,8 +876,7 @@
        */
       protected void writeRequestHeaders(HttpState state, HttpConnection conn)
       throws IOException, HttpException {
  -        log.trace("enter HttpMethodBase.writeRequestHeaders(HttpState, HttpConnection)");
  -
  +        log.trace("enter HttpMethodBase.writeRequestHeaders(HttpState,HttpConnection)");
           addRequestHeaders(state,conn);
           Iterator it = requestHeaders.values().iterator();
           while(it.hasNext()) {
  @@ -841,8 +921,8 @@
        * as long as no <tt>User-Agent</tt> request header
        * already exists.
        */
  -    protected void addUserAgentRequestHeader(HttpState state, HttpConnection conn)
  -    throws IOException, HttpException {
  +    protected void addUserAgentRequestHeader(HttpState state, 
  +    HttpConnection conn) throws IOException, HttpException {
           log.trace("enter HttpMethodBase.addUserAgentRequestHeaders(HttpState, HttpConnection)");
   
           if (!requestHeaders.containsKey("user-agent")) {
  @@ -855,10 +935,9 @@
        * as long as no <tt>Host</tt> request header
        * already exists.
        */
  -    protected void addHostRequestHeader(HttpState state, HttpConnection conn)
  +    protected void addHostRequestHeader(HttpState state, HttpConnection conn) 
       throws IOException, HttpException {
           log.trace("enter HttpMethodBase.addUserAgentRequestHeaders(HttpState, HttpConnection)");
  -
           // Per 19.6.1.1 of RFC 2616, it is legal for HTTP/1.0 based 
           // applications to send the Host request-header.
           // TODO: Add the ability to disable the sending of this header for HTTP/1.0 requests.
  @@ -886,9 +965,10 @@
       throws IOException, HttpException {
           log.trace("enter HttpMethodBase.addCookieRequestHeaders(HttpState, HttpConnection)");
   
  -        Header cookieHeader = Cookie.createCookieHeader(conn.getHost(), conn.getPort(), 
  -	      getPath(), conn.isSecure(), new Date(), state.getCookies());
  -        if(null != cookieHeader) {
  +        Header cookieHeader = Cookie.createCookieHeader(conn.getHost(), 
  +            conn.getPort(), getPath(), conn.isSecure(), new Date(), 
  +            state.getCookies());
  +        if (null != cookieHeader) {
               setRequestHeader(cookieHeader);
           }
       }
  @@ -898,8 +978,8 @@
        * as long as no <tt>Authorization</tt> request header
        * already exists.
        */
  -    protected void addAuthorizationRequestHeader(HttpState state, HttpConnection conn)
  -    throws IOException, HttpException {
  +    protected void addAuthorizationRequestHeader(HttpState state, 
  +    HttpConnection conn) throws IOException, HttpException {
           log.trace("enter HttpMethodBase.addAuthorizationRequestHeader(HttpState, HttpConnection)");
   
           // add authorization header, if needed
  @@ -920,8 +1000,8 @@
        * as long as no <tt>Proxy-Authorization</tt> request header
        * already exists.
        */
  -    protected void addProxyAuthorizationRequestHeader(HttpState state, HttpConnection conn)
  -    throws IOException, HttpException {
  +    protected void addProxyAuthorizationRequestHeader(HttpState state, 
  +    HttpConnection conn) throws IOException, HttpException {
           log.trace("enter HttpMethodBase.addProxyAuthorizationRequestHeader(HttpState, HttpConnection)");
   
           // add proxy authorization header, if needed
  @@ -943,8 +1023,8 @@
        * as long as no <tt>Content-Length</tt> request header
        * already exists.
        */
  -    protected void addContentLengthRequestHeader(HttpState state, HttpConnection conn)
  -    throws IOException, HttpException {
  +    protected void addContentLengthRequestHeader(HttpState state, 
  +    HttpConnection conn) throws IOException, HttpException {
           log.trace("enter HttpMethodBase.addProxyAuthorizationRequestHeader(HttpState, HttpConnection)");
   
           // add content length or chunking
  @@ -1035,8 +1115,7 @@
        */
       protected void readResponse(HttpState state, HttpConnection conn)
       throws IOException, HttpException {
  -        log.debug("enter HttpMethodBase.readResponse(HttpState, HttpConnection)");
  -
  +        log.trace("enter HttpMethodBase.readResponse(HttpState, HttpConnection)");
           readStatusLine(state,conn);
           processStatusLine(state,conn);
           readResponseHeaders(state,conn);
  @@ -1059,7 +1138,7 @@
        * @param state the client state
        * @param conn the {@link HttpConnection} to read the response from
        */
  -    protected void readStatusLine(HttpState state, HttpConnection conn)
  +    protected void readStatusLine(HttpState state, HttpConnection conn) 
       throws IOException, HttpException {
           log.trace("enter HttpMethodBase.readStatusLine(HttpState, HttpConnection)");
   
  @@ -1147,7 +1226,8 @@
           // to the first, each separated by a comma."
           //   - HTTP/1.0 (4.3)
   
  -        log.trace("enter HttpMethodBase.readResponseHeaders(HttpState, HttpConnection)");
  +        log.trace("enter HttpMethodBase.readResponseHeaders(HttpState,HttpConnection)");
  +
           responseHeaders.clear();
   
           String name = null;
  @@ -1227,9 +1307,9 @@
        * @param state the client state
        * @param conn the {@link HttpConnection} to read the response from
        */
  -    protected void processResponseHeaders(HttpState state, HttpConnection conn) {
  +    protected void processResponseHeaders(HttpState state, HttpConnection conn) 
  +    {
           log.trace("enter HttpMethodBase.processResponseHeaders(HttpState, HttpConnection)");
  -
           // add cookies, if any
           // should we set cookies?
           Header setCookieHeader = getResponseHeader("set-cookie2");
  @@ -1241,8 +1321,9 @@
               try {
                   Cookie[] cookies = Cookie.parse(conn.getHost(), conn.getPort(), getPath(), conn.isSecure(), setCookieHeader);
                   state.addCookies(cookies);
  -            } catch (Exception ex) {
  -                log.error("Exception caught when processing cookies", ex);
  +            } catch (Exception e) {
  +                // FIXME: Shouldn't be catching exception!
  +                log.error("Exception processing response headers", e);
               }
           }
       }
  @@ -1294,8 +1375,8 @@
        * @param conn the {@link HttpConnection} to read the response from
        * @param out OutputStream to write the response body to
        */
  -    protected void readResponseBody(HttpState state, HttpConnection conn, OutputStream out)
  -    throws IOException {
  +    protected void readResponseBody(HttpState state, HttpConnection conn, 
  +    OutputStream out) throws IOException {
           log.trace("enter HttpMethodBase.readResponseBody(HttpState, HttpConnection)");
   
           responseBody = null;
  @@ -1436,7 +1517,8 @@
        * Generate an HTTP/S request line according to
        * the specified attributes.
        */
  -    protected static String generateRequestLine(HttpConnection connection, String name, String reqPath, String qString, String protocol) {
  +    protected static String generateRequestLine(HttpConnection connection,
  +    String name, String reqPath, String qString, String protocol) {
           log.trace("enter HttpMethodBase.generateRequestLine(HttpConnection, String, String, String, String)");
   
           StringBuffer buf = new StringBuffer();
  @@ -1558,7 +1640,8 @@
       private int maxRetries = 3;
       /** True if we're in strict mode. */
       private boolean strictMode = true;
  -
  +    /** number of times a request has attempted recoverable execution */
  +    private int retryCount;
       // -------------------------------------------------------------- Constants
   
       /** Log object for this class. */
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>