Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit3f7a5cb

Browse files
committed
fix a bit Multipart CRLF handling and improve readability of unit tests
1 parent02efd00 commit3f7a5cb

File tree

2 files changed

+59
-77
lines changed

2 files changed

+59
-77
lines changed

‎scribejava-core/src/main/java/com/github/scribejava/core/httpclient/multipart/MultipartUtils.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,12 @@ public static ByteArrayOutputStream getPayload(MultipartPayload multipartPayload
4343

4444
finalStringpreamble =multipartPayload.getPreamble();
4545
if (preamble !=null) {
46-
os.write(preamble.getBytes());
46+
os.write((preamble +"\r\n").getBytes());
4747
}
4848
finalList<BodyPartPayload>bodyParts =multipartPayload.getBodyParts();
4949
if (!bodyParts.isEmpty()) {
5050
finalStringboundary =multipartPayload.getBoundary();
51-
finalbyte[]startBoundary = ("\r\n--" +boundary +"\r\n").getBytes();
51+
finalbyte[]startBoundary = ("--" +boundary +"\r\n").getBytes();
5252

5353
for (BodyPartPayloadbodyPart :bodyParts) {
5454
os.write(startBoundary);
@@ -60,20 +60,21 @@ public static ByteArrayOutputStream getPayload(MultipartPayload multipartPayload
6060
}
6161
}
6262

63+
os.write("\r\n".getBytes());
6364
if (bodyPartinstanceofMultipartPayload) {
6465
getPayload((MultipartPayload)bodyPart).writeTo(os);
6566
}elseif (bodyPartinstanceofByteArrayBodyPartPayload) {
66-
os.write("\r\n".getBytes());
6767
os.write(((ByteArrayBodyPartPayload)bodyPart).getPayload());
6868
}else {
6969
thrownewAssertionError(bodyPart.getClass());
7070
}
71+
os.write("\r\n".getBytes());//CRLF for the next (starting or closing) boundary
7172
}
7273

73-
os.write(("\r\n--" +boundary +"--\r\n").getBytes());
74+
os.write(("--" +boundary +"--").getBytes());
7475
finalStringepilogue =multipartPayload.getEpilogue();
7576
if (epilogue !=null) {
76-
os.write((epilogue +"\r\n").getBytes());
77+
os.write(("\r\n" +epilogue).getBytes());
7778
}
7879

7980
}

‎scribejava-core/src/test/java/com/github/scribejava/core/httpclient/multipart/MultipartUtilsTest.java

Lines changed: 53 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,18 @@ public class MultipartUtilsTest {
1818
publicvoidtestEmptyMultipartPayload()throwsIOException {
1919
finalMultipartPayloadmP =newMultipartPayload();
2020

21-
finalStringBuildersb =newStringBuilder();
21+
finalStringBuilderheadersString =newStringBuilder();
2222
for (Map.Entry<String,String>header :mP.getHeaders().entrySet()) {
23-
sb.append(header.getKey())
23+
headersString.append(header.getKey())
2424
.append(": ")
2525
.append(header.getValue())
2626
.append("\r\n");
2727
}
2828

29-
sb.append("\r\n").append(MultipartUtils.getPayload(mP).toString());
30-
assertEquals("Content-Type: multipart/form-data; boundary=\"" +mP.getBoundary() +"\"\r\n\r\n",sb.toString());
29+
assertEquals("Content-Type: multipart/form-data; boundary=\"" +mP.getBoundary() +"\"\r\n",
30+
headersString.toString());
31+
32+
assertEquals("",MultipartUtils.getPayload(mP).toString());
3133
}
3234

3335
@Test
@@ -51,36 +53,34 @@ public void testSimpleMultipartPayload() throws IOException {
5153

5254
mP.setEpilogue("This is the epilogue. It is also to be ignored.");
5355

54-
finalStringBuildersb =newStringBuilder();
56+
finalStringBuilderheadersString =newStringBuilder();
5557
for (Map.Entry<String,String>header :mP.getHeaders().entrySet()) {
56-
sb.append(header.getKey())
58+
headersString.append(header.getKey())
5759
.append(": ")
5860
.append(header.getValue())
5961
.append("\r\n");
6062
}
61-
sb.append("\r\n").append(MultipartUtils.getPayload(mP).toString());
63+
6264
assertEquals("X-Header: X-Value\r\n"
6365
+"Content-Disposition: Content-Disposition-Value\r\n"
64-
+"Content-Type: multipart/mixed; boundary=\"simple boundary\"\r\n"
65-
+"\r\n"
66-
+"This is the preamble. It is to be ignored, though it\n"
66+
+"Content-Type: multipart/mixed; boundary=\"simple boundary\"\r\n",
67+
headersString.toString());
68+
69+
assertEquals("This is the preamble. It is to be ignored, though it\n"
6770
+"is a handy place for composition agents to include an\n"
6871
+"explanatory note to non-MIME conformant readers."
69-
+"\r\n"
70-
+"--simple boundary\r\n"
72+
+"\r\n--simple boundary\r\n"
7173
+"\r\n"
7274
+"This is implicitly typed plain US-ASCII text.\n"
7375
+"It does NOT end with a linebreak."
74-
+"\r\n"
75-
+"--simple boundary\r\n"
76+
+"\r\n--simple boundary\r\n"
7677
+"Content-Type: text/plain; charset=us-ascii\r\n"
7778
+"\r\n"
7879
+"This is explicitly typed plain US-ASCII text.\n"
7980
+"It DOES end with a linebreak.\n"
80-
+"\r\n"
81-
+"--simple boundary--\r\n"
82-
+"This is the epilogue. It is also to be ignored.\r\n",
83-
sb.toString());
81+
+"\r\n--simple boundary--"
82+
+"\r\nThis is the epilogue. It is also to be ignored.",
83+
MultipartUtils.getPayload(mP).toString());
8484
}
8585

