You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by kw...@apache.org on 2013/06/20 11:59:34 UTC

svn commit: r1494902 - in /httpcomponents/httpclient/trunk/httpmime/src: main/java/org/apache/http/entity/mime/ test/java/org/apache/http/entity/mime/

Author: kwright
Date: Thu Jun 20 09:59:33 2013
New Revision: 1494902

URL: http://svn.apache.org/r1494902
Log:
Refactoring, in preparation for functional pieces for HTTPCLIENT-1372.

Added:
    httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpBrowserCompatibleMultipart.java   (with props)
    httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpMultipartFactory.java   (with props)
    httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpMultipartForm.java   (with props)
    httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpStrictMultipart.java   (with props)
Modified:
    httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpMultipart.java
    httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/MultipartEntity.java
    httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/MultipartEntityBuilder.java
    httpcomponents/httpclient/trunk/httpmime/src/test/java/org/apache/http/entity/mime/TestMultipartEntityBuilder.java
    httpcomponents/httpclient/trunk/httpmime/src/test/java/org/apache/http/entity/mime/TestMultipartForm.java

Added: httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpBrowserCompatibleMultipart.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpBrowserCompatibleMultipart.java?rev=1494902&view=auto
==============================================================================
--- httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpBrowserCompatibleMultipart.java (added)
+++ httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpBrowserCompatibleMultipart.java Thu Jun 20 09:59:33 2013
@@ -0,0 +1,87 @@
+/*
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ *
+ * 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/>.
+ *
+ */
+
+package org.apache.http.entity.mime;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.http.entity.mime.content.ContentBody;
+import org.apache.http.util.Args;
+import org.apache.http.util.ByteArrayBuffer;
+
+/**
+ * HttpBrowserCompatibleMultipart represents a collection of MIME multipart encoded content bodies. This class is
+ * emulates browser compatibility, e.g. IE 5 or earlier.
+ *
+ * @since 4.3
+ */
+public class HttpBrowserCompatibleMultipart extends HttpMultipartForm {
+
+    /**
+     * Creates an instance with the specified settings.
+     *
+     * @param subType mime subtype - must not be {@code null}
+     * @param charset the character set to use. May be {@code null}, in which case {@link MIME#DEFAULT_CHARSET} - i.e. US-ASCII - is used.
+     * @param boundary to use  - must not be {@code null}
+     * @throws IllegalArgumentException if charset is null or boundary is null
+     */
+    public HttpBrowserCompatibleMultipart(final String subType, final Charset charset, final String boundary) {
+        super(subType, charset, boundary);
+    }
+
+    public HttpBrowserCompatibleMultipart(final String subType, final String boundary) {
+        this(subType, null, boundary);
+    }
+
+    /**
+      * Write the multipart header fields; depends on the style.
+      */
+    @Override
+    protected void formatMultipartHeader(
+        final FormBodyPart part,
+        final OutputStream out) throws IOException {
+        // For browser-compatible, only write Content-Disposition
+        // Use content charset
+        final Header header = part.getHeader();
+        final MinimalField cd = header.getField(MIME.CONTENT_DISPOSITION);
+        writeField(cd, this.charset, out);
+        final String filename = part.getBody().getFilename();
+        if (filename != null) {
+            final MinimalField ct = header.getField(MIME.CONTENT_TYPE);
+            writeField(ct, this.charset, out);
+        }
+
+    }
+
+}

Propchange: httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpBrowserCompatibleMultipart.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpBrowserCompatibleMultipart.java
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpMultipart.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpMultipart.java?rev=1494902&r1=1494901&r2=1494902&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpMultipart.java (original)
+++ httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpMultipart.java Thu Jun 20 09:59:33 2013
@@ -47,6 +47,7 @@ import org.apache.http.util.ByteArrayBuf
  *
  * @since 4.0
  */
