1 /*
2 * ====================================================================
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 * ====================================================================
20 *
21 * This software consists of voluntary contributions made by many
22 * individuals on behalf of the Apache Software Foundation. For more
23 * information on the Apache Software Foundation, please see
24 * <http://www.apache.org/>.
25 *
26 */
27
28 package com.foxinmy.weixin4j.http.apache.mime;
29
30 import java.io.IOException;
31 import java.io.OutputStream;
32 import java.nio.charset.Charset;
33 import java.util.ArrayList;
34 import java.util.List;
35
36 /**
37 * HttpMultipart represents a collection of MIME multipart encoded content bodies. This class is
38 * capable of operating either in the strict (RFC 822, RFC 2045, RFC 2046 compliant) or
39 * the browser compatible modes.
40 *
41 * @since 4.0
42 *
43 * @deprecated (4.3) Use {@link MultipartEntityBuilder}.
44 */
45 @Deprecated
46 public class HttpMultipart extends AbstractMultipartForm {
47
48 private final HttpMultipartMode mode;
49 private final List<FormBodyPart> parts;
50
51 private final String subType;
52
53 /**
54 * Creates an instance with the specified settings.
55 *
56 * @param subType MIME subtype - must not be {@code null}
57 * @param charset the character set to use. May be {@code null},
58 * in which case {@link MIME#DEFAULT_CHARSET} - i.e. US-ASCII - is used.
59 * @param boundary to use - must not be {@code null}
60 * @param mode the mode to use
61 * @throws IllegalArgumentException if charset is null or boundary is null
62 */
63 public HttpMultipart(
64 final String subType, final Charset charset, final String boundary,
65 final HttpMultipartMode mode) {
66 super(charset, boundary);
67 this.subType = subType;
68 this.mode = mode;
69 this.parts = new ArrayList<FormBodyPart>();
70 }
71
72 /**
73 * Creates an instance with the specified settings.
74 * Mode is set to {@link HttpMultipartMode#STRICT}
75 *
76 * @param subType MIME subtype - must not be {@code null}
77 * @param charset the character set to use. May be {@code null},
78 * in which case {@link MIME#DEFAULT_CHARSET} - i.e. US-ASCII - is used.
79 * @param boundary to use - must not be {@code null}
80 * @throws IllegalArgumentException if charset is null or boundary is null
81 */
82 public HttpMultipart(final String subType, final Charset charset, final String boundary) {
83 this(subType, charset, boundary, HttpMultipartMode.STRICT);
84 }
85
86 public HttpMultipart(final String subType, final String boundary) {
87 this(subType, null, boundary);
88 }
89
90 public HttpMultipartMode getMode() {
91 return this.mode;
92 }
93
94 @Override
95 protected void formatMultipartHeader(
96 final FormBodyPart part, final OutputStream out) throws IOException {
97 final Header header = part.getHeader();
98 switch (this.mode) {
99 case BROWSER_COMPATIBLE:
100 // For browser-compatible, only write Content-Disposition
101 // Use content charset
102 final MinimalField cd = header.getField(MIME.CONTENT_DISPOSITION);
103 writeField(cd, this.charset, out);
104 final String filename = part.getBody().getFilename();
105 if (filename != null) {
106 final MinimalField ct = header.getField(MIME.CONTENT_TYPE);
107 writeField(ct, this.charset, out);
108 }
109 break;
110 default:
111 for (final MinimalField field: header) {
112 writeField(field, out);
113 }
114 }
115 }
116
117 @Override
118 public List<FormBodyPart> getBodyParts() {
119 return this.parts;
120 }
121
122 public void addBodyPart(final FormBodyPart part) {
123 if (part == null) {
124 return;
125 }
126 this.parts.add(part);
127 }
128
129 public String getSubType() {
130 return this.subType;
131 }
132
133 public Charset getCharset() {
134 return this.charset;
135 }
136
137 public String getBoundary() {
138 return this.boundary;
139 }
140
141 }