8686
@Test
@@ -92,67 +92,58 @@ public void testCRLFMultipartPayload() throws IOException {
9292
mP.addBodyPart("It does end with a\\r\\n linebreak.\r\n".getBytes());
9393
mP.addBodyPart("the last one".getBytes());
9494

95-
finalStringBuildersb =newStringBuilder();
95+
finalStringBuilderheadersString =newStringBuilder();
9696
for (Map.Entry<String,String>header :mP.getHeaders().entrySet()) {
97-
sb.append(header.getKey())
97+
headersString.append(header.getKey())
9898
.append(": ")
9999
.append(header.getValue())
100100
.append("\r\n");
101101
}
102-
sb.append("\r\n").append(MultipartUtils.getPayload(mP).toString());
103-
assertEquals("Content-Type: multipart/form-data; boundary=\"simple-boundary\"\r\n"
104-
+"\r\n"
105-
+"\r\n"
106-
+"--simple-boundary\r\n"
102+
103+
assertEquals("Content-Type: multipart/form-data; boundary=\"simple-boundary\"\r\n",headersString.toString());
104+
105+
assertEquals("--simple-boundary\r\n"
107106
+"\r\n"
108107
+"It does NOT end with a linebreak."
109-
+"\r\n"
110-
+"--simple-boundary\r\n"
108+
+"\r\n--simple-boundary\r\n"
111109
+"\r\n"
112110
+"It does end with a\\r linebreak.\r"
113-
+"\r\n"
114-
+"--simple-boundary\r\n"
111+
+"\r\n--simple-boundary\r\n"
115112
+"\r\n"
116113
+"It does end with a\\n linebreak.\n"
117-
+"\r\n"
118-
+"--simple-boundary\r\n"
114+
+"\r\n--simple-boundary\r\n"
119115
+"\r\n"
120116
+"It does end with a\\r\\n linebreak.\r\n"
121-
+"\r\n"
122-
+"--simple-boundary\r\n"
117+
+"\r\n--simple-boundary\r\n"
123118
+"\r\n"
124119
+"the last one"
125-
+"\r\n"
126-
+"--simple-boundary--\r\n",
127-
sb.toString());
120+
+"\r\n--simple-boundary--",
121+
MultipartUtils.getPayload(mP).toString());
128122
}
129123

130124
@Test
131125
publicvoidtestFileByteArrayBodyPartPayloadMultipartPayload()throwsIOException {
132126
finalMultipartPayloadmP =newMultipartPayload("testFileByteArrayBodyPartPayloadMultipartPayload boundary");
133127
mP.addBodyPart(newFileByteArrayBodyPartPayload("fileContent".getBytes(),"name","filename.ext"));
134128

135-
finalStringBuildersb =newStringBuilder();
129+
finalStringBuilderheadersString =newStringBuilder();
136130
for (Map.Entry<String,String>header :mP.getHeaders().entrySet()) {
137-
sb.append(header.getKey())
131+
headersString.append(header.getKey())
138132
.append(": ")
139133
.append(header.getValue())
140134
.append("\r\n");
141135
}
142136

143-
sb.append("\r\n").append(MultipartUtils.getPayload(mP).toString());
144137
assertEquals("Content-Type: multipart/form-data; "
145-
+"boundary=\"testFileByteArrayBodyPartPayloadMultipartPayload boundary\"\r\n"
146-
+"\r\n"
147-
+"\r\n"
148-
+"--testFileByteArrayBodyPartPayloadMultipartPayload boundary\r\n"
138+
+"boundary=\"testFileByteArrayBodyPartPayloadMultipartPayload boundary\"\r\n",
139+
headersString.toString());
140+
141+
assertEquals("--testFileByteArrayBodyPartPayloadMultipartPayload boundary\r\n"
149142
+"Content-Disposition: form-data; name=\"name\"; filename=\"filename.ext\"\r\n"
150143
+"\r\n"
151144
+"fileContent"
152-
+"\r\n"
153-
+"--testFileByteArrayBodyPartPayloadMultipartPayload boundary--\r\n",
154-
sb.toString()
155-
);
145+
+"\r\n--testFileByteArrayBodyPartPayloadMultipartPayload boundary--",
146+
MultipartUtils.getPayload(mP).toString());
156147
}
157148

158149
@Test
@@ -201,63 +192,54 @@ public void testComplexMultipartPayload() throws IOException {
201192
+"\n"
202193
+"... Additional text in ISO-8859-1 goes here ...\n").getBytes(),"message/rfc822");
203194

204-
finalStringBuildersb =newStringBuilder();
195+
finalStringBuilderheadersString =newStringBuilder();
205196
for (Map.Entry<String,String>header :mP.getHeaders().entrySet()) {
206-
sb.append(header.getKey())
197+
headersString.append(header.getKey())
207198
.append(": ")
208199
.append(header.getValue())
209200
.append("\r\n");
210201
}
211-
sb.append("\r\n").append(MultipartUtils.getPayload(mP).toString());
212-
assertEquals("Content-Type: multipart/mixed; boundary=\"unique-boundary-1\"\r\n"
213-
+"\r\n"
214-
+"This is the preamble area of a multipart message.\n"
202+
assertEquals("Content-Type: multipart/mixed; boundary=\"unique-boundary-1\"\r\n",headersString.toString());
203+
204+
assertEquals("This is the preamble area of a multipart message.\n"
215205
+"Mail readers that understand multipart format\n"
216206
+"should ignore this preamble.\n"
217207
+"\n"
218208
+"If you are reading this text, you might want to\n"
219209
+"consider changing to a mail reader that understands\n"
220210
+"how to properly display multipart messages.\n"
221-
+"\r\n"
222-
+"--unique-boundary-1\r\n"
211+
+"\r\n--unique-boundary-1\r\n"
223212
+"\r\n"
224213
+"... Some text appears here ..."
225-
+"\r\n"
226-
+"--unique-boundary-1\r\n"
214+
+"\r\n--unique-boundary-1\r\n"
227215
+"Content-Type: text/plain; charset=US-ASCII\r\n"
228216
+"\r\n"
229217
+"This could have been part of the previous part, but\n"
230218
+"illustrates explicit versus implicit typing of body\n"
231219
+"parts.\n"
232-
+"\r\n"
233-
+"--unique-boundary-1\r\n"
220+
+"\r\n--unique-boundary-1\r\n"
234221
+"Content-Type: multipart/parallel; boundary=\"unique-boundary-2\"\r\n"
235-
+"\r\n"
236-
+"--unique-boundary-2\r\n"
222+
+"\r\n--unique-boundary-2\r\n"
237223
+"Content-Type: audio/basic\r\n"
238224
+"Content-Transfer-Encoding: base64\r\n"
239225
+"\r\n"
240226
+"... base64-encoded 8000 Hz single-channel\n"
241227
+" mu-law-format audio data goes here ..."
242-
+"\r\n"
243-
+"--unique-boundary-2\r\n"
228+
+"\r\n--unique-boundary-2\r\n"
244229
+"Content-Type: image/jpeg\r\n"
245230
+"Content-Transfer-Encoding: base64\r\n"
246231
+"\r\n"
247232
+"... base64-encoded image data goes here ..."
248-
+"\r\n"
249-
+"--unique-boundary-2--\r\n"
250-
+"\r\n"
251-
+"--unique-boundary-1\r\n"
233+
+"\r\n--unique-boundary-2--"
234+
+"\r\n--unique-boundary-1\r\n"
252235
+"Content-Type: text/enriched\r\n"
253236
+"\r\n"
254237
+"This is <bold><italic>enriched.</italic></bold>\n"
255238
+"<smaller>as defined in RFC 1896</smaller>\n"
256239
+"\n"
257240
+"Isn't it\n"
258241
+"<bigger><bigger>cool?</bigger></bigger>\n"
259-
+"\r\n"
260-
+"--unique-boundary-1\r\n"
242+
+"\r\n--unique-boundary-1\r\n"
261243
+"Content-Type: message/rfc822\r\n"
262244
+"\r\n"
263245
+"From: (mailbox in US-ASCII)\n"
@@ -267,9 +249,8 @@ public void testComplexMultipartPayload() throws IOException {
267249
+"Content-Transfer-Encoding: Quoted-printable\n"
268250
+"\n"
269251
+"... Additional text in ISO-8859-1 goes here ...\n"
270-
+"\r\n"
271-
+"--unique-boundary-1--\r\n",
272-
sb.toString());
252+
+"\r\n--unique-boundary-1--",
253+
MultipartUtils.getPayload(mP).toString());
273254
}
274255

275256
@Test

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp