rwaldhoff    01/08/13 09:01:05

  Modified:    httpclient/src/java/org/apache/commons/httpclient Tag:
                        rlwrefactoring HttpMethodBase.java
               httpclient/src/java/org/apache/commons/httpclient/methods
                        Tag: rlwrefactoring OptionsMethod.java
                        PostMethod.java PutMethod.java
  Log:
  Several changes completed over the weekend:
  + changes to processResponseXXX method signatures
  + moving cookie parsing to processResponseHeaders method
  + track visited paths to detect HTTP redirect loops
  + track authentication attempts to detect bad creds
  + re-enabled POST and PUT request body processing
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.10.2.4  +66 -37    
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.10.2.3
  retrieving revision 1.10.2.4
  diff -u -r1.10.2.3 -r1.10.2.4
  --- HttpMethodBase.java       2001/08/11 00:36:31     1.10.2.3
  +++ HttpMethodBase.java       2001/08/13 16:01:05     1.10.2.4
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpMethodBase.java,v
 1.10.2.3 2001/08/11 00:36:31 rwaldhoff Exp $
  - * $Revision: 1.10.2.3 $
  - * $Date: 2001/08/11 00:36:31 $
  + * $Header: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpMethodBase.java,v
 1.10.2.4 2001/08/13 16:01:05 rwaldhoff Exp $
  + * $Revision: 1.10.2.4 $
  + * $Date: 2001/08/13 16:01:05 $
    * ====================================================================
    * Copyright (C) The Apache Software Foundation. All rights reserved.
    *
  @@ -21,6 +21,8 @@
   import java.util.List;
   import java.util.Vector;
   import java.net.URLEncoder;
  +import java.util.HashSet;
  +import java.util.Set;
   
   import org.apache.commons.httpclient.log.*;
   
  @@ -61,6 +63,7 @@
       protected int getRequestContentLength() {
           return -1;
       }
  +
       protected boolean needExpectation() {
           return false;
       }
  @@ -218,8 +221,14 @@
               throw new HttpException("Not valid");
           }
   
  +        Set visited = new HashSet();
  +        Set realms = new HashSet();
  +
           int repeated = 0;
           while(repeated++ < 5) {
  +            // for now, just track path
  +            visited.add(getPath());
  +
               log.debug("HttpMethodBase.execute(): looping " + repeated);
               if(!connection.isOpen()) {
                   log.debug("HttpMethodBase.execute(): opening connection.");
  @@ -263,24 +272,32 @@
               if(HttpStatus.SC_UNAUTHORIZED == statusCode) {
                   Header wwwauth = getResponseHeader("WWW-Authenticate");
                   if(null != wwwauth) {
  +                    String foo = getPath() + ":" + wwwauth.getValue();
  +                    if(realms.contains(foo)) {
  +                        if(log.isInfoEnabled()) {
  +                            log.info("Already tried to authenticate to \"" + 
wwwauth.getValue() + "\" but still receiving " + HttpStatus.SC_UNAUTHORIZED + ".");
  +                            return HttpStatus.SC_UNAUTHORIZED;
  +                        }
  +                    } else {
  +                        realms.add(foo);
  +                    }
  +
                       if(null == 
Authenticator.challengeResponse(wwwauth.getValue(),state)) {
                           // won't be able to authenticate to this challenge
                           // without additional information
                           if(log.isDebugEnabled()) {
  -                            log.debug("Server demands authentication credentials, 
but none are available, so aborting.");
  +                            log.debug("HttpMethodBase.execute(): Server demands 
authentication credentials, but none are available, so aborting.");
                           }
                           return HttpStatus.SC_UNAUTHORIZED;
                       } else {
                           if(log.isDebugEnabled()) {
  -                            log.debug("Server demands authentication credentials, 
will try again.");
  +                            log.debug("HttpMethodBase.execute(): Server demands 
authentication credentials, will try again.");
                           }
                           // let's try it again, using the credentials
                           continue;
                       }
                   }
  -            }
  -
  -            if(HttpStatus.SC_MOVED_TEMPORARILY == statusCode ||
  +            } else if(HttpStatus.SC_MOVED_TEMPORARILY == statusCode ||
                  HttpStatus.SC_MOVED_PERMANENTLY == statusCode ||
                  HttpStatus.SC_TEMPORARY_REDIRECT == statusCode) {
                   if(followRedirects()) {
  @@ -306,6 +323,9 @@
                       // or from "http://www.mydomain.com/";
                       // to "https://secure.mydomain.com/";
                       //
  +
  +                    // XXX Should handle query-string changes as well!
  +
                       Header location = getResponseHeader("location");
                       if(location != null) {
                           String absolutePath = location.getValue();
  @@ -329,14 +349,24 @@
                           if(log.isDebugEnabled()) {
                               log.debug("Changing path from \"" + getPath() + "\" to 
\"" + absolutePath + "\" in response to " + statusCode + " response.");
                           }
  -                        setPath(absolutePath);
  -                        // now let's try it again with the new path
  -                        continue;
  +                        // if we haven't already, let's try it again with the new 
path
  +                        if(visited.contains(absolutePath)) {
  +                            throw new HttpException("Redirect going into a loop, 
visited \"" + absolutePath + "\" already.");
  +                        } else {
  +                            setPath(absolutePath);
  +                            continue;
  +                        }
                       } else {
                           // got a redirect response, but no location header
  -                        // log warning?
  +                        if(log.isInfoEnabled()) {
  +                            log.info("HttpMethodBase.execute(): Received " + 
statusCode + " response, but no \"Location\" header. Returning " + statusCode + ".");
  +                        }
                           return statusCode;
                       }
  +                } else {
  +                    // got a redirect response,
  +                    // but followRedirects is false
  +                    return statusCode;
                   }
               } else {
                   return statusCode;
  @@ -359,18 +389,35 @@
       protected void readResponse(State state, HttpConnection conn) throws 
IOException, HttpException {
           log.debug("HttpMethodBase.readResponse(State,HttpConnection)");
           readStatusLine(state,conn);
  -        processStatusLine();
  +        processStatusLine(state,conn);
           readResponseHeaders(state,conn);
  -        processResponseHeaders();
  +        processResponseHeaders(state,conn);
           readResponseBody(state,conn);
  -        processResponseBody();
  +        processResponseBody(state,conn);
       }
   
  -    protected void processStatusLine() {
  +    protected void processStatusLine(State state, HttpConnection conn) {
       }
  -    protected void processResponseHeaders() {
  +
  +    protected void processResponseHeaders(State state, HttpConnection conn) {
  +        // add cookies, if any
  +        // should we set cookies?
  +        Header setCookieHeader = getResponseHeader("set-cookie2");
  +        if(null == setCookieHeader) { //ignore old-style if new is supported
  +            setCookieHeader = getResponseHeader("set-cookie");
  +        }
  +
  +        if(setCookieHeader != null) {
  +            try {
  +                Cookie[] cookies = Cookie.parse(conn.getHost(), setCookieHeader);
  +                state.addCookies(cookies);
  +            } catch (Exception e) {
  +                log.error("processResponseHeaders(State,HttpConnection)",e);
  +            }
  +        }
       }
  -    protected void processResponseBody() {
  +
  +    protected void processResponseBody(State state, HttpConnection conn) {
       }
   
       protected void readStatusLine(State state, HttpConnection conn) throws 
IOException, HttpException {
  @@ -440,24 +487,6 @@
               Header header = new Header(name, value);
               responseHeaders.put(match, header);
           }
  -
  -        // add cookies, if any
  -        // should we set cookies?
  -        Header header = getResponseHeader("set-cookie2");
  -        // if the server doesn't support new cookies,
  -        // we'll use the old cookies
  -        if (header == null) {
  -            header = getResponseHeader("set-cookie");
  -        }
  -
  -        if (header != null) {
  -            try {
  -                Cookie[] cookies = Cookie.parse(conn.getHost(), header);
  -                state.addCookies(cookies);
  -            } catch (Exception e) {
  -                e.printStackTrace();
  -            }
  -        }
       }
   
       protected void readResponseBody(State state, HttpConnection conn) throws 
IOException, HttpException {
  @@ -563,7 +592,7 @@
               setRequestHeader(HttpClient.USER_AGENT);
           }
   
  -        // add host (should do this conditionally?)
  +        // add host (should do this conditionally?, i.e., don't send to http/1.0?)
           if (!requestHeaders.containsKey("host")) {
               setRequestHeader("Host",conn.getHost());
           }
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.2.2.2   +5 -4      
jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/methods/OptionsMethod.java
  
  Index: OptionsMethod.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/methods/OptionsMethod.java,v
  retrieving revision 1.2.2.1
  retrieving revision 1.2.2.2
  diff -u -r1.2.2.1 -r1.2.2.2
  --- OptionsMethod.java        2001/08/10 22:27:12     1.2.2.1
  +++ OptionsMethod.java        2001/08/13 16:01:05     1.2.2.2
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/methods/OptionsMethod.java,v
 1.2.2.1 2001/08/10 22:27:12 rwaldhoff Exp $
  - * $Revision: 1.2.2.1 $
  - * $Date: 2001/08/10 22:27:12 $
  + * $Header: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/methods/OptionsMethod.java,v
 1.2.2.2 2001/08/13 16:01:05 rwaldhoff Exp $
  + * $Revision: 1.2.2.2 $
  + * $Date: 2001/08/13 16:01:05 $
    *
    * ====================================================================
    *
  @@ -69,6 +69,7 @@
   import org.apache.commons.httpclient.State;
   import org.apache.commons.httpclient.Header;
   import org.apache.commons.httpclient.HttpMethodBase;
  +import org.apache.commons.httpclient.HttpConnection;
   
   
   /**
  @@ -137,7 +138,7 @@
   
       // ----------------------------------------------------- HttpMethod Methods
   
  -    protected void processResponseHeaders() {
  +    protected void processResponseHeaders(State state, HttpConnection conn) {
           Header allowHeader = getResponseHeader("allow");
           if (allowHeader != null) {
               String allowHeaderValue = allowHeader.getValue();
  
  
  
  1.3.2.2   +108 -87   
jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/methods/PostMethod.java
  
  Index: PostMethod.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/methods/PostMethod.java,v
  retrieving revision 1.3.2.1
  retrieving revision 1.3.2.2
  diff -u -r1.3.2.1 -r1.3.2.2
  --- PostMethod.java   2001/08/10 22:27:12     1.3.2.1
  +++ PostMethod.java   2001/08/13 16:01:05     1.3.2.2
  @@ -1,64 +1,13 @@
   /*
  - * $Header: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/methods/PostMethod.java,v
 1.3.2.1 2001/08/10 22:27:12 rwaldhoff Exp $
  - * $Revision: 1.3.2.1 $
  - * $Date: 2001/08/10 22:27:12 $
  - *
  - * ====================================================================
  - *
  - * The Apache Software License, Version 1.1
  - *
  - * Copyright (c) 1999 The Apache Software Foundation.  All rights
  - * reserved.
  - *
  - * Redistribution and use in source and binary forms, with or without
  - * modification, are permitted provided that the following conditions
  - * are met:
  - *
  - * 1. Redistributions of source code must retain the above copyright
  - *    notice, this list of conditions and the following disclaimer.
  - *
  - * 2. Redistributions in binary form must reproduce the above copyright
  - *    notice, this list of conditions and the following disclaimer in
  - *    the documentation and/or other materials provided with the
  - *    distribution.
  - *
  - * 3. The end-user documentation included with the redistribution, if
  - *    any, must include the following acknowlegement:
  - *       "This product includes software developed by the
  - *        Apache Software Foundation (http://www.apache.org/)."
  - *    Alternately, this acknowlegement may appear in the software itself,
  - *    if and wherever such third-party acknowlegements normally appear.
  - *
  - * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
  - *    Foundation" must not be used to endorse or promote products derived
  - *    from this software without prior written permission. For written
  - *    permission, please contact [EMAIL PROTECTED]
  - *
  - * 5. Products derived from this software may not be called "Apache"
  - *    nor may "Apache" appear in their names without prior written
  - *    permission of the Apache Group.
  - *
  - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  - * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  - * SUCH DAMAGE.
  + * $Header: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/methods/PostMethod.java,v
 1.3.2.2 2001/08/13 16:01:05 rwaldhoff Exp $
  + * $Revision: 1.3.2.2 $
  + * $Date: 2001/08/13 16:01:05 $
    * ====================================================================
  - *
  - * This software consists of voluntary contributions made by many
  - * individuals on behalf of the Apache Software Foundation.  For more
  - * information on the Apache Software Foundation, please see
  - * <http://www.apache.org/>.
  + * Copyright (C) The Apache Software Foundation. All rights reserved.
    *
  - * [Additional notices, if required by prior licensing conditions]
  - *
  + * This software is published under the terms of the Apache Software License
  + * version 1.1, a copy of which has been included with this distribution in
  + * the LICENSE file.
    */
   
   package org.apache.commons.httpclient.methods;
  @@ -66,10 +15,13 @@
   import java.io.*;
   import java.util.*;
   import java.net.URLEncoder;
  -import org.apache.commons.httpclient.HttpStatus;
   import org.apache.commons.httpclient.State;
  -import org.apache.commons.httpclient.Header;
  -
  +import org.apache.commons.httpclient.HttpConnection;
  +import org.apache.commons.httpclient.HttpMethodBase;
  +import org.apache.commons.httpclient.HttpException;
  +import java.util.Iterator;
  +import java.util.HashMap;
  +import java.util.List;
   
   /**
    * POST Method.
  @@ -77,8 +29,7 @@
    * @author <a href="mailto:[EMAIL PROTECTED]";>Remy Maucherat</a>
    * @author <a href="mailto:[EMAIL PROTECTED]";>Doug Sale</a>
    */
  -public class PostMethod
  -    extends GetMethod {
  +public class PostMethod extends GetMethod {
   
   
       // ----------------------------------------------------------- Constructors
  @@ -125,39 +76,108 @@
                         String tempFile) {
           super(path, useDisk, tempDir, tempFile);
       }
  -
  -
  -    // ----------------------------------------------------- Instance Variables
   
  -
  -    /**
  -     * Parameters hashtable.
  -     */
  -    Hashtable parameters = new Hashtable();
  -
  -
  -    // --------------------------------------------------------- Public Methods
  +    // ----------------------------------------------------- HttpMethod Methods
   
       public String getName() {
           return "POST";
       }
   
   
  -    /**
  -     * Add parameter.
  -     */
  -    public void addParameter(String name, String value) {
  -        checkNotUsed();
  -        parameters.put(name, value);
  -    }
  -
  -
  -    // ----------------------------------------------------- HttpMethod Methods
  -
  -
       public void recycle() {
           super.recycle();
  -        parameters.clear();
  +        requestBody = null;
  +    }
  +
  +    public void setParameter(String parameterName, String parameterValue) {
  +        if(null != requestBody) {
  +            throw new IllegalStateException("Request body already generated.");
  +        }
  +        super.setParameter(parameterName,parameterValue);
  +    }
  +
  +    public void addParameter(String parameterName, String parameterValue) {
  +        if(null != requestBody) {
  +            throw new IllegalStateException("Request body already generated.");
  +        }
  +        super.addParameter(parameterName,parameterValue);
  +    }
  +
  +    public void removeParameter(String paramName) {
  +        if(null != requestBody) {
  +            throw new IllegalStateException("Request body already generated.");
  +        }
  +        super.removeParameter(paramName);
  +    }
  +
  +    public void removeParameter(String paramName, String paramValue) {
  +        if(null != requestBody) {
  +            throw new IllegalStateException("Request body already generated.");
  +        }
  +        super.removeParameter(paramName,paramValue);
  +    }
  +
  +    protected void writeRequestLine(State state, HttpConnection conn) throws 
IOException, HttpException {
  +        // don't send parameters on query string
  +        log.debug("PostMethod.writeRequestLine(State,HttpConnection)");
  +        String requestLine = HttpMethodBase.generateRequestLine(conn, 
getName(),getPath(),queryString,null,(http11 ? "HTTP/1.1" : "HTTP/1.0"));
  +        conn.print(requestLine);
  +    }
  +
  +    protected void generateRequestHeaders(State state, HttpConnection conn) throws 
IOException, HttpException {
  +        super.generateRequestHeaders(state,conn);
  +        if(!parameters.isEmpty()) {
  +            setRequestHeader("Content-Type","application/x-www-form-urlencoded");
  +        }
  +    }
  +
  +    protected void writeRequestBody(State state, HttpConnection conn) throws 
IOException, HttpException {
  +        if(null == requestBody) {
  +            requestBody = generateRequestBody(parameters);
  +        }
  +        conn.print(requestBody);
  +        bodySent = true;
  +    }
  +
  +    protected int getRequestContentLength() {
  +        if(null == requestBody) {
  +            requestBody = generateRequestBody(parameters);
  +        }
  +        return requestBody.length();
  +    }
  +
  +    protected String generateRequestBody(HashMap params) {
  +        if (!params.isEmpty()) {
  +            StringBuffer sb = new StringBuffer();
  +            Iterator it = parameters.keySet().iterator();
  +            while(it.hasNext()) {
  +                String name = (String)(it.next());
  +                Object value = parameters.get(name);
  +                if(value instanceof List) {
  +                    List list = (List)value;
  +                    Iterator valit = list.iterator();
  +                    while(valit.hasNext()) {
  +                        if(sb.length() > 0) { sb.append("&"); }
  +                        sb.append(URLEncoder.encode(name));
  +                        Object val2 = valit.next();
  +                        if(null != val2) {
  +                            sb.append("=");
  +                            sb.append(URLEncoder.encode(String.valueOf(val2)));
  +                        }
  +                    }
  +                } else {
  +                    if(sb.length() > 0) { sb.append("&"); }
  +                    sb.append(URLEncoder.encode(name));
  +                    if(null != value) {
  +                        sb.append("=");
  +                        sb.append(URLEncoder.encode(String.valueOf(value)));
  +                    }
  +                }
  +            }
  +            return sb.toString();
  +        } else {
  +            return "";
  +        }
       }
   
       /**
  @@ -172,4 +192,5 @@
         return true;
       }
   
  +    protected String requestBody = null;
   }
  
  
  
  1.3.2.2   +78 -86    
jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/methods/PutMethod.java
  
  Index: PutMethod.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/methods/PutMethod.java,v
  retrieving revision 1.3.2.1
  retrieving revision 1.3.2.2
  diff -u -r1.3.2.1 -r1.3.2.2
  --- PutMethod.java    2001/08/10 22:27:12     1.3.2.1
  +++ PutMethod.java    2001/08/13 16:01:05     1.3.2.2
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/methods/PutMethod.java,v
 1.3.2.1 2001/08/10 22:27:12 rwaldhoff Exp $
  - * $Revision: 1.3.2.1 $
  - * $Date: 2001/08/10 22:27:12 $
  + * $Header: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/methods/PutMethod.java,v
 1.3.2.2 2001/08/13 16:01:05 rwaldhoff Exp $
  + * $Revision: 1.3.2.2 $
  + * $Date: 2001/08/13 16:01:05 $
    *
    * Copyright (C) The Apache Software Foundation. All rights reserved.
    *
  @@ -19,14 +19,15 @@
   import java.io.InputStream;
   import java.io.OutputStream;
   import java.io.ByteArrayOutputStream;
  +import java.io.ByteArrayInputStream;
   import java.net.URL;
   import java.net.URLConnection;
   import org.apache.commons.httpclient.HttpConnection;
  +import org.apache.commons.httpclient.RequestOutputStream;
   import org.apache.commons.httpclient.State;
   import org.apache.commons.httpclient.Header;
   import org.apache.commons.httpclient.HttpMethodBase;
  -import org.apache.commons.httpclient.log.Log;
  -import org.apache.commons.httpclient.log.LogSource;
  +import org.apache.commons.httpclient.HttpException;
   
   
   /**
  @@ -85,19 +86,34 @@
   
       /**
        * Send the contents of a file.
  +     * @deprecated
        */
  -    public void sendData(File file)
  -        throws IOException {
  +    public void sendData(File file) throws IOException {
  +        setData(file);
  +    }
  +
  +    /**
  +     * Send the contents of a file.
  +     * @deprecated
  +     */
  +    public void setData(File file) throws IOException {
           checkNotUsed();
           this.file = file;
       }
   
  +    /**
  +     * Send the contents of the resource at the specified URL.
  +     * @deprecated
  +     */
  +    public void sendData(URL url) throws IOException {
  +        sendData(url);
  +    }
   
       /**
        * Send the contents of the resource at the specified URL.
  +     * @deprecated
        */
  -    public void sendData(URL url)
  -        throws IOException {
  +    public void setData(URL url) throws IOException {
           checkNotUsed();
           this.url = url;
       }
  @@ -105,29 +121,52 @@
   
       /**
        * Send the contents of a byte array.
  +     * @deprecated
        */
       public void sendData(byte[] data) {
  +        setData(data);
  +    }
  +
  +    /**
  +     * Send the contents of a byte array.
  +     */
  +    public void setData(byte[] data) {
           checkNotUsed();
           this.data = data;
       }
   
  -
       /**
        * Send the contents of a string.
  +     * @deprecated
        */
       public void sendData(String data) {
  +        setData(data);
  +    }
  +
  +    /**
  +     * Send the contents of a string.
  +     */
  +    public void setData(String data) {
           checkNotUsed();
           sendData(data.getBytes());
       }
   
  +    /**
  +     * Send the contents of an input stream. The contents will be buffered into
  +     * memory. To upload large entities, it is recommended to first buffer the
  +     * data into a temporary file, and then send that file.
  +     * @deprecated
  +     */
  +    public void sendData(InputStream is) throws IOException {
  +        setData(is);
  +    }
   
       /**
        * Send the contents of an input stream. The contents will be buffered into
        * memory. To upload large entities, it is recommended to first buffer the
        * data into a temporary file, and then send that file.
        */
  -    public void sendData(InputStream is)
  -        throws IOException {
  +    public void setData(InputStream is) throws IOException {
           checkNotUsed();
           byte[] buffer = new byte[4096];
           ByteArrayOutputStream os = new ByteArrayOutputStream();
  @@ -144,66 +183,23 @@
   
   
       // ----------------------------------------------------- HttpMethod Methods
  -
  -
  -    protected void writeRequestBody(State state, HttpConnection conn) {
  -        // XXX IMPLEMENT ME XXX
  -    }
  -
  -    /**
  -     * Is the query body submitted through an InputStream of with a String.
  -     * If an InputStream is available, it's used.
  -     *
  -     * @return boolean True if the content is avalable in an InputStream
  -     */
  -    public boolean isStreamedQuery() {
  -        return ((file != null) || (url != null));
  -    }
  -
   
  -    /**
  -     * Recycle the method object, so that it can be reused again. Any attempt
  -     * to reuse an object without recycling it will throw a WebdavException.
  -     */
  -    public void recycle() {
  -        super.recycle();
  -        data = null;
  -        url = null;
  -        file = null;
  -    }
  -
  -
  -    /**
  -     * Generate the query body.
  -     *
  -     * @return String query
  -     */
  -/*
  -    public String generateQuery() {
  -        if (query != null){
  -            return query;
  -        }
  -        if (data == null) {
  -            return "";
  -        } else {
  -            return new String(data);
  +    protected void writeRequestBody(State state, HttpConnection conn) throws 
IOException, HttpException {
  +        RequestOutputStream out = conn.getRequestOutputStream();
  +        if((http11) && (getRequestHeader("Content-Length") == null)) {
  +            out.setUseChunking(true);
           }
  -    }
  -*/
  -
  -    /**
  -     * Stream the body of the query. This function should be used to send large
  -     * request bodies.
  -     */
  -/*
  -    public void streamQuery(OutputStream out)
  -        throws IOException {
   
           InputStream inputStream = null;
           if (file != null) {
               inputStream = new FileInputStream(file);
           } else if (url != null) {
               inputStream = url.openConnection().getInputStream();
  +        } else if(data != null){
  +            inputStream = new ByteArrayInputStream(data);
  +        } else {
  +            bodySent = true;
  +            return;
           }
   
           byte[] buffer = new byte[4096];
  @@ -213,37 +209,33 @@
               if (nb == -1) {
                   break;
               }
  -            if(wireLog.isInfoEnabled()) {
  -                wireLog.info(">> \"" + new String(buffer) + "\"");
  -            }
               out.write(buffer, 0, nb);
           }
  -
           inputStream.close();
  +        out.close();
  +        bodySent = true;
  +    }
   
  +    protected int getRequestContentLength() {
  +        if(null != data) {
  +            return data.length;
  +        } else if(null != file) {
  +            return (int)(file.length());
  +        } else if(url != null) {
  +            return -1;
  +        } else {
  +            return 0;
  +        }
       }
  -*/
   
  -    /**
  -     * Parse response.
  -     *
  -     * @param is Input stream
  -     */
  -/*
  -    public void parseResponse(InputStream is)
  -        throws IOException {
  +    public void recycle() {
  +        super.recycle();
  +        data = null;
  +        url = null;
  +        file = null;
       }
  -*/
   
  -    /**
  -     * Return true if the method should ask for an expectation.
  -     *
  -     * @return true if an expectation will be sent
  -     */
       public boolean needExpectation() {
           return true;
       }
  -
  -
  -    static protected final Log wireLog = LogSource.getInstance("httpclient.wire");
   }
  
  
  

Reply via email to