From a2d1dfae805724203ac81cb5ff2e18eb1c9dd9e7 Mon Sep 17 00:00:00 2001 From: Marcus Xavier Date: Fri, 29 Nov 2024 23:53:07 -0300 Subject: [PATCH 1/2] ext/curl: Handle empty Content-Type response by setting content_type to false - Ensures consistent behavior when Content-Type is missing --- ext/curl/interface.c | 2 +- ext/curl/tests/bug16929.phpt | 32 ++++++++++++++++++++++++++++++++ ext/curl/tests/responder/get.inc | 3 +++ 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 ext/curl/tests/bug16929.phpt diff --git a/ext/curl/interface.c b/ext/curl/interface.c index aba5273d5496c..335d83e6e9914 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -2501,7 +2501,7 @@ PHP_FUNCTION(curl_getinfo) CAAS("content_type", s_code); } else { zval retnull; - ZVAL_NULL(&retnull); + ZVAL_FALSE(&retnull); CAAZ("content_type", &retnull); } } diff --git a/ext/curl/tests/bug16929.phpt b/ext/curl/tests/bug16929.phpt new file mode 100644 index 0000000000000..a2ef0626551cf --- /dev/null +++ b/ext/curl/tests/bug16929.phpt @@ -0,0 +1,32 @@ +--TEST-- +Bug #16929 (curl_getinfo($ch, CURLINFO_CONTENT_TYPE) returns false when Content-Type header is not set) +--EXTENSIONS-- +curl +--FILE-- + +--EXPECTF-- +bool(false) +bool(false) diff --git a/ext/curl/tests/responder/get.inc b/ext/curl/tests/responder/get.inc index c139c8c7d43a8..5304c5f37eabb 100644 --- a/ext/curl/tests/responder/get.inc +++ b/ext/curl/tests/responder/get.inc @@ -29,6 +29,9 @@ case 'contenttype': header('Content-Type: text/plain;charset=utf-8'); break; + case 'emptycontenttype': + header('Content-Type: '); + break; case 'file': if (isset($_FILES['file'])) { echo $_FILES['file']['name'] . '|' . $_FILES['file']['type'] . '|' . $_FILES['file']['size']; From 61b08841e07bc80803dc4d11e2770488fff6214f Mon Sep 17 00:00:00 2001 From: Marcus Xavier Date: Sat, 30 Nov 2024 10:18:44 -0300 Subject: [PATCH 2/2] ext/curl: always returns NULL when Content-Type is empty and there is no error --- ext/curl/interface.c | 13 ++++++++++++- ext/curl/tests/bug16929.phpt | 18 +++++++++++++++--- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 335d83e6e9914..36df07153f3bd 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -2501,7 +2501,7 @@ PHP_FUNCTION(curl_getinfo) CAAS("content_type", s_code); } else { zval retnull; - ZVAL_FALSE(&retnull); + ZVAL_NULL(&retnull); CAAZ("content_type", &retnull); } } @@ -2660,6 +2660,17 @@ PHP_FUNCTION(curl_getinfo) RETURN_FALSE; } break; + case CURLINFO_CONTENT_TYPE: { + char *s_code = NULL; + + if (curl_easy_getinfo(ch->cp, option, &s_code) == CURLE_OK && s_code) { + RETURN_STRING(s_code); + } else { + RETURN_NULL(); + } + break; + } + default: { int type = CURLINFO_TYPEMASK & option; switch (type) { diff --git a/ext/curl/tests/bug16929.phpt b/ext/curl/tests/bug16929.phpt index a2ef0626551cf..df8ed4046a288 100644 --- a/ext/curl/tests/bug16929.phpt +++ b/ext/curl/tests/bug16929.phpt @@ -10,6 +10,7 @@ $host = curl_cli_server_start(); $ch = curl_init(); $url = "{$host}/get.inc?test=emptycontenttype"; +# Validate getinfo with empty Content-Type curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, $url); curl_exec($ch); @@ -21,12 +22,23 @@ var_dump($ct); $info = curl_getinfo($ch)['content_type']; var_dump($info); - curl_close($ch); +# Validate getinfo with non-empty Content-Type +$ch = curl_init(); +$url = "{$host}/get.inc"; + +curl_setopt($ch, CURLOPT_URL, $url); +curl_setopt($ch, CURLOPT_RETURNTRANSFER, $url); +curl_exec($ch); + +var_dump(curl_getinfo($ch, CURLINFO_CONTENT_TYPE)); +var_dump(curl_getinfo($ch)['content_type']); curl_close($ch); ?> --EXPECTF-- -bool(false) -bool(false) +NULL +NULL +string(%d) "text/html; charset=UTF-8" +string(%d) "text/html; charset=UTF-8"