1<?php
2/**
3 * Unit tests for HTTP_Request2 package
4 *
5 * PHP version 5
6 *
7 * LICENSE
8 *
9 * This source file is subject to BSD 3-Clause License that is bundled
10 * with this package in the file LICENSE and available at the URL
11 * https://raw.github.com/pear/HTTP_Request2/trunk/docs/LICENSE
12 *
13 * @category  HTTP
14 * @package   HTTP_Request2
15 * @author    Alexey Borzov <avb@php.net>
16 * @copyright 2008-2021 Alexey Borzov <avb@php.net>
17 * @license   http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License
18 * @link      http://pear.php.net/package/HTTP_Request2
19 */
20
21/** Sets up includes */
22require_once dirname(__DIR__) . '/TestHelper.php';
23
24use Yoast\PHPUnitPolyfills\TestCases\TestCase;
25
26/**
27 * Unit test for HTTP_Request2_MultipartBody class
28 */
29class HTTP_Request2_MultipartBodyTest extends TestCase
30{
31    public function testUploadSimple()
32    {
33        $req = new HTTP_Request2(null, HTTP_Request2::METHOD_POST);
34        $body = $req->addPostParameter('foo', 'I am a parameter')
35                    ->addUpload('upload', dirname(__DIR__) . '/_files/plaintext.txt')
36                    ->getBody();
37
38        $this->assertTrue($body instanceof HTTP_Request2_MultipartBody);
39        $asString = $body->__toString();
40        $boundary = $body->getBoundary();
41        $this->assertEquals($body->getLength(), strlen($asString));
42        $this->assertStringContainsString('This is a test.', $asString);
43        $this->assertStringContainsString('I am a parameter', $asString);
44        $this->assertMatchesRegularExpression("!--{$boundary}--\r\n$!", $asString);
45    }
46
47   public function testRequest16863()
48    {
49        $this->expectException(\HTTP_Request2_LogicException::class);
50        $req  = new HTTP_Request2(null, HTTP_Request2::METHOD_POST);
51        $fp   = fopen(dirname(__DIR__) . '/_files/plaintext.txt', 'rb');
52        $body = $req->addUpload('upload', $fp)
53                    ->getBody();
54
55        $asString = $body->__toString();
56        $this->assertStringContainsString('name="upload"; filename="anonymous.blob"', $asString);
57        $this->assertStringContainsString('This is a test.', $asString);
58
59        $req->addUpload('bad_upload', fopen('php://input', 'rb'));
60    }
61
62    public function testStreaming()
63    {
64        $req = new HTTP_Request2(null, HTTP_Request2::METHOD_POST);
65        $body = $req->addPostParameter('foo', 'I am a parameter')
66                    ->addUpload('upload', dirname(__DIR__) . '/_files/plaintext.txt')
67                    ->getBody();
68        $asString = '';
69        while ($part = $body->read(10)) {
70            $asString .= $part;
71        }
72        $this->assertEquals($body->getLength(), strlen($asString));
73        $this->assertStringContainsString('This is a test.', $asString);
74        $this->assertStringContainsString('I am a parameter', $asString);
75    }
76
77    public function testUploadArray()
78    {
79        $req = new HTTP_Request2(null, HTTP_Request2::METHOD_POST);
80        $body = $req->addUpload('upload', [
81                                    [dirname(__DIR__) . '/_files/plaintext.txt', 'bio.txt', 'text/plain'],
82                                    [fopen(dirname(__DIR__) . '/_files/empty.gif', 'rb'), 'photo.gif', 'image/gif']
83        ])
84                    ->getBody();
85        $asString = $body->__toString();
86        $this->assertStringContainsString(file_get_contents(dirname(__DIR__) . '/_files/empty.gif'), $asString);
87        $this->assertStringContainsString('name="upload[0]"; filename="bio.txt"', $asString);
88        $this->assertStringContainsString('name="upload[1]"; filename="photo.gif"', $asString);
89
90        $body2 = $req->setConfig(['use_brackets' => false])->getBody();
91        $asString = $body2->__toString();
92        $this->assertStringContainsString('name="upload"; filename="bio.txt"', $asString);
93        $this->assertStringContainsString('name="upload"; filename="photo.gif"', $asString);
94    }
95}
96?>