19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//httpclient/src/java/org/apache/commons/httpclient/methods/multipart/MultipartRequestEntity.java,v 1.1 2004/10/06 03:39:59 mbecke Exp $ 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * $Revision: 502647 $ 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * $Date: 2007-02-02 17:22:54 +0100 (Fri, 02 Feb 2007) $ 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ==================================================================== 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this work for additional information regarding copyright ownership. 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (the "License"); you may not use this file except in compliance with 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the License. You may obtain a copy of the License at 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ==================================================================== 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This software consists of voluntary contributions made by many 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * individuals on behalf of the Apache Software Foundation. For more 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * information on the Apache Software Foundation, please see 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <http://www.apache.org/>. 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.internal.http.multipart; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.ByteArrayInputStream; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.ByteArrayOutputStream; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStream; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Random; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.Header; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.entity.AbstractHttpEntity; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.message.BasicHeader; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.params.HttpParams; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.protocol.HTTP; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.util.EncodingUtils; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.commons.logging.Log; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.commons.logging.LogFactory; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Implements a request entity suitable for an HTTP multipart POST method. 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The HTTP multipart POST method is defined in section 3.3 of 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC1867</a>: 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <blockquote> 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The media-type multipart/form-data follows the rules of all multipart 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * MIME data streams as outlined in RFC 1521. The multipart/form-data contains 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a series of parts. Each part is expected to contain a content-disposition 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * header where the value is "form-data" and a name attribute specifies 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the field name within the form, e.g., 'content-disposition: form-data; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * name="xxxxx"', where xxxxx is the field name corresponding to that field. 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Field names originally in non-ASCII character sets may be encoded using 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the method outlined in RFC 1522. 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </blockquote> 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This entity is designed to be used in conjunction with the 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link org.apache.http.HttpRequest} to provide 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * multipart posts. Example usage:</p> 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre> 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * File f = new File("/path/fileToUpload.txt"); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * HttpRequest request = new HttpRequest("http://host/some_path"); 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Part[] parts = { 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * new StringPart("param_name", "value"), 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * new FilePart(f.getName(), f) 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * }; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * filePost.setEntity( 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * new MultipartRequestEntity(parts, filePost.getParams()) 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * HttpClient client = new HttpClient(); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * int status = client.executeMethod(filePost); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre> 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @since 3.0 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class MultipartEntity extends AbstractHttpEntity { 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final Log log = LogFactory.getLog(MultipartEntity.class); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The Content-Type for multipart/form-data. */ 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String MULTIPART_FORM_CONTENT_TYPE = "multipart/form-data"; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the value to use as the multipart boundary. 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This parameter expects a value if type {@link String}. 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String MULTIPART_BOUNDARY = "http.method.multipart.boundary"; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The pool of ASCII chars to be used for generating a multipart boundary. 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static byte[] MULTIPART_CHARS = EncodingUtils.getAsciiBytes( 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Generates a random multipart boundary string. 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static byte[] generateMultipartBoundary() { 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Random rand = new Random(); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] bytes = new byte[rand.nextInt(11) + 30]; // a random size from 30 to 40 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < bytes.length; i++) { 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bytes[i] = MULTIPART_CHARS[rand.nextInt(MULTIPART_CHARS.length)]; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return bytes; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The MIME parts as set by the constructor */ 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected Part[] parts; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private byte[] multipartBoundary; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private HttpParams params; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean contentConsumed = false; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a new multipart entity containing the given parts. 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parts The parts to include. 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param params The params of the HttpMethod using this entity. 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MultipartEntity(Part[] parts, HttpParams params) { 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parts == null) { 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("parts cannot be null"); 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (params == null) { 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("params cannot be null"); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.parts = parts; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.params = params; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MultipartEntity(Part[] parts) { 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setContentType(MULTIPART_FORM_CONTENT_TYPE); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parts == null) { 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("parts cannot be null"); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.parts = parts; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.params = null; 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the MIME boundary string that is used to demarcate boundaries of 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this part. The first call to this method will implicitly create a new 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * boundary string. To create a boundary string first the 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * HttpMethodParams.MULTIPART_BOUNDARY parameter is considered. Otherwise 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a random one is generated. 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The boundary string of this entity in ASCII encoding. 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected byte[] getMultipartBoundary() { 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (multipartBoundary == null) { 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String temp = null; 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (params != null) { 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project temp = (String) params.getParameter(MULTIPART_BOUNDARY); 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (temp != null) { 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project multipartBoundary = EncodingUtils.getAsciiBytes(temp); 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project multipartBoundary = generateMultipartBoundary(); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return multipartBoundary; 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns <code>true</code> if all parts are repeatable, <code>false</code> otherwise. 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isRepeatable() { 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < parts.length; i++) { 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parts[i].isRepeatable()) { 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* (non-Javadoc) 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeTo(OutputStream out) throws IOException { 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Part.sendParts(out, parts, getMultipartBoundary()); 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* (non-Javadoc) 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see org.apache.commons.http.AbstractHttpEntity.#getContentType() 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Header getContentType() { 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuffer buffer = new StringBuffer(MULTIPART_FORM_CONTENT_TYPE); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer.append("; boundary="); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer.append(EncodingUtils.getAsciiString(getMultipartBoundary())); 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new BasicHeader(HTTP.CONTENT_TYPE, buffer.toString()); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* (non-Javadoc) 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getContentLength() { 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Part.getLengthOfParts(parts, getMultipartBoundary()); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project log.error("An exception occurred while getting the length of the parts", e); 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public InputStream getContent() throws IOException, IllegalStateException { 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(!isRepeatable() && this.contentConsumed ) { 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalStateException("Content has been consumed"); 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.contentConsumed = true; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ByteArrayOutputStream baos = new ByteArrayOutputStream(); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Part.sendParts(baos, this.parts, this.multipartBoundary); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return bais; 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isStreaming() { 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 231