blob: f3e38fe6e1ea5ed7acc7176926cdb2198f5fe0c4 [file] [log] [blame]
Ed Tanous40e9b922024-09-10 13:50:16 -07001// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright OpenBMC Authors
Nan Zhou77665bd2022-10-12 20:28:58 +00003#include "http_request.hpp"
Nan Zhouca0cb4c2022-06-21 17:47:09 +00004#include "multipart_parser.hpp"
5
Nan Zhoud5c80ad2022-07-11 01:16:31 +00006#include <boost/beast/http/fields.hpp>
Ed Tanousaf4edf62020-07-21 08:46:25 -07007
Ed Tanousf0b59af2024-03-20 13:38:04 -07008#include <iterator>
Nan Zhoud5c80ad2022-07-11 01:16:31 +00009#include <string_view>
Nan Zhouca0cb4c2022-06-21 17:47:09 +000010#include <system_error>
Nan Zhoud5c80ad2022-07-11 01:16:31 +000011#include <vector>
Ed Tanousaf4edf62020-07-21 08:46:25 -070012
Ed Tanous478b7ad2024-07-15 19:11:54 -070013#include <gtest/gtest.h>
Ed Tanousaf4edf62020-07-21 08:46:25 -070014
Nan Zhoue52d1562022-06-21 17:47:15 +000015namespace
16{
17using ::testing::Test;
18
19class MultipartTest : public Test
Ed Tanousaf4edf62020-07-21 08:46:25 -070020{
21 public:
Ed Tanousaf4edf62020-07-21 08:46:25 -070022 MultipartParser parser;
23 std::error_code ec;
24};
25
26TEST_F(MultipartTest, TestGoodMultipartParser)
27{
Ed Tanous6fb96ce2024-01-28 21:30:06 -080028 std::string_view body =
29 "-----------------------------d74496d66958873e\r\n"
30 "Content-Disposition: form-data; name=\"Test1\"\r\n\r\n"
31 "111111111111111111111111112222222222222222222222222222222\r\n"
32 "-----------------------------d74496d66958873e\r\n"
33 "Content-Disposition: form-data; name=\"Test2\"\r\n\r\n"
34 "{\r\n-----------------------------d74496d66958873e123456\r\n"
35 "-----------------------------d74496d66958873e\r\n"
36 "Content-Disposition: form-data; name=\"Test3\"\r\n\r\n"
37 "{\r\n--------d74496d6695887}\r\n"
38 "-----------------------------d74496d66958873e--\r\n";
Ed Tanousaf4edf62020-07-21 08:46:25 -070039
Ed Tanous6fb96ce2024-01-28 21:30:06 -080040 crow::Request reqIn(body, ec);
Ed Tanousaf4edf62020-07-21 08:46:25 -070041
Ed Tanous6fb96ce2024-01-28 21:30:06 -080042 reqIn.addHeader("Content-Type",
43 "multipart/form-data; "
44 "boundary=---------------------------d74496d66958873e");
45
Ed Tanousaf4edf62020-07-21 08:46:25 -070046 ParserError rc = parser.parse(reqIn);
47 ASSERT_EQ(rc, ParserError::PARSER_SUCCESS);
48
Nan Zhoucc606192022-06-21 17:47:19 +000049 EXPECT_EQ(parser.boundary,
Ed Tanousaf4edf62020-07-21 08:46:25 -070050 "\r\n-----------------------------d74496d66958873e");
Nan Zhoucc606192022-06-21 17:47:19 +000051 EXPECT_EQ(parser.mime_fields.size(), 3);
Ed Tanousaf4edf62020-07-21 08:46:25 -070052
Nan Zhoucc606192022-06-21 17:47:19 +000053 EXPECT_EQ(parser.mime_fields[0].fields.at("Content-Disposition"),
Ed Tanousaf4edf62020-07-21 08:46:25 -070054 "form-data; name=\"Test1\"");
Nan Zhoucc606192022-06-21 17:47:19 +000055 EXPECT_EQ(parser.mime_fields[0].content,
Ed Tanousaf4edf62020-07-21 08:46:25 -070056 "111111111111111111111111112222222222222222222222222222222");
57
Nan Zhoucc606192022-06-21 17:47:19 +000058 EXPECT_EQ(parser.mime_fields[1].fields.at("Content-Disposition"),
Ed Tanousaf4edf62020-07-21 08:46:25 -070059 "form-data; name=\"Test2\"");
Nan Zhoucc606192022-06-21 17:47:19 +000060 EXPECT_EQ(parser.mime_fields[1].content,
Ed Tanousaf4edf62020-07-21 08:46:25 -070061 "{\r\n-----------------------------d74496d66958873e123456");
Nan Zhoucc606192022-06-21 17:47:19 +000062 EXPECT_EQ(parser.mime_fields[2].fields.at("Content-Disposition"),
Ed Tanousaf4edf62020-07-21 08:46:25 -070063 "form-data; name=\"Test3\"");
Nan Zhoucc606192022-06-21 17:47:19 +000064 EXPECT_EQ(parser.mime_fields[2].content, "{\r\n--------d74496d6695887}");
Ed Tanousaf4edf62020-07-21 08:46:25 -070065}
66
67TEST_F(MultipartTest, TestBadMultipartParser1)
68{
Ed Tanous6fb96ce2024-01-28 21:30:06 -080069 std::string_view body =
70 "-----------------------------d74496d66958873e\r\n"
71 "Content-Disposition: form-data; name=\"Test1\"\r\n\r\n"
72 "1234567890\r\n"
73 "-----------------------------d74496d66958873e\r-\r\n";
Ed Tanousaf4edf62020-07-21 08:46:25 -070074
Ed Tanous6fb96ce2024-01-28 21:30:06 -080075 crow::Request reqIn(body, ec);
Ed Tanousaf4edf62020-07-21 08:46:25 -070076
Ed Tanous6fb96ce2024-01-28 21:30:06 -080077 reqIn.addHeader("Content-Type",
78 "multipart/form-data; "
79 "boundary=---------------------------d74496d66958873e");
80
Ed Tanousaf4edf62020-07-21 08:46:25 -070081 ParserError rc = parser.parse(reqIn);
Ed Tanousaf4edf62020-07-21 08:46:25 -070082
Krzysztof Grobelny18e3f7f2022-08-24 09:24:33 +020083 EXPECT_EQ(rc, ParserError::ERROR_UNEXPECTED_END_OF_INPUT);
Ed Tanousaf4edf62020-07-21 08:46:25 -070084}
85
86TEST_F(MultipartTest, TestBadMultipartParser2)
87{
Ed Tanous6fb96ce2024-01-28 21:30:06 -080088 std::string_view body =
89 "-----------------------------d74496d66958873e\r\n"
90 "Content-Disposition: form-data; name=\"Test1\"\r\n\r\n"
91 "abcd\r\n"
92 "-----------------------------d74496d66958873e-\r\n";
93 crow::Request reqIn(body, ec);
Ed Tanousaf4edf62020-07-21 08:46:25 -070094
Ed Tanous6fb96ce2024-01-28 21:30:06 -080095 reqIn.addHeader("Content-Type",
96 "multipart/form-data; "
97 "boundary=---------------------------d74496d66958873e");
Ed Tanousaf4edf62020-07-21 08:46:25 -070098
Ed Tanousaf4edf62020-07-21 08:46:25 -070099 ParserError rc = parser.parse(reqIn);
Ed Tanousaf4edf62020-07-21 08:46:25 -0700100
Krzysztof Grobelny18e3f7f2022-08-24 09:24:33 +0200101 EXPECT_EQ(rc, ParserError::ERROR_UNEXPECTED_END_OF_INPUT);
Ed Tanousaf4edf62020-07-21 08:46:25 -0700102}
103
104TEST_F(MultipartTest, TestErrorBoundaryFormat)
105{
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800106 std::string_view body =
107 "-----------------------------d74496d66958873e\r\n"
108 "Content-Disposition: form-data; name=\"Test1\"\r\n\r\n"
109 "{\"Key1\": 11223333333333333333333333333333333333333333}\r\n"
110 "-----------------------------d74496d66958873e\r\n"
111 "Content-Disposition: form-data; name=\"Test2\"\r\n\r\n"
112 "123456\r\n"
113 "-----------------------------d74496d66958873e--\r\n";
Ed Tanousaf4edf62020-07-21 08:46:25 -0700114
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800115 crow::Request reqIn(body, ec);
Ed Tanousaf4edf62020-07-21 08:46:25 -0700116
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800117 reqIn.addHeader("Content-Type",
118 "multipart/form-data; "
119 "boundary+=-----------------------------d74496d66958873e");
120
Nan Zhoucc606192022-06-21 17:47:19 +0000121 EXPECT_EQ(parser.parse(reqIn), ParserError::ERROR_BOUNDARY_FORMAT);
Ed Tanousaf4edf62020-07-21 08:46:25 -0700122}
123
124TEST_F(MultipartTest, TestErrorBoundaryCR)
125{
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800126 std::string_view body =
127 "-----------------------------d74496d66958873e"
128 "Content-Disposition: form-data; name=\"Test1\"\r\n\r"
129 "{\"Key1\": 112233}\r\n"
130 "-----------------------------d74496d66958873e\r\n"
131 "Content-Disposition: form-data; name=\"Test2\"\r\n\r\n"
132 "123456\r\n"
133 "-----------------------------d74496d66958873e--\r\n";
134 crow::Request reqIn(body, ec);
Ed Tanousaf4edf62020-07-21 08:46:25 -0700135
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800136 reqIn.addHeader("Content-Type",
137 "multipart/form-data; "
138 "boundary=---------------------------d74496d66958873e");
Ed Tanousaf4edf62020-07-21 08:46:25 -0700139
Nan Zhoucc606192022-06-21 17:47:19 +0000140 EXPECT_EQ(parser.parse(reqIn), ParserError::ERROR_BOUNDARY_CR);
Ed Tanousaf4edf62020-07-21 08:46:25 -0700141}
142
143TEST_F(MultipartTest, TestErrorBoundaryLF)
144{
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800145 std::string_view body =
146 "-----------------------------d74496d66958873e\r"
147 "Content-Disposition: form-data; name=\"Test1\"\r\n\r\n"
148 "{\"Key1\": 112233}\r\n"
149 "-----------------------------d74496d66958873e\r\n"
150 "Content-Disposition: form-data; name=\"Test2\"\r\n\r\n"
151 "123456\r\n"
152 "-----------------------------d74496d66958873e--\r\n";
Ed Tanousaf4edf62020-07-21 08:46:25 -0700153
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800154 crow::Request reqIn(body, ec);
Ed Tanousaf4edf62020-07-21 08:46:25 -0700155
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800156 reqIn.addHeader("Content-Type",
157 "multipart/form-data; "
158 "boundary=---------------------------d74496d66958873e");
159
Nan Zhoucc606192022-06-21 17:47:19 +0000160 EXPECT_EQ(parser.parse(reqIn), ParserError::ERROR_BOUNDARY_LF);
Ed Tanousaf4edf62020-07-21 08:46:25 -0700161}
162
163TEST_F(MultipartTest, TestErrorBoundaryData)
164{
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800165 std::string_view body =
166 "-----------------------------d74496d66958873e\r\n"
167 "Content-Disposition: form-data; name=\"Test1\"\r\n\r\n"
168 "{\"Key1\": 112233}\r\n"
169 "-----------------------------d74496d66958873e\r\n"
170 "Content-Disposition: form-data; name=\"Test2\"\r\n\r\n"
171 "123456\r\n"
172 "-----------------------------d74496d66958873e--\r\n";
Ed Tanousaf4edf62020-07-21 08:46:25 -0700173
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800174 crow::Request reqIn(body, ec);
Ed Tanousaf4edf62020-07-21 08:46:25 -0700175
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800176 reqIn.addHeader("Content-Type",
177 "multipart/form-data; "
178 "boundary=---------------------------d7449sd6d66958873e");
179
Nan Zhoucc606192022-06-21 17:47:19 +0000180 EXPECT_EQ(parser.parse(reqIn), ParserError::ERROR_BOUNDARY_DATA);
Ed Tanousaf4edf62020-07-21 08:46:25 -0700181}
182
183TEST_F(MultipartTest, TestErrorEmptyHeader)
184{
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800185 std::string_view body =
186 "-----------------------------d74496d66958873e\r\n"
187 ": form-data; name=\"Test1\"\r\n"
188 "{\"Key1\": 112233}\r\n"
189 "-----------------------------d74496d66958873e\r\n"
190 "Content-Disposition: form-data; name=\"Test2\"\r\n"
191 "123456\r\n"
192 "-----------------------------d74496d66958873e--\r\n";
193 crow::Request reqIn(body, ec);
Ed Tanousaf4edf62020-07-21 08:46:25 -0700194
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800195 reqIn.addHeader("Content-Type",
196 "multipart/form-data; "
197 "boundary=---------------------------d74496d66958873e");
Ed Tanousaf4edf62020-07-21 08:46:25 -0700198
Nan Zhoucc606192022-06-21 17:47:19 +0000199 EXPECT_EQ(parser.parse(reqIn), ParserError::ERROR_EMPTY_HEADER);
Ed Tanousaf4edf62020-07-21 08:46:25 -0700200}
201
202TEST_F(MultipartTest, TestErrorHeaderName)
203{
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800204 std::string_view body =
205 "-----------------------------d74496d66958873e\r\n"
206 "Content-!!Disposition: form-data; name=\"Test1\"\r\n"
207 "{\"Key1\": 112233}\r\n"
208 "-----------------------------d74496d66958873e\r\n"
209 "Content-Disposition: form-data; name=\"Test2\"\r\n\r\n"
210 "123456\r\n"
211 "-----------------------------d74496d66958873e--\r\n";
212 crow::Request reqIn(body, ec);
Ed Tanousaf4edf62020-07-21 08:46:25 -0700213
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800214 reqIn.addHeader("Content-Type",
215 "multipart/form-data; "
216 "boundary=---------------------------d74496d66958873e");
Ed Tanousaf4edf62020-07-21 08:46:25 -0700217
Nan Zhoucc606192022-06-21 17:47:19 +0000218 EXPECT_EQ(parser.parse(reqIn), ParserError::ERROR_HEADER_NAME);
Ed Tanousaf4edf62020-07-21 08:46:25 -0700219}
220
221TEST_F(MultipartTest, TestErrorHeaderValue)
222{
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800223 std::string_view body =
224 "-----------------------------d74496d66958873e\r\n"
225 "Content-Disposition: form-data; name=\"Test1\"\r"
226 "{\"Key1\": 112233}\r\n"
227 "-----------------------------d74496d66958873e\r\n"
228 "Content-Disposition: form-data; name=\"Test2\"\r\n\r\n"
229 "123456\r\n"
230 "-----------------------------d74496d66958873e--\r\n";
Ed Tanousaf4edf62020-07-21 08:46:25 -0700231
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800232 crow::Request reqIn(body, ec);
Ed Tanousaf4edf62020-07-21 08:46:25 -0700233
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800234 reqIn.addHeader("Content-Type",
235 "multipart/form-data; "
236 "boundary=---------------------------d74496d66958873e");
237
Nan Zhoucc606192022-06-21 17:47:19 +0000238 EXPECT_EQ(parser.parse(reqIn), ParserError::ERROR_HEADER_VALUE);
Ed Tanousaf4edf62020-07-21 08:46:25 -0700239}
240
241TEST_F(MultipartTest, TestErrorHeaderEnding)
242{
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800243 std::string_view body =
244 "-----------------------------d74496d66958873e\r\n"
245 "Content-Disposition: form-data; name=\"Test1\"\r\n\r"
246 "{\"Key1\": 112233}\r\n"
247 "-----------------------------d74496d66958873e\r\n"
248 "Content-Disposition: form-data; name=\"Test2\"\r\n\r\n"
249 "123456\r\n"
250 "-----------------------------d74496d66958873e--\r\n";
Ed Tanousaf4edf62020-07-21 08:46:25 -0700251
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800252 crow::Request reqIn(body, ec);
Ed Tanousaf4edf62020-07-21 08:46:25 -0700253
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800254 reqIn.addHeader("Content-Type",
255 "multipart/form-data; "
256 "boundary=---------------------------d74496d66958873e");
257
Nan Zhoucc606192022-06-21 17:47:19 +0000258 EXPECT_EQ(parser.parse(reqIn), ParserError::ERROR_HEADER_ENDING);
Ed Tanousaf4edf62020-07-21 08:46:25 -0700259}
Krzysztof Grobelny18e3f7f2022-08-24 09:24:33 +0200260
261TEST_F(MultipartTest, TestGoodMultipartParserMultipleHeaders)
262{
Patrick Williamsbd79bce2024-08-16 15:22:20 -0400263 std::string_view body =
264 "-----------------------------d74496d66958873e\r\n"
265 "Content-Disposition: form-data; name=\"Test1\"\r\n"
266 "Other-Header: value=\"v1\"\r\n"
267 "\r\n"
268 "Data1\r\n"
269 "-----------------------------d74496d66958873e--";
Krzysztof Grobelny18e3f7f2022-08-24 09:24:33 +0200270
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800271 crow::Request reqIn(body, ec);
Krzysztof Grobelny18e3f7f2022-08-24 09:24:33 +0200272
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800273 reqIn.addHeader("Content-Type",
274 "multipart/form-data; "
275 "boundary=---------------------------d74496d66958873e");
276
Krzysztof Grobelny18e3f7f2022-08-24 09:24:33 +0200277 ParserError rc = parser.parse(reqIn);
278 ASSERT_EQ(rc, ParserError::PARSER_SUCCESS);
279
280 EXPECT_EQ(parser.boundary,
281 "\r\n-----------------------------d74496d66958873e");
282 ASSERT_EQ(parser.mime_fields.size(), 1);
283
284 EXPECT_EQ(parser.mime_fields[0].fields.at("Content-Disposition"),
285 "form-data; name=\"Test1\"");
286 EXPECT_EQ(parser.mime_fields[0].fields.at("Other-Header"), "value=\"v1\"");
287 EXPECT_EQ(parser.mime_fields[0].content, "Data1");
288}
289
290TEST_F(MultipartTest, TestErrorHeaderWithoutColon)
291{
Patrick Williamsbd79bce2024-08-16 15:22:20 -0400292 std::string_view body =
293 "----end\r\n"
294 "abc\r\n"
295 "\r\n"
296 "Data1\r\n"
297 "----end--\r\n";
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800298 crow::Request reqIn(body, ec);
Krzysztof Grobelny18e3f7f2022-08-24 09:24:33 +0200299
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800300 reqIn.addHeader("Content-Type", "multipart/form-data; "
301 "boundary=--end");
Krzysztof Grobelny18e3f7f2022-08-24 09:24:33 +0200302
Krzysztof Grobelny18e3f7f2022-08-24 09:24:33 +0200303 EXPECT_EQ(parser.parse(reqIn), ParserError::ERROR_UNEXPECTED_END_OF_HEADER);
304}
305
306TEST_F(MultipartTest, TestUnknownHeaderIsCorrectlyParsed)
307{
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800308 std::string_view body =
Krzysztof Grobelny18e3f7f2022-08-24 09:24:33 +0200309 "----end\r\n"
310 "t-DiPpcccc:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccgcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaaa\r\n"
311 "\r\n"
312 "Data1\r\n"
313 "----end--\r\n";
314
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800315 crow::Request reqIn(body, ec);
316
317 reqIn.addHeader("Content-Type", "multipart/form-data; "
318 "boundary=--end");
Krzysztof Grobelny18e3f7f2022-08-24 09:24:33 +0200319 ParserError rc = parser.parse(reqIn);
320
321 ASSERT_EQ(rc, ParserError::PARSER_SUCCESS);
322
323 EXPECT_EQ(parser.boundary, "\r\n----end");
324 ASSERT_EQ(parser.mime_fields.size(), 1);
325
326 EXPECT_EQ(
327 parser.mime_fields[0].fields.at("t-DiPpcccc"),
328 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccgcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaaa");
329 EXPECT_EQ(parser.mime_fields[0].content, "Data1");
330}
331
332TEST_F(MultipartTest, TestErrorMissingSeparatorBetweenMimeFieldsAndData)
333{
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800334 std::string_view body =
Krzysztof Grobelny18e3f7f2022-08-24 09:24:33 +0200335 "-----------------------------d74496d66958873e\r\n"
336 "t-DiPpcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccgcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaaa\r\n"
337 "Data1"
338 "-----------------------------d74496d66958873e--";
339
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800340 crow::Request reqIn(body, ec);
341
342 reqIn.addHeader(
343 "Content-Type",
344 "multipart/form-data; boundary=---------------------------d74496d66958873e");
345
Krzysztof Grobelny18e3f7f2022-08-24 09:24:33 +0200346 ParserError rc = parser.parse(reqIn);
347
348 EXPECT_EQ(rc, ParserError::ERROR_UNEXPECTED_END_OF_HEADER);
349}
350
351TEST_F(MultipartTest, TestDataWithoutMimeFields)
352{
Patrick Williamsbd79bce2024-08-16 15:22:20 -0400353 std::string_view body =
354 "-----------------------------d74496d66958873e\r\n"
355 "\r\n"
356 "Data1\r\n"
357 "-----------------------------d74496d66958873e--";
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800358
359 crow::Request reqIn(body, ec);
360
361 reqIn.addHeader(
Krzysztof Grobelny18e3f7f2022-08-24 09:24:33 +0200362 "Content-Type",
363 "multipart/form-data; boundary=---------------------------d74496d66958873e");
364
Krzysztof Grobelny18e3f7f2022-08-24 09:24:33 +0200365 ParserError rc = parser.parse(reqIn);
366
367 ASSERT_EQ(rc, ParserError::PARSER_SUCCESS);
368
369 EXPECT_EQ(parser.boundary,
370 "\r\n-----------------------------d74496d66958873e");
371 ASSERT_EQ(parser.mime_fields.size(), 1);
372
373 EXPECT_EQ(std::distance(parser.mime_fields[0].fields.begin(),
374 parser.mime_fields[0].fields.end()),
375 0);
376 EXPECT_EQ(parser.mime_fields[0].content, "Data1");
377}
378
379TEST_F(MultipartTest, TestErrorMissingFinalBoundry)
380{
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800381 std::string_view body =
Krzysztof Grobelny18e3f7f2022-08-24 09:24:33 +0200382 "----XX\r\n"
383 "Content-Disposition: form-data; name=\"Test2\"\r\n\r\n"
384 "t-DiPpccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAABCDz\r\n"
385 "\335\r\n\r\n";
386
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800387 crow::Request reqIn(body, ec);
388
389 reqIn.addHeader("Content-Type", "multipart/form-data; boundary=--XX");
390
Krzysztof Grobelny18e3f7f2022-08-24 09:24:33 +0200391 ParserError rc = parser.parse(reqIn);
392
393 EXPECT_EQ(rc, ParserError::ERROR_UNEXPECTED_END_OF_INPUT);
394}
395
396TEST_F(MultipartTest, TestIgnoreDataAfterFinalBoundary)
397{
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800398 std::string_view body =
399 "----XX\r\n"
400 "Content-Disposition: form-data; name=\"Test1\"\r\n\r\n"
401 "Data1\r\n"
402 "----XX--\r\n"
403 "Content-Disposition: form-data; name=\"Test2\"\r\n\r\n"
404 "Data2\r\n"
405 "----XX--\r\n";
Krzysztof Grobelny18e3f7f2022-08-24 09:24:33 +0200406
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800407 crow::Request reqIn(body, ec);
Krzysztof Grobelny18e3f7f2022-08-24 09:24:33 +0200408
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800409 reqIn.addHeader("Content-Type", "multipart/form-data; boundary=--XX");
410
Krzysztof Grobelny18e3f7f2022-08-24 09:24:33 +0200411 ParserError rc = parser.parse(reqIn);
412
413 ASSERT_EQ(rc, ParserError::PARSER_SUCCESS);
414
415 EXPECT_EQ(parser.boundary, "\r\n----XX");
416 EXPECT_EQ(parser.mime_fields.size(), 1);
417
418 EXPECT_EQ(parser.mime_fields[0].fields.at("Content-Disposition"),
419 "form-data; name=\"Test1\"");
420 EXPECT_EQ(parser.mime_fields[0].content, "Data1");
421}
422
423TEST_F(MultipartTest, TestFinalBoundaryIsCorrectlyRecognized)
424{
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800425 std::string_view body =
426 "----XX\r\n"
427 "Content-Disposition: form-data; name=\"Test1\"\r\n\r\n"
428 "Data1\r\n"
429 "----XX-abc-\r\n"
430 "StillData1\r\n"
431 "----XX--\r\n";
Krzysztof Grobelny18e3f7f2022-08-24 09:24:33 +0200432
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800433 crow::Request reqIn(body, ec);
Krzysztof Grobelny18e3f7f2022-08-24 09:24:33 +0200434
Ed Tanous6fb96ce2024-01-28 21:30:06 -0800435 reqIn.addHeader("Content-Type", "multipart/form-data; boundary=--XX");
436
Krzysztof Grobelny18e3f7f2022-08-24 09:24:33 +0200437 ParserError rc = parser.parse(reqIn);
438
439 ASSERT_EQ(rc, ParserError::PARSER_SUCCESS);
440
441 EXPECT_EQ(parser.boundary, "\r\n----XX");
442 EXPECT_EQ(parser.mime_fields.size(), 1);
443
444 EXPECT_EQ(parser.mime_fields[0].fields.at("Content-Disposition"),
445 "form-data; name=\"Test1\"");
Patrick Williamsbd79bce2024-08-16 15:22:20 -0400446 EXPECT_EQ(parser.mime_fields[0].content,
447 "Data1\r\n"
448 "----XX-abc-\r\n"
449 "StillData1");
Krzysztof Grobelny18e3f7f2022-08-24 09:24:33 +0200450}
451
452} // namespace