Cannot stream request using CURLOPT_READFUNCTION without chunked encoding
Nessuno ha ancora preso questa issue.
- Lingua principale
- C
- Stelle
- 40.4k
- Fork
- 8.1k
- Merge medio
- 2g 13h
- PR unite (30g)
- 96
Descrizione
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
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia dalla gestione delle opzioni curl di PHP per CURLOPT_READFUNCTION e dal binding mancante di CURLOPT_POSTFIELDSIZE, quindi confronta questi punti di ingresso con le opzioni corrispondenti di libcurl. Riproduci la richiesta mostrata nell'issue e verifica che un body trasmesso in streaming possa fornire la propria lunghezza senza usare chunked encoding.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- c, php
- Ambito
- networking
- Tipo di issue
- Funzionalità
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 35/100