HTTPCLIENT-960: HttpMultipart doesn't generate Content-Type header for binary parts in BROWSER_COMPATIBLE mode

git-svn-id: https://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk@996639 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Oleg Kalnichevski 2010-09-13 18:55:56 +00:00
parent aeffde46e6
commit 05deb28605
3 changed files with 29 additions and 8 deletions

View File

@ -1,6 +1,10 @@
Changes since 4.1 ALPHA2 Changes since 4.1 ALPHA2
------------------- -------------------
* [HTTPCLIENT-960] HttpMultipart doesn't generate Content-Type header for binary parts in
BROWSER_COMPATIBLE mode.
Contributed by Oleg Kalnichevski <olegk at apache.org>
* [HTTPCLIENT-989] DefaultHttpRequestRetryHandler no longer retries non-idempotent http methods * [HTTPCLIENT-989] DefaultHttpRequestRetryHandler no longer retries non-idempotent http methods
if NoHttpResponseException is thrown. if NoHttpResponseException is thrown.
Contributed by Oleg Kalnichevski <olegk at apache.org> Contributed by Oleg Kalnichevski <olegk at apache.org>

View File

@ -73,6 +73,22 @@ public class HttpMultipart {
writeBytes(b, out); writeBytes(b, out);
} }
private 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);
}
private 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 FIELD_SEP = encode(MIME.DEFAULT_CHARSET, ": ");
private static final ByteArrayBuffer CR_LF = encode(MIME.DEFAULT_CHARSET, "\r\n"); private static final ByteArrayBuffer CR_LF = encode(MIME.DEFAULT_CHARSET, "\r\n");
private static final ByteArrayBuffer TWO_DASHES = encode(MIME.DEFAULT_CHARSET, "--"); private static final ByteArrayBuffer TWO_DASHES = encode(MIME.DEFAULT_CHARSET, "--");
@ -151,20 +167,19 @@ public class HttpMultipart {
switch (mode) { switch (mode) {
case STRICT: case STRICT:
for (MinimalField field: header) { for (MinimalField field: header) {
writeBytes(field.getName(), out); writeField(field, out);
writeBytes(FIELD_SEP, out);
writeBytes(field.getBody(), out);
writeBytes(CR_LF, out);
} }
break; break;
case BROWSER_COMPATIBLE: case BROWSER_COMPATIBLE:
// Only write Content-Disposition // Only write Content-Disposition
// Use content charset // Use content charset
MinimalField cd = part.getHeader().getField(MIME.CONTENT_DISPOSITION); MinimalField cd = part.getHeader().getField(MIME.CONTENT_DISPOSITION);
writeBytes(cd.getName(), this.charset, out); writeField(cd, this.charset, out);
writeBytes(FIELD_SEP, out); String filename = part.getBody().getFilename();
writeBytes(cd.getBody(), this.charset, out); if (filename != null) {
writeBytes(CR_LF, out); MinimalField ct = part.getHeader().getField(MIME.CONTENT_TYPE);
writeField(ct, this.charset, out);
}
break; break;
} }
writeBytes(CR_LF, out); writeBytes(CR_LF, out);

View File

@ -258,11 +258,13 @@ public class TestMultipartForm {
"--foo\r\n" + "--foo\r\n" +
"Content-Disposition: form-data; name=\"field1\"; " + "Content-Disposition: form-data; name=\"field1\"; " +
"filename=\"" + s1 + ".tmp\"\r\n" + "filename=\"" + s1 + ".tmp\"\r\n" +
"Content-Type: application/octet-stream\r\n" +
"\r\n" + "\r\n" +
"some random whatever\r\n" + "some random whatever\r\n" +
"--foo\r\n" + "--foo\r\n" +
"Content-Disposition: form-data; name=\"field2\"; " + "Content-Disposition: form-data; name=\"field2\"; " +
"filename=\"" + s2 + ".tmp\"\r\n" + "filename=\"" + s2 + ".tmp\"\r\n" +
"Content-Type: application/octet-stream\r\n" +
"\r\n" + "\r\n" +
"some random whatever\r\n" + "some random whatever\r\n" +
"--foo--\r\n"; "--foo--\r\n";