[php-src] Issue #8165: curl: Cannot stream request using CURLOPT_READFUNCTION without chunked encoding
| From: | SiebelsTim | Date: | Wed, 02 Mar 2022 10:59:18 +0000 |
| Subject: | [php-src] Issue #8165: curl: Cannot stream request using CURLOPT_READFUNCTION without chunked encoding | ||
| Groups: | php.bugs | ||
| Request: | Send a blank email to php-bugs+get-240105@lists.php.net to get a copy of this message | ||
Issue: https://github.com/php/php-src/issues/8165
Author: SiebelsTim
### Description
Consider this curl code in C:
```
int counter = 0;
size_t read_callback(char *ptr, size_t size, size_t nmemb, void *userdata)
{
if (counter++ == 1) {
return 0;
}
ptr[0] = 'W';
ptr[1] = 'H';
ptr[2] = 'A';
ptr[3] = 'T';
return 4;
}
int main() {
CURL* handle = curl_easy_init();
CURLcode res;
curl_easy_setopt(handle, CURLOPT_URL, "http://localhost:9090");
curl_easy_setopt(handle, CURLOPT_READFUNCTION, read_callback);
curl_easy_setopt(handle, CURLOPT_POST, 1);
curl_easy_setopt(handle, CURLOPT_POSTFIELDSIZE, 4);
res = curl_easy_perform(handle);
curl_easy_cleanup(handle);
return 0;
}
```
That results in the following HTTP request
```
POST / HTTP/1.1
Host: localhost:9090
Accept: */*
Content-Length: 4
Content-Type: application/x-www-form-urlencoded
WHAT
```
When removing the
CURLOPT_POSTFIELDSIZE options, the following request is issued:
```
POST /iserv/helloworld HTTP/1.1
Host: localhost:982
Accept: */*
Transfer-Encoding: chunked
Content-Type: application/x-www-form-urlencoded
Expect: 100-continue
WHAT
```
That is analogous to its PHP implementation:
```
$counter = 0;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://localhost:9090');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_READFUNCTION, static function ($ch, $fd, $length) use (&$counter) {
if ($counter++ > 0) {
return "";
}
return "WHAT";
});
$output = curl_exec($ch);
curl_close($ch);
````
However, PHP does not expose the constant CURLOPT_POSTFIELDSIZE, i.e. I have no option
to tell curl the length of the request. As a result, I cannot stream a request body using
CURLOPT_READFUNCTION without chunked encoding.
### PHP Version
8.0.12
### Operating System
Ubuntu 21.10