[php-src] Issue #8165: curl: Cannot stream request using CURLOPT_READFUNCTION without chunked encoding

From: 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

« previous php.bugs (#240105) next »