Skip to content

Commit 837e67d

Browse files
committed
Internal refactoring to instantiate and inject MultipartParser
1 parent 64e0b90 commit 837e67d

3 files changed

Lines changed: 70 additions & 40 deletions

File tree

src/Io/MultipartParser.php

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,8 @@ final class MultipartParser
4949

5050
private $postCount = 0;
5151

52-
public static function parseRequest(ServerRequestInterface $request)
52+
public function __construct()
5353
{
54-
$parser = new self($request);
55-
return $parser->parse();
56-
}
57-
58-
private function __construct(ServerRequestInterface $request)
59-
{
60-
$this->request = $request;
61-
6254
$var = ini_get('max_input_vars');
6355
if ($var !== false) {
6456
$this->maxInputVars = (int)$var;
@@ -69,16 +61,22 @@ private function __construct(ServerRequestInterface $request)
6961
}
7062
}
7163

72-
private function parse()
64+
public function parse(ServerRequestInterface $request)
7365
{
74-
$contentType = $this->request->getHeaderLine('content-type');
66+
$contentType = $request->getHeaderLine('content-type');
7567
if(!preg_match('/boundary="?(.*)"?$/', $contentType, $matches)) {
76-
return $this->request;
68+
return $request;
7769
}
7870

79-
$this->parseBody('--' . $matches[1], (string)$this->request->getBody());
71+
$this->request = $request;
72+
$this->parseBody('--' . $matches[1], (string)$request->getBody());
73+
74+
$request = $this->request;
75+
$this->request = null;
76+
$this->postCount = 0;
77+
$this->maxFileSize = null;
8078

81-
return $this->request;
79+
return $request;
8280
}
8381

8482
private function parseBody($boundary, $buffer)

src/Middleware/RequestBodyParserMiddleware.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@
77

88
final class RequestBodyParserMiddleware
99
{
10+
private $multipart;
11+
12+
public function __construct()
13+
{
14+
$this->multipart = new MultipartParser();
15+
}
16+
1017
public function __invoke(ServerRequestInterface $request, $next)
1118
{
1219
$type = strtolower($request->getHeaderLine('Content-Type'));
@@ -17,7 +24,7 @@ public function __invoke(ServerRequestInterface $request, $next)
1724
}
1825

1926
if ($type === 'multipart/form-data') {
20-
return $next(MultipartParser::parseRequest($request));
27+
return $next($this->multipart->parse($request));
2128
}
2229

2330
return $next($request);

tests/Io/MultipartParserTest.php

Lines changed: 50 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ public function testDoesNotParseWithoutMultipartFormDataContentType()
2626
'Content-Type' => 'multipart/form-data',
2727
), $data, 1.1);
2828

29-
$parsedRequest = MultipartParser::parseRequest($request);
29+
$parser = new MultipartParser();
30+
$parsedRequest = $parser->parse($request);
3031

3132
$this->assertEmpty($parsedRequest->getUploadedFiles());
3233
$this->assertEmpty($parsedRequest->getParsedBody());
@@ -50,7 +51,8 @@ public function testPostKey()
5051
'Content-Type' => 'multipart/form-data; boundary=' . $boundary,
5152
), $data, 1.1);
5253

53-
$parsedRequest = MultipartParser::parseRequest($request);
54+
$parser = new MultipartParser();
55+
$parsedRequest = $parser->parse($request);
5456

5557
$this->assertEmpty($parsedRequest->getUploadedFiles());
5658
$this->assertSame(
@@ -82,7 +84,8 @@ public function testPostStringOverwritesMap()
8284
'Content-Type' => 'multipart/form-data; boundary=' . $boundary,
8385
), $data, 1.1);
8486

85-
$parsedRequest = MultipartParser::parseRequest($request);
87+
$parser = new MultipartParser();
88+
$parsedRequest = $parser->parse($request);
8689

8790
$this->assertEmpty($parsedRequest->getUploadedFiles());
8891
$this->assertSame(
@@ -111,7 +114,8 @@ public function testPostMapOverwritesString()
111114
'Content-Type' => 'multipart/form-data; boundary=' . $boundary,
112115
), $data, 1.1);
113116

114-
$parsedRequest = MultipartParser::parseRequest($request);
117+
$parser = new MultipartParser();
118+
$parsedRequest = $parser->parse($request);
115119

116120
$this->assertEmpty($parsedRequest->getUploadedFiles());
117121
$this->assertSame(
@@ -142,7 +146,8 @@ public function testPostVectorOverwritesString()
142146
'Content-Type' => 'multipart/form-data; boundary=' . $boundary,
143147
), $data, 1.1);
144148

145-
$parsedRequest = MultipartParser::parseRequest($request);
149+
$parser = new MultipartParser();
150+
$parsedRequest = $parser->parse($request);
146151

147152
$this->assertEmpty($parsedRequest->getUploadedFiles());
148153
$this->assertSame(
@@ -173,7 +178,8 @@ public function testPostDeeplyNestedArray()
173178
'Content-Type' => 'multipart/form-data; boundary=' . $boundary,
174179
), $data, 1.1);
175180

176-
$parsedRequest = MultipartParser::parseRequest($request);
181+
$parser = new MultipartParser();
182+
$parsedRequest = $parser->parse($request);
177183

178184
$this->assertEmpty($parsedRequest->getUploadedFiles());
179185
$this->assertSame(
@@ -205,7 +211,8 @@ public function testEmptyPostValue()
205211
'Content-Type' => 'multipart/form-data; boundary=' . $boundary,
206212
), $data, 1.1);
207213

208-
$parsedRequest = MultipartParser::parseRequest($request);
214+
$parser = new MultipartParser();
215+
$parsedRequest = $parser->parse($request);
209216

210217
$this->assertEmpty($parsedRequest->getUploadedFiles());
211218
$this->assertSame(
@@ -230,7 +237,8 @@ public function testEmptyPostKey()
230237
'Content-Type' => 'multipart/form-data; boundary=' . $boundary,
231238
), $data, 1.1);
232239

233-
$parsedRequest = MultipartParser::parseRequest($request);
240+
$parser = new MultipartParser();
241+
$parsedRequest = $parser->parse($request);
234242

235243
$this->assertEmpty($parsedRequest->getUploadedFiles());
236244
$this->assertSame(
@@ -255,7 +263,8 @@ public function testNestedPostKeyAssoc()
255263
'Content-Type' => 'multipart/form-data; boundary=' . $boundary,
256264
), $data, 1.1);
257265

258-
$parsedRequest = MultipartParser::parseRequest($request);
266+
$parser = new MultipartParser();
267+
$parsedRequest = $parser->parse($request);
259268

260269
$this->assertEmpty($parsedRequest->getUploadedFiles());
261270
$this->assertSame(
@@ -284,7 +293,8 @@ public function testNestedPostKeyVector()
284293
'Content-Type' => 'multipart/form-data; boundary=' . $boundary,
285294
), $data, 1.1);
286295

287-
$parsedRequest = MultipartParser::parseRequest($request);
296+
$parser = new MultipartParser();
297+
$parsedRequest = $parser->parse($request);
288298

289299
$this->assertEmpty($parsedRequest->getUploadedFiles());
290300
$this->assertSame(
@@ -364,7 +374,8 @@ public function testFileUpload()
364374
'Content-Type' => 'multipart/form-data; boundary=' . $boundary,
365375
), $data, 1.1);
366376

367-
$parsedRequest = MultipartParser::parseRequest($request);
377+
$parser = new MultipartParser();
378+
$parsedRequest = $parser->parse($request);
368379

369380
$this->assertSame(
370381
array(
@@ -418,7 +429,8 @@ public function testInvalidDoubleContentDispositionUsesLast()
418429
'Content-Type' => 'multipart/form-data; boundary=' . $boundary,
419430
), $data, 1.1);
420431

421-
$parsedRequest = MultipartParser::parseRequest($request);
432+
$parser = new MultipartParser();
433+
$parsedRequest = $parser->parse($request);
422434

423435
$this->assertEmpty($parsedRequest->getUploadedFiles());
424436
$this->assertSame(
@@ -443,7 +455,8 @@ public function testInvalidMissingNewlineAfterValueWillBeIgnored()
443455
'Content-Type' => 'multipart/form-data; boundary=' . $boundary,
444456
), $data, 1.1);
445457

446-
$parsedRequest = MultipartParser::parseRequest($request);
458+
$parser = new MultipartParser();
459+
$parsedRequest = $parser->parse($request);
447460

448461
$this->assertEmpty($parsedRequest->getUploadedFiles());
449462
$this->assertEmpty($parsedRequest->getParsedBody());
@@ -462,7 +475,8 @@ public function testInvalidMissingValueWillBeIgnored()
462475
'Content-Type' => 'multipart/form-data; boundary=' . $boundary,
463476
), $data, 1.1);
464477

465-
$parsedRequest = MultipartParser::parseRequest($request);
478+
$parser = new MultipartParser();
479+
$parsedRequest = $parser->parse($request);
466480

467481
$this->assertEmpty($parsedRequest->getUploadedFiles());
468482
$this->assertEmpty($parsedRequest->getParsedBody());
@@ -479,7 +493,8 @@ public function testInvalidMissingValueAndEndBoundaryWillBeIgnored()
479493
'Content-Type' => 'multipart/form-data; boundary=' . $boundary,
480494
), $data, 1.1);
481495

482-
$parsedRequest = MultipartParser::parseRequest($request);
496+
$parser = new MultipartParser();
497+
$parsedRequest = $parser->parse($request);
483498

484499
$this->assertEmpty($parsedRequest->getUploadedFiles());
485500
$this->assertEmpty($parsedRequest->getParsedBody());
@@ -499,7 +514,8 @@ public function testInvalidContentDispositionMissingWillBeIgnored()
499514
'Content-Type' => 'multipart/form-data; boundary=' . $boundary,
500515
), $data, 1.1);
501516

502-
$parsedRequest = MultipartParser::parseRequest($request);
517+
$parser = new MultipartParser();
518+
$parsedRequest = $parser->parse($request);
503519

504520
$this->assertEmpty($parsedRequest->getUploadedFiles());
505521
$this->assertEmpty($parsedRequest->getParsedBody());
@@ -519,7 +535,8 @@ public function testInvalidContentDispositionMissingValueWillBeIgnored()
519535
'Content-Type' => 'multipart/form-data; boundary=' . $boundary,
520536
), $data, 1.1);
521537

522-
$parsedRequest = MultipartParser::parseRequest($request);
538+
$parser = new MultipartParser();
539+
$parsedRequest = $parser->parse($request);
523540

524541
$this->assertEmpty($parsedRequest->getUploadedFiles());
525542
$this->assertEmpty($parsedRequest->getParsedBody());
@@ -539,7 +556,8 @@ public function testInvalidContentDispositionWithoutNameWillBeIgnored()
539556
'Content-Type' => 'multipart/form-data; boundary=' . $boundary,
540557
), $data, 1.1);
541558

542-
$parsedRequest = MultipartParser::parseRequest($request);
559+
$parser = new MultipartParser();
560+
$parsedRequest = $parser->parse($request);
543561

544562
$this->assertEmpty($parsedRequest->getUploadedFiles());
545563
$this->assertEmpty($parsedRequest->getParsedBody());
@@ -558,7 +576,8 @@ public function testInvalidMissingEndBoundaryWillBeIgnored()
558576
'Content-Type' => 'multipart/form-data; boundary=' . $boundary,
559577
), $data, 1.1);
560578

561-
$parsedRequest = MultipartParser::parseRequest($request);
579+
$parser = new MultipartParser();
580+
$parsedRequest = $parser->parse($request);
562581

563582
$this->assertEmpty($parsedRequest->getUploadedFiles());
564583
$this->assertSame(
@@ -581,7 +600,8 @@ public function testInvalidUploadFileWithoutContentTypeUsesNullValue()
581600
'Content-Type' => 'multipart/form-data; boundary=' . $boundary,
582601
), $data, 1.1);
583602

584-
$parsedRequest = MultipartParser::parseRequest($request);
603+
$parser = new MultipartParser();
604+
$parsedRequest = $parser->parse($request);
585605

586606
$files = $parsedRequest->getUploadedFiles();
587607

@@ -615,7 +635,8 @@ public function testInvalidUploadFileWithoutMultipleContentTypeUsesLastValue()
615635
'Content-Type' => 'multipart/form-data; boundary=' . $boundary,
616636
), $data, 1.1);
617637

618-
$parsedRequest = MultipartParser::parseRequest($request);
638+
$parser = new MultipartParser();
639+
$parsedRequest = $parser->parse($request);
619640

620641
$files = $parsedRequest->getUploadedFiles();
621642

@@ -648,7 +669,8 @@ public function testUploadEmptyFile()
648669
'Content-Type' => 'multipart/form-data; boundary=' . $boundary,
649670
), $data, 1.1);
650671

651-
$parsedRequest = MultipartParser::parseRequest($request);
672+
$parser = new MultipartParser();
673+
$parsedRequest = $parser->parse($request);
652674

653675
$files = $parsedRequest->getUploadedFiles();
654676

@@ -681,7 +703,8 @@ public function testUploadNoFile()
681703
'Content-Type' => 'multipart/form-data; boundary=' . $boundary,
682704
), $data, 1.1);
683705

684-
$parsedRequest = MultipartParser::parseRequest($request);
706+
$parser = new MultipartParser();
707+
$parsedRequest = $parser->parse($request);
685708

686709
$files = $parsedRequest->getUploadedFiles();
687710

@@ -718,7 +741,8 @@ public function testPostMaxFileSize()
718741
'Content-Type' => 'multipart/form-data; boundary=' . $boundary,
719742
), $data, 1.1);
720743

721-
$parsedRequest = MultipartParser::parseRequest($request);
744+
$parser = new MultipartParser();
745+
$parsedRequest = $parser->parse($request);
722746

723747
$files = $parsedRequest->getUploadedFiles();
724748

@@ -772,7 +796,8 @@ public function testPostMaxFileSizeIgnoredByFilesComingBeforeIt()
772796
'Content-Type' => 'multipart/form-data; boundary=' . $boundary,
773797
), $data, 1.1);
774798

775-
$parsedRequest = MultipartParser::parseRequest($request);
799+
$parser = new MultipartParser();
800+
$parsedRequest = $parser->parse($request);
776801

777802
$files = $parsedRequest->getUploadedFiles();
778803

0 commit comments

Comments
 (0)