+ @Deprecated
 public class HttpMultipart {
 
     private static ByteArrayBuffer encode(

Added: httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpMultipartFactory.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpMultipartFactory.java?rev=1494902&view=auto
==============================================================================
--- httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpMultipartFactory.java (added)
+++ httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpMultipartFactory.java Thu Jun 20 09:59:33 2013
@@ -0,0 +1,57 @@
+/*
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ *
+ * 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/>.
+ *
+ */
+
+package org.apache.http.entity.mime;
+
+import java.nio.charset.Charset;
+
+/**
+ *
+ * @since 4.3
+ */
+public class HttpMultipartFactory {
+
+    /** Non-instantiable */
+    private HttpMultipartFactory() {
+    }
+    
+    /** Create an appropriate HttpMultipartForm instance */
+    public static HttpMultipartForm getInstance(
+        final String subType, final Charset charset, final String boundary,
+        final HttpMultipartMode mode) {
+        // If needed, this can be replaced with a registry in time
+        switch (mode) {
+            case STRICT:
+                return new HttpStrictMultipart(subType, charset, boundary);
+            case BROWSER_COMPATIBLE:
+                return new HttpBrowserCompatibleMultipart(subType, charset, boundary);
+            default:
+                throw new IllegalArgumentException("Unknown multipart mode");
+        }
+    }
+
+}

Propchange: httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpMultipartFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpMultipartFactory.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpMultipartForm.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpMultipartForm.java?rev=1494902&view=auto
==============================================================================
--- httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpMultipartForm.java (added)
+++ httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpMultipartForm.java Thu Jun 20 09:59:33 2013
@@ -0,0 +1,227 @@
+/*
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ *
+ * 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/>.
+ *
+ */
+
+package org.apache.http.entity.mime;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.http.entity.mime.content.ContentBody;
+import org.apache.http.util.Args;
+import org.apache.http.util.ByteArrayBuffer;
+
+/**
+ * HttpMultipart represents a collection of MIME multipart encoded content bodies. This class is
+ * capable of operating either in the strict (RFC 822, RFC 2045, RFC 2046 compliant) or
+ * the browser compatible modes.
+ *
+ * @since 4.3
+ */
+public abstract class HttpMultipartForm {
+
+    private static ByteArrayBuffer encode(
+            final Charset charset, final String string) {
+        final ByteBuffer encoded = charset.encode(CharBuffer.wrap(string));
+        final ByteArrayBuffer bab = new ByteArrayBuffer(encoded.remaining());
+        bab.append(encoded.array(), encoded.position(), encoded.remaining());
+        return bab;
+    }
+
+    private static void writeBytes(
+            final ByteArrayBuffer b, final OutputStream out) throws IOException {
+        out.write(b.buffer(), 0, b.length());
+    }
+
+    private static void writeBytes(
+            final String s, final Charset charset, final OutputStream out) throws IOException {
+        final ByteArrayBuffer b = encode(charset, s);
+        writeBytes(b, out);
+    }
+
+    private static void writeBytes(
+            final String s, final OutputStream out) throws IOException {
+        final ByteArrayBuffer b = encode(MIME.DEFAULT_CHARSET, s);
+        writeBytes(b, out);
+    }
+
+    protected static void writeField(
+            final MinimalField field, final OutputStream out) throws IOException {
+        writeBytes(field.getName(), out);
+        writeBytes(FIELD_SEP, out);
+        writeBytes(field.getBody(), out);
+        writeBytes(CR_LF, out);
+    }
+
+    protected static void writeField(
+            final MinimalField field, final Charset charset, final OutputStream out) throws IOException {
+        writeBytes(field.getName(), charset, out);
+        writeBytes(FIELD_SEP, out);
+        writeBytes(field.getBody(), charset, out);
+        writeBytes(CR_LF, out);
+    }
+
+    private static final ByteArrayBuffer FIELD_SEP = encode(MIME.DEFAULT_CHARSET, ": ");
+    private static final ByteArrayBuffer CR_LF = encode(MIME.DEFAULT_CHARSET, "\r\n");
+    private static final ByteArrayBuffer TWO_DASHES = encode(MIME.DEFAULT_CHARSET, "--");
+
+
+    private final String subType;
+    protected final Charset charset;
+    private final String boundary;
+    private final List<FormBodyPart> parts;
+
+    /**
+     * Creates an instance with the specified settings.
+     *
+     * @param subType mime subtype - must not be {@code null}
+     * @param charset the character set to use. May be {@code null}, in which case {@link MIME#DEFAULT_CHARSET} - i.e. US-ASCII - is used.
+     * @param boundary to use  - must not be {@code null}
+     * @param mode the mode to use
+     * @throws IllegalArgumentException if charset is null or boundary is null
+     */
+    public HttpMultipartForm(final String subType, final Charset charset, final String boundary) {
+        super();
+        Args.notNull(subType, "Multipart subtype");
+        Args.notNull(boundary, "Multipart boundary");
+        this.subType = subType;
+        this.charset = charset != null ? charset : MIME.DEFAULT_CHARSET;
+        this.boundary = boundary;
+        this.parts = new ArrayList<FormBodyPart>();
+    }
+
+    public HttpMultipartForm(final String subType, final String boundary) {
+        this(subType, null, boundary);
+    }
+
+    public String getSubType() {
+        return this.subType;
+    }
+
+    public Charset getCharset() {
+        return this.charset;
+    }
+
+    public List<FormBodyPart> getBodyParts() {
+        return this.parts;
+    }
+
+    public void addBodyPart(final FormBodyPart part) {
+        if (part == null) {
+            return;
+        }
+        this.parts.add(part);
+    }
+
+    public String getBoundary() {
+        return this.boundary;
+    }
+
+    private void doWriteTo(
+        final OutputStream out,
+        final boolean writeContent) throws IOException {
+
+        final ByteArrayBuffer boundary = encode(this.charset, getBoundary());
+        for (final FormBodyPart part: this.parts) {
+            writeBytes(TWO_DASHES, out);
+            writeBytes(boundary, out);
+            writeBytes(CR_LF, out);
+
+            formatMultipartHeader(part, out);
+
+            writeBytes(CR_LF, out);
+
+            if (writeContent) {
+                part.getBody().writeTo(out);
+            }
+            writeBytes(CR_LF, out);
+        }
+        writeBytes(TWO_DASHES, out);
+        writeBytes(boundary, out);
+        writeBytes(TWO_DASHES, out);
+        writeBytes(CR_LF, out);
+    }
+
+    /**
+      * Write the multipart header fields; depends on the style.
+      */
+    protected abstract void formatMultipartHeader(
+        final FormBodyPart part,
+        final OutputStream out) throws IOException;
+
+    /**
+     * Writes out the content in the multipart/form encoding. This method
+     * produces slightly different formatting depending on its compatibility
+     * mode.
+     *
+     * @see #getMode()
+     */
+    public void writeTo(final OutputStream out) throws IOException {
+        doWriteTo(out, true);
+    }
+
+    /**
+     * Determines the total length of the multipart content (content length of
+     * individual parts plus that of extra elements required to delimit the parts
+     * from one another). If any of the @{link BodyPart}s contained in this object
+     * is of a streaming entity of unknown length the total length is also unknown.
+     * <p/>
+     * This method buffers only a small amount of data in order to determine the
+     * total length of the entire entity. The content of individual parts is not
+     * buffered.
+     *
+     * @return total length of the multipart entity if known, <code>-1</code>
+     *   otherwise.
+     */
+    public long getTotalLength() {
+        long contentLen = 0;
+        for (final FormBodyPart part: this.parts) {
+            final ContentBody body = part.getBody();
+            final long len = body.getContentLength();
+            if (len >= 0) {
+                contentLen += len;
+            } else {
+                return -1;
+            }
+        }
+        final ByteArrayOutputStream out = new ByteArrayOutputStream();
+        try {
+            doWriteTo(out, false);
+            final byte[] extra = out.toByteArray();
+            return contentLen + extra.length;
+        } catch (final IOException ex) {
+            // Should never happen
+            return -1;
+        }
+    }
+
+}

Propchange: httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpMultipartForm.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpMultipartForm.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpStrictMultipart.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpStrictMultipart.java?rev=1494902&view=auto
==============================================================================
--- httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpStrictMultipart.java (added)
+++ httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpStrictMultipart.java Thu Jun 20 09:59:33 2013
@@ -0,0 +1,82 @@
+/*
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ *
+ * 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/>.
+ *
+ */
+
+package org.apache.http.entity.mime;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.http.entity.mime.content.ContentBody;
+import org.apache.http.util.Args;
+import org.apache.http.util.ByteArrayBuffer;
+
+/**
+ * HttpStrictMultipart represents a collection of MIME multipart encoded content bodies, implementing the
+ * strict (RFC 822, RFC 2045, RFC 2046 compliant) interpretation of the spec.
+ *
+ * @since 4.3
+ */
+public class HttpStrictMultipart extends HttpMultipartForm {
+
+    /**
+     * Creates an instance with the specified settings.
+     *
+     * @param subType mime subtype - must not be {@code null}
+     * @param charset the character set to use. May be {@code null}, in which case {@link MIME#DEFAULT_CHARSET} - i.e. US-ASCII - is used.
+     * @param boundary to use  - must not be {@code null}
+     * @throws IllegalArgumentException if charset is null or boundary is null
+     */
+    public HttpStrictMultipart(final String subType, final Charset charset, final String boundary) {
+        super(subType, charset, boundary);
+    }
+
+    public HttpStrictMultipart(final String subType, final String boundary) {
+        this(subType, null, boundary);
+    }
+
+    /**
+      * Write the multipart header fields; depends on the style.
+      */
+    @Override
+    protected void formatMultipartHeader(
+        final FormBodyPart part,
+        final OutputStream out) throws IOException {
+
+        // For strict, we output all fields with mime-standard encoding.
+        final Header header = part.getHeader();
+        for (final MinimalField field: header) {
+            writeField(field, out);
+        }
+    }
+    
+}

Propchange: httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpStrictMultipart.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/HttpStrictMultipart.java
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/MultipartEntity.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/MultipartEntity.java?rev=1494902&r1=1494901&r2=1494902&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/MultipartEntity.java (original)
+++ httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/MultipartEntity.java Thu Jun 20 09:59:33 2013
@@ -53,7 +53,7 @@ public class MultipartEntity implements 
         "-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
             .toCharArray();
 
-    private final HttpMultipart multipart;
+    private final HttpMultipartForm multipart;
     private final Header contentType;
 
     // @GuardedBy("dirty") // we always read dirty before accessing length
@@ -72,8 +72,24 @@ public class MultipartEntity implements 
             final Charset charset) {
         super();
         final String b = boundary != null ? boundary : generateBoundary();
-        final HttpMultipartMode m = mode != null ? mode : HttpMultipartMode.STRICT;
-        this.multipart = new HttpMultipart("form-data", charset, b, m);
+        this.multipart = HttpMultipartFactory.getInstance("form-data", charset, b, mode != null ? mode : HttpMultipartMode.STRICT);
+        this.contentType = new BasicHeader(HTTP.CONTENT_TYPE, generateContentType(b, charset));
+        this.dirty = true;
+    }
+    
+    /**
+     * Creates an instance using the specified parameters
+     * @param multipart the part encoder to use, may not be {@code null}
+     * @param boundary the boundary string, may be {@code null}, in which case {@link #generateBoundary()} is invoked to create the string
+     * @param charset the character set to use, may be {@code null}, in which case {@link MIME#DEFAULT_CHARSET} - i.e. US-ASCII - is used.
+     */
+    public MultipartEntity(
+            final HttpMultipartForm multipart,
+            final String boundary,
+            final Charset charset) {
+        super();
+        final String b = boundary != null ? boundary : generateBoundary();
+        this.multipart = multipart;
         this.contentType = new BasicHeader(HTTP.CONTENT_TYPE, generateContentType(b, charset));
         this.dirty = true;
     }
@@ -120,7 +136,7 @@ public class MultipartEntity implements 
     /**
      * @since 4.3
      */
-    protected HttpMultipart getMultipart() {
+    protected HttpMultipartForm getMultipart() {
         return multipart;
     }
 

Modified: httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/MultipartEntityBuilder.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/MultipartEntityBuilder.java?rev=1494902&r1=1494901&r2=1494902&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/MultipartEntityBuilder.java (original)
+++ httpcomponents/httpclient/trunk/httpmime/src/main/java/org/apache/http/entity/mime/MultipartEntityBuilder.java Thu Jun 20 09:59:33 2013
@@ -45,10 +45,10 @@ import org.apache.http.util.Args;
  */
 public class MultipartEntityBuilder {
 
-    private boolean lax;
-    private String boundary;
-    private Charset charset;
-    private List<FormBodyPart> bodyParts;
+    private HttpMultipartMode mode = HttpMultipartMode.STRICT;
+    private String boundary = null;
+    private Charset charset = null;
+    private List<FormBodyPart> bodyParts = null;
 
     public static MultipartEntityBuilder create() {
         return new MultipartEntityBuilder();
@@ -59,12 +59,12 @@ public class MultipartEntityBuilder {
     }
 
     public MultipartEntityBuilder setLaxMode() {
-        this.lax = true;
+        this.mode = HttpMultipartMode.BROWSER_COMPATIBLE;
         return this;
     }
 
     public MultipartEntityBuilder setStrictMode() {
-        this.lax = false;
+        this.mode = HttpMultipartMode.STRICT;
         return this;
     }
 
@@ -140,7 +140,7 @@ public class MultipartEntityBuilder {
 
     public MultipartEntity build() {
         final MultipartEntity e = new MultipartEntity(
-                this.lax ? HttpMultipartMode.BROWSER_COMPATIBLE : HttpMultipartMode.STRICT,
+                this.mode,
                 this.boundary, this.charset);
         if (this.bodyParts != null) {
             for (final FormBodyPart bp: this.bodyParts) {

Modified: httpcomponents/httpclient/trunk/httpmime/src/test/java/org/apache/http/entity/mime/TestMultipartEntityBuilder.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpmime/src/test/java/org/apache/http/entity/mime/TestMultipartEntityBuilder.java?rev=1494902&r1=1494901&r2=1494902&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpmime/src/test/java/org/apache/http/entity/mime/TestMultipartEntityBuilder.java (original)
+++ httpcomponents/httpclient/trunk/httpmime/src/test/java/org/apache/http/entity/mime/TestMultipartEntityBuilder.java Thu Jun 20 09:59:33 2013
@@ -41,7 +41,7 @@ public class TestMultipartEntityBuilder 
     public void testBasics() throws Exception {
         final MultipartEntity entity = MultipartEntityBuilder.create().build();
         Assert.assertNotNull(entity);
-        Assert.assertEquals(HttpMultipartMode.STRICT, entity.getMultipart().getMode());
+        Assert.assertEquals("org.apache.http.entity.mime.HttpStrictMultipart", entity.getMultipart().getClass().getName());
         Assert.assertEquals(0, entity.getMultipart().getBodyParts().size());
     }
 
@@ -53,7 +53,7 @@ public class TestMultipartEntityBuilder 
                 .setLaxMode()
                 .build();
         Assert.assertNotNull(entity);
-        Assert.assertEquals(HttpMultipartMode.BROWSER_COMPATIBLE, entity.getMultipart().getMode());
+        Assert.assertEquals("org.apache.http.entity.mime.HttpBrowserCompatibleMultipart", entity.getMultipart().getClass().getName());
         Assert.assertEquals("blah-blah", entity.getMultipart().getBoundary());
         Assert.assertEquals(Consts.UTF_8, entity.getMultipart().getCharset());
     }

Modified: httpcomponents/httpclient/trunk/httpmime/src/test/java/org/apache/http/entity/mime/TestMultipartForm.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpmime/src/test/java/org/apache/http/entity/mime/TestMultipartForm.java?rev=1494902&r1=1494901&r2=1494902&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpmime/src/test/java/org/apache/http/entity/mime/TestMultipartForm.java (original)
+++ httpcomponents/httpclient/trunk/httpmime/src/test/java/org/apache/http/entity/mime/TestMultipartForm.java Thu Jun 20 09:59:33 2013
@@ -46,7 +46,7 @@ public class TestMultipartForm {
 
     @Test
     public void testMultipartFormStringParts() throws Exception {
-        final HttpMultipart multipart = new HttpMultipart("form-data", "foo");
+        final HttpMultipartForm multipart = new HttpStrictMultipart("form-data", "foo");
         final FormBodyPart p1 = new FormBodyPart(
                 "field1",
                 new StringBody("this stuff", ContentType.DEFAULT_TEXT));
@@ -102,7 +102,7 @@ public class TestMultipartForm {
             writer.close();
         }
 
-        final HttpMultipart multipart = new HttpMultipart("form-data", "foo");
+        final HttpMultipartForm multipart = new HttpStrictMultipart("form-data", "foo");
         final FormBodyPart p1 = new FormBodyPart(
                 "field1",
                 new FileBody(tmpfile));
@@ -151,7 +151,8 @@ public class TestMultipartForm {
             writer.close();
         }
 
-        final HttpMultipart multipart = new HttpMultipart("form-data", null, "foo", HttpMultipartMode.STRICT);
+        // Strict is no accident here, despite the test name - otherwise Transfer-Encoding is not produced.
+        final HttpMultipartForm multipart = new HttpStrictMultipart("form-data", null, "foo");
         final FormBodyPart p1 = new FormBodyPart(
                 "field1",
                 new FileBody(tmpfile));
@@ -233,7 +234,7 @@ public class TestMultipartForm {
             writer.close();
         }
 
-        final HttpMultipart multipart = new HttpMultipart("form-data", Charset.forName("UTF-8"), "foo", HttpMultipartMode.BROWSER_COMPATIBLE);
+        final HttpMultipartForm multipart = new HttpBrowserCompatibleMultipart("form-data", Charset.forName("UTF-8"), "foo");
         final FormBodyPart p1 = new FormBodyPart(
                 "field1",
                 new InputStreamBody(new FileInputStream(tmpfile), s1 + ".tmp"));
@@ -274,7 +275,7 @@ public class TestMultipartForm {
         final String s1 = constructString(SWISS_GERMAN_HELLO);
         final String s2 = constructString(RUSSIAN_HELLO);
 
-        final HttpMultipart multipart = new HttpMultipart("form-data", "foo");
+        final HttpMultipartForm multipart = new HttpStrictMultipart("form-data", "foo");
         final FormBodyPart p1 = new FormBodyPart(
                 "field1",
                 new StringBody(s1, ContentType.create("text/plain", Charset.forName("ISO-8859-1"))));