php / php/php-src

Cannot stream request using CURLOPT_READFUNCTION without chunked encoding

Offen
#8,165 4 Kommentare 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Extension: curl Feature Status: Verified
Vorherrschende Sprache
C
Sterne
40.4k
Forks
8.1k
Ø Merge
2 T. 13 Std.
Gemergte PRs (30 T.)
96

Beschreibung

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

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne mit PHPs curl-Optionsverarbeitung für CURLOPT_READFUNCTION und der fehlenden CURLOPT_POSTFIELDSIZE-Bindung und vergleiche diese Einstiegspunkte anschließend mit den entsprechenden Optionen von libcurl. Reproduziere die im Issue gezeigte Anfrage und verifiziere, dass ein gestreamter Body seine Länge bereitstellen kann, ohne chunked encoding zu verwenden.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
c, php
Bereich
networking
Issue-Typ
Feature
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.