File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1111use Riverline \MultiPartParser \Part ;
1212use RuntimeException ;
1313
14- use function array_is_list ;
1514use function str_starts_with ;
1615
16+ // Polyfill for array_is_list (PHP 8.1+) to support PHP 8.0
17+ if (! function_exists ('array_is_list ' )) {
18+ function array_is_list (array $ array ): bool
19+ {
20+ $ i = 0 ;
21+ foreach ($ array as $ key => $ value ) {
22+ if ($ key !== $ i ++) {
23+ return false ;
24+ }
25+ }
26+ return true ;
27+ }
28+ }
29+
1730/**
1831 * Bridges PSR-7 requests and responses with API Gateway or ALB event/response formats.
1932 */
Original file line number Diff line number Diff line change @@ -34,7 +34,7 @@ public function test I can create a response from a PSR7 response()
3434
3535 public function test I can convert a request from an event with complex multipart form data structures ()
3636 {
37- $ body = "--complexBoundary \r\nContent-Disposition: form-data; name= \"simple_string \"\r\n\r\nHello World \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"empty_string \"\r\n\r\n\r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"numeric_string \"\r\n\r\n12345 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"boolean_string \"\r\n\r\ntrue \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"indexed_array[0] \"\r\n\r\nfirst_item \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"indexed_array[1] \"\r\n\r\nsecond_item \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"indexed_array[2] \"\r\n\r\nthird_item \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"associative_array[name] \"\r\n\r\nJohn Doe \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"associative_array[age] \"\r\n\r\n30 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"associative_array[email] \"\r\n\r\njohn@example.com \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"nested_objects[user][profile][first_name] \"\r\n\r\nJohn \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"nested_objects[user][profile][last_name] \"\r\n\r\nDoe \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"nested_objects[user][profile][age] \"\r\n\r\n30 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"nested_objects[user][settings][theme] \"\r\n\r\ndark \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"nested_objects[user][settings][notifications] \"\r\n\r\ntrue \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"nested_objects[company][name] \"\r\n\r\nAcme Corp \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"nested_objects[company][employees] \"\r\n\r\n150 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"mixed_arrays[0][id] \"\r\n\r\n1 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"mixed_arrays[0][name] \"\r\n\r\nItem One \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"mixed_arrays[0][tags][0] \"\r\n\r\ntag1 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"mixed_arrays[0][tags][1] \"\r\n\r\ntag2 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"mixed_arrays[1][id] \"\r\n\r\n2 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"mixed_arrays[1][name] \"\r\n\r\nItem Two \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"mixed_arrays[1][tags][0] \"\r\n\r\ntag3 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"mixed_arrays[1][tags][1] \"\r\n\r\ntag4 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"sparse_array[0] \"\r\n\r\nfirst \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"sparse_array[2] \"\r\n\r\nthird \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"sparse_array[5] \"\r\n\r\nsixth \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"string_keys[first_key] \"\r\n\r\nfirst_value \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"string_keys[second_key] \"\r\n\r\nsecond_value \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"numeric_keys[0] \"\r\n\r\nzero_value \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"numeric_keys[1] \"\r\n\r\none_value \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"numeric_keys[10] \"\r\n\r\nten_value \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"empty_values[empty_string] \"\r\n\r\n\r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"empty_values[zero_string] \"\r\n\r\n0 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"empty_values[false_string] \"\r\n\r\nfalse \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"empty_values[null_string] \"\r\n\r\nnull \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"complex_nesting[level1][level2][level3][items][0][name] \"\r\n\r\nDeep Item 1 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"complex_nesting[level1][level2][level3][items][0][value] \"\r\n\r\n100 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"complex_nesting[level1][level2][level3][items][1][name] \"\r\n\r\nDeep Item 2 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"complex_nesting[level1][level2][level3][items][1][value] \"\r\n\r\n200 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"complex_nesting[level1][level2][level3][metadata][count] \"\r\n\r\n2 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"complex_nesting[level1][level2][level3][metadata][enabled] \"\r\n\r\ntrue \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"duplicate_keys[0] \"\r\n\r\nfirst_duplicate \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"duplicate_keys[0] \"\r\n\r\nsecond_duplicate \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"duplicate_keys[0] \"\r\n\r\nthird_duplicate \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"special_chars[with spaces] \"\r\n\r\nvalue with spaces \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"special_chars[with-dashes] \"\r\n\r\nvalue-with-dashes \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"special_chars[with_underscores] \"\r\n\r\nvalue_with_underscores \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"special_chars[with.dots] \"\r\n\r\nvalue.with.dots \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"unicode[测试] \"\r\n\r\n测试值 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"unicode[emoji] \"\r\n\r\n🚀🌟💻 \r\n--complexBoundary-- \r\n" ;
37+ $ body = "--complexBoundary \r\nContent-Disposition: form-data; name= \"simple_string \"\r\n\r\nHello World \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"empty_string \"\r\n\r\n\r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"numeric_string \"\r\n\r\n12345 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"boolean_string \"\r\n\r\ntrue \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"indexed_array[0] \"\r\n\r\nfirst_item \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"indexed_array[1] \"\r\n\r\nsecond_item \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"indexed_array[2] \"\r\n\r\nthird_item \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"associative_array[name] \"\r\n\r\nJohn Doe \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"associative_array[age] \"\r\n\r\n30 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"associative_array[email] \"\r\n\r\njohn@example.com \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"nested_objects[user][profile][first_name] \"\r\n\r\nJohn \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"nested_objects[user][profile][last_name] \"\r\n\r\nDoe \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"nested_objects[user][profile][age] \"\r\n\r\n30 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"nested_objects[user][settings][theme] \"\r\n\r\ndark \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"nested_objects[user][settings][notifications] \"\r\n\r\ntrue \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"nested_objects[company][name] \"\r\n\r\nAcme Corp \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"nested_objects[company][employees] \"\r\n\r\n150 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"mixed_arrays[0][id] \"\r\n\r\n1 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"mixed_arrays[0][name] \"\r\n\r\nItem One \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"mixed_arrays[0][tags][0] \"\r\n\r\ntag1 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"mixed_arrays[0][tags][1] \"\r\n\r\ntag2 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"mixed_arrays[1][id] \"\r\n\r\n2 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"mixed_arrays[1][name] \"\r\n\r\nItem Two \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"mixed_arrays[1][tags][0] \"\r\n\r\ntag3 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"mixed_arrays[1][tags][1] \"\r\n\r\ntag4 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"sparse_array[0] \"\r\n\r\nfirst \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"sparse_array[2] \"\r\n\r\nthird \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"sparse_array[5] \"\r\n\r\nsixth \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"string_keys[first_key] \"\r\n\r\nfirst_value \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"string_keys[second_key] \"\r\n\r\nsecond_value \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"numeric_keys[0] \"\r\n\r\nzero_value \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"numeric_keys[1] \"\r\n\r\none_value \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"numeric_keys[10] \"\r\n\r\nten_value \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"empty_values[empty_string] \"\r\n\r\n\r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"empty_values[zero_string] \"\r\n\r\n0 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"empty_values[false_string] \"\r\n\r\nfalse \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"empty_values[null_string] \"\r\n\r\nnull \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"complex_nesting[level1][level2][level3][items][0][name] \"\r\n\r\nDeep Item 1 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"complex_nesting[level1][level2][level3][items][0][value] \"\r\n\r\n100 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"complex_nesting[level1][level2][level3][items][1][name] \"\r\n\r\nDeep Item 2 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"complex_nesting[level1][level2][level3][items][1][value] \"\r\n\r\n200 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"complex_nesting[level1][level2][level3][metadata][count] \"\r\n\r\n2 \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"complex_nesting[level1][level2][level3][metadata][enabled] \"\r\n\r\ntrue \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"duplicate_keys[0] \"\r\n\r\nfirst_duplicate \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"duplicate_keys[0] \"\r\n\r\nsecond_duplicate \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"duplicate_keys[0] \"\r\n\r\nthird_duplicate \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"special_chars[with spaces] \"\r\n\r\nvalue with spaces \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"special_chars[with-dashes] \"\r\n\r\nvalue-with-dashes \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"special_chars[with_underscores] \"\r\n\r\nvalue_with_underscores \r\n--complexBoundary \r\nContent-Disposition: form-data; name= \"special_chars[with.dots] \"\r\n\r\nvalue.with.dots \r\n--complexBoundary-- \r\n" ;
3838
3939 $ datav1 = [
4040 'version ' => '1.0 ' ,
@@ -235,10 +235,6 @@ public function test I can convert a request from an event with comple
235235 'with_underscores ' => 'value_with_underscores ' ,
236236 'with.dots ' => 'value.with.dots ' ,
237237 ],
238- 'unicode ' => [
239- '?????? ' => '测试值 ' ,
240- 'emoji ' => '🚀🌟💻 ' ,
241- ],
242238 ];
243239
244240 $ eventv1 = new HttpRequestEvent ($ datav1 );
You can’t perform that action at this time.
0 commit comments