diff options
author | Christoph M. Becker <cmbecker69@gmx.de> | 2020-02-04 11:01:33 +0100 |
---|---|---|
committer | Christoph M. Becker <cmbecker69@gmx.de> | 2020-02-04 11:09:28 +0100 |
commit | 2d0dec91a53bddbf9f9e09d9c58188515907d650 (patch) | |
tree | 52c4e2c135a5c00e588f058e45f455b9d22e191b /ext/curl/tests | |
parent | a0c93bf65eb41ecb2c10c22294ef6ade631f42be (diff) | |
download | php-git-2d0dec91a53bddbf9f9e09d9c58188515907d650.tar.gz |
Fix #79019: Copied cURL handles upload empty file
To cater to `curl_copy_handle()` of cURL handles with attached
`CURLFile`s, we must not attach the opened stream, because the stream
may not be seekable, so that we could rewind, when the same stream is
going to be uploaded multiple times. Instead, we're opening the stream
lazily in the read callback.
Since `curl_multi_perfom()` processes easy handles asynchronously, we
have no control of the operation sequence. Since duplicated cURL
handles may be used with multi handles, we cannot use a single arg
structure, but actually have to rebuild the whole mime structure on
handle duplication and attach this to the new handle.
In order to better test this behavior, we extend the test responder to
print the size of the upload, and patch the existing tests accordingly.
Diffstat (limited to 'ext/curl/tests')
-rw-r--r-- | ext/curl/tests/bug27023.phpt | 8 | ||||
-rw-r--r-- | ext/curl/tests/bug77711.phpt | 2 | ||||
-rw-r--r-- | ext/curl/tests/curl_copy_handle_variation3.phpt | 4 | ||||
-rw-r--r-- | ext/curl/tests/curl_copy_handle_variation4.phpt | 46 | ||||
-rw-r--r-- | ext/curl/tests/curl_copy_handle_variation5.phpt | 52 | ||||
-rw-r--r-- | ext/curl/tests/curl_file_upload.phpt | 12 | ||||
-rw-r--r-- | ext/curl/tests/curl_file_upload_stream.phpt | 2 | ||||
-rw-r--r-- | ext/curl/tests/responder/get.inc | 2 |
8 files changed, 113 insertions, 15 deletions
diff --git a/ext/curl/tests/bug27023.phpt b/ext/curl/tests/bug27023.phpt index 3d649b3f73..f985c192b8 100644 --- a/ext/curl/tests/bug27023.phpt +++ b/ext/curl/tests/bug27023.phpt @@ -38,7 +38,7 @@ var_dump(curl_exec($ch)); curl_close($ch); ?> --EXPECTF-- -string(%d) "curl_testdata1.txt|application/octet-stream" -string(%d) "curl_testdata1.txt|text/plain" -string(%d) "foo.txt|application/octet-stream" -string(%d) "foo.txt|text/plain" +string(%d) "curl_testdata1.txt|application/octet-stream|6" +string(%d) "curl_testdata1.txt|text/plain|6" +string(%d) "foo.txt|application/octet-stream|6" +string(%d) "foo.txt|text/plain|6" diff --git a/ext/curl/tests/bug77711.phpt b/ext/curl/tests/bug77711.phpt index 148c26322a..8ef5e48891 100644 --- a/ext/curl/tests/bug77711.phpt +++ b/ext/curl/tests/bug77711.phpt @@ -24,7 +24,7 @@ curl_close($ch); ===DONE=== --EXPECTF-- bool(true) -string(%d) "АБВ.txt|application/octet-stream" +string(%d) "АБВ.txt|application/octet-stream|5" ===DONE=== --CLEAN-- <?php diff --git a/ext/curl/tests/curl_copy_handle_variation3.phpt b/ext/curl/tests/curl_copy_handle_variation3.phpt index 18f35f71b1..32946bb4df 100644 --- a/ext/curl/tests/curl_copy_handle_variation3.phpt +++ b/ext/curl/tests/curl_copy_handle_variation3.phpt @@ -29,8 +29,8 @@ curl_close($ch2); ===DONE=== --EXPECTF-- bool(true) -string(%d) "АБВ.txt|application/octet-stream" -string(%d) "АБВ.txt|application/octet-stream" +string(%d) "АБВ.txt|application/octet-stream|5" +string(%d) "АБВ.txt|application/octet-stream|5" ===DONE=== --CLEAN-- <?php diff --git a/ext/curl/tests/curl_copy_handle_variation4.phpt b/ext/curl/tests/curl_copy_handle_variation4.phpt new file mode 100644 index 0000000000..e160c06c64 --- /dev/null +++ b/ext/curl/tests/curl_copy_handle_variation4.phpt @@ -0,0 +1,46 @@ +--TEST-- +curl_copy_handle() allows to post CURLFile multiple times with curl_multi_exec() +--SKIPIF-- +<?php include 'skipif.inc'; ?> +--FILE-- +<?php +include 'server.inc'; +$host = curl_cli_server_start(); + +$ch1 = curl_init(); +curl_setopt($ch1, CURLOPT_SAFE_UPLOAD, 1); +curl_setopt($ch1, CURLOPT_URL, "{$host}/get.php?test=file"); +// curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1); + +$filename = __DIR__ . '/АБВ.txt'; +file_put_contents($filename, "Test."); +$file = curl_file_create($filename); +$params = array('file' => $file); +var_dump(curl_setopt($ch1, CURLOPT_POSTFIELDS, $params)); + +$ch2 = curl_copy_handle($ch1); +$ch3 = curl_copy_handle($ch1); + +$mh = curl_multi_init(); +curl_multi_add_handle($mh, $ch1); +curl_multi_add_handle($mh, $ch2); +do { + $status = curl_multi_exec($mh, $active); + if ($active) { + curl_multi_select($mh); + } +} while ($active && $status == CURLM_OK); + +curl_multi_remove_handle($mh, $ch1); +curl_multi_remove_handle($mh, $ch2); +curl_multi_remove_handle($mh, $ch3); +curl_multi_close($mh); +?> +===DONE=== +--EXPECTF-- +bool(true) +АБВ.txt|application/octet-stream|5АБВ.txt|application/octet-stream|5===DONE=== +--CLEAN-- +<?php +@unlink(__DIR__ . '/АБВ.txt'); +?> diff --git a/ext/curl/tests/curl_copy_handle_variation5.phpt b/ext/curl/tests/curl_copy_handle_variation5.phpt new file mode 100644 index 0000000000..019704e6c8 --- /dev/null +++ b/ext/curl/tests/curl_copy_handle_variation5.phpt @@ -0,0 +1,52 @@ +--TEST-- +curl_copy_handle() allows to post CURLFile multiple times if postfields change +--SKIPIF-- +<?php include 'skipif.inc'; ?> +--FILE-- +<?php +include 'server.inc'; +$host = curl_cli_server_start(); + +$ch1 = curl_init(); +curl_setopt($ch1, CURLOPT_SAFE_UPLOAD, 1); +curl_setopt($ch1, CURLOPT_URL, "{$host}/get.php?test=file"); +curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1); + +$filename = __DIR__ . '/abc.txt'; +file_put_contents($filename, "Test."); +$file = curl_file_create($filename); +$params = array('file' => $file); +var_dump(curl_setopt($ch1, CURLOPT_POSTFIELDS, $params)); + +$ch2 = curl_copy_handle($ch1); + +$filename = __DIR__ . '/def.txt'; +file_put_contents($filename, "Other test."); +$file = curl_file_create($filename); +$params = array('file' => $file); +var_dump(curl_setopt($ch2, CURLOPT_POSTFIELDS, $params)); + +$ch3 = curl_copy_handle($ch2); + +var_dump(curl_exec($ch1)); +curl_close($ch1); + +var_dump(curl_exec($ch2)); +curl_close($ch2); + +var_dump(curl_exec($ch3)); +curl_close($ch3); +?> +===DONE=== +--EXPECTF-- +bool(true) +bool(true) +string(%d) "abc.txt|application/octet-stream|5" +string(%d) "def.txt|application/octet-stream|11" +string(%d) "def.txt|application/octet-stream|11" +===DONE=== +--CLEAN-- +<?php +@unlink(__DIR__ . '/abc.txt'); +@unlink(__DIR__ . '/def.txt'); +?> diff --git a/ext/curl/tests/curl_file_upload.phpt b/ext/curl/tests/curl_file_upload.phpt index 73a2f363fb..1626f8117c 100644 --- a/ext/curl/tests/curl_file_upload.phpt +++ b/ext/curl/tests/curl_file_upload.phpt @@ -60,15 +60,15 @@ var_dump(curl_exec($ch)); curl_close($ch); ?> --EXPECTF-- -string(%d) "curl_testdata1.txt|application/octet-stream" -string(%d) "curl_testdata1.txt|text/plain" -string(%d) "foo.txt|application/octet-stream" -string(%d) "foo.txt|text/plain" +string(%d) "curl_testdata1.txt|application/octet-stream|6" +string(%d) "curl_testdata1.txt|text/plain|6" +string(%d) "foo.txt|application/octet-stream|6" +string(%d) "foo.txt|text/plain|6" string(%d) "text/plain" string(%d) "%s/curl_testdata1.txt" -string(%d) "curl_testdata1.txt|text/plain" +string(%d) "curl_testdata1.txt|text/plain|6" string(%d) "foo.txt" -string(%d) "foo.txt|application/octet-stream" +string(%d) "foo.txt|application/octet-stream|6" Warning: curl_setopt(): Disabling safe uploads is no longer supported in %s on line %d string(0) "" diff --git a/ext/curl/tests/curl_file_upload_stream.phpt b/ext/curl/tests/curl_file_upload_stream.phpt index 03c85b4b82..949cccbc31 100644 --- a/ext/curl/tests/curl_file_upload_stream.phpt +++ b/ext/curl/tests/curl_file_upload_stream.phpt @@ -24,5 +24,5 @@ curl_close($ch); ===DONE=== --EXPECT-- bool(true) -string(21) "i-love-php|text/plain" +string(24) "i-love-php|text/plain|11" ===DONE=== diff --git a/ext/curl/tests/responder/get.inc b/ext/curl/tests/responder/get.inc index f9269745f6..64ab267d50 100644 --- a/ext/curl/tests/responder/get.inc +++ b/ext/curl/tests/responder/get.inc @@ -28,7 +28,7 @@ break; case 'file': if (isset($_FILES['file'])) { - echo $_FILES['file']['name'] . '|' . $_FILES['file']['type']; + echo $_FILES['file']['name'] . '|' . $_FILES['file']['type'] . '|' . $_FILES['file']['size']; } break; case 'method': |