Cannot stream request using CURLOPT_READFUNCTION without chunked encoding
Nobody has claimed this yet.
- Dominant language
- C
- Stars
- 40.4k
- Forks
- 8.1k
- Avg merge
- 2d 13h
- Merged PRs (30d)
- 96
Description
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
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with PHP's curl option handling for CURLOPT_READFUNCTION and the missing CURLOPT_POSTFIELDSIZE binding, then compare those entry points with libcurl's corresponding options. Reproduce the request shown in the issue and verify that a streamed body can provide its length without using chunked encoding.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- c, php
- Domain
- networking
- Issue type
- Feature
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100