mbecke      2003/07/10 18:07:30

  Modified:    httpclient/src/java/org/apache/commons/httpclient
                        HttpMethodBase.java
  Log:
  One more try at handling non chunked transfer encodings.
  PR: 21378
  Submitted by: Oleg Kalnichevski
  Reviewed by: Michael Becke
  
  Revision  Changes    Path
  1.164     +19 -21    
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.163
  retrieving revision 1.164
  diff -u -r1.163 -r1.164
  --- HttpMethodBase.java       8 Jul 2003 21:59:18 -0000       1.163
  +++ HttpMethodBase.java       11 Jul 2003 01:07:29 -0000      1.164
  @@ -71,6 +71,7 @@
   import java.util.BitSet;
   import java.util.HashSet;
   import java.util.Set;
  +
   import org.apache.commons.httpclient.auth.AuthScheme;
   import org.apache.commons.httpclient.auth.AuthenticationException;
   import org.apache.commons.httpclient.auth.HttpAuthenticator;
  @@ -2041,26 +2042,23 @@
               is = new WireLogInputStream(is);
           }
           InputStream result = null;
  -        Header[] transferEncodingHeaders = 
responseHeaders.getHeaders("Transfer-Encoding");
  +        Header transferEncodingHeader = 
responseHeaders.getFirstHeader("Transfer-Encoding");
           // We use Transfer-Encoding if present and ignore Content-Length.
           // RFC2616, 4.4 item number 3
  -        if (transferEncodingHeaders.length > 0) {
  -            boolean containsChunked = false;
  -            for (int i = 0; i < transferEncodingHeaders.length; i++) {
  -                String encoding = transferEncodingHeaders[i].getValue();
  -                if ("chunked".equalsIgnoreCase(encoding)) {
  -                    containsChunked = true;
  -                    break;
  -                } else if ("identity".equalsIgnoreCase(encoding)) {
  -                    //No content transformation needed
  -                } else {
  -                    if (LOG.isWarnEnabled()) {
  -                        LOG.warn("Unsupported transfer encoding: " + encoding);
  -                    }
  +        if (transferEncodingHeader != null) {
  +
  +            String transferEncoding = transferEncodingHeader.getValue();
  +            if (!"chunked".equalsIgnoreCase(transferEncoding) 
  +                && !"identity".equalsIgnoreCase(transferEncoding)) {
  +                if (LOG.isWarnEnabled()) {
  +                    LOG.warn("Unsupported transfer encoding: " + transferEncoding);
                   }
               }
  -            if (containsChunked) {
  -                // Some HTTP servers do not bother sending a closing chunk 
  +            HeaderElement[] encodings = transferEncodingHeader.getValues();
  +            // The chunked encoding must be the last one applied
  +            // RFC2616, 14.41
  +            int len = encodings.length;            
  +            if ((len > 0) && ("chunked".equalsIgnoreCase(encodings[len - 
1].getName()))) { 
                   // if response body is empty
                   if (conn.isResponseAvailable(conn.getSoTimeout())) {
                       result = new ChunkedInputStream(is, this);
  @@ -2074,7 +2072,7 @@
               } else {
                   if (isStrictMode() && LOG.isWarnEnabled()) {
                       LOG.warn("Transfer-Encoding is set but does not contain 
\"chunked\": "
  -                        + getResponseHeader("Transfer-Encoding"));
  +                        + transferEncoding);
                   }
                   // The connection must be terminated by closing 
                   // the socket as per RFC 2616, 3.6
  
  
  

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

Reply via email to