mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00
ext/curl: CURLOPT_FOLLOWLOCATION option handling.
it had been considered as boolean for years but since 8.13, it can accept values beyond 1L, respectively CURLFOLLOW_OBEYCODE and CURLFOLLOW_FIRSTONLY. close GH-18444
This commit is contained in:
parent
82e09db0e9
commit
ad65698a48
6 changed files with 84 additions and 6 deletions
4
NEWS
4
NEWS
|
@ -15,6 +15,10 @@ PHP NEWS
|
||||||
. Fixed GH-17956 - development server 404 page does not adapt to mobiles.
|
. Fixed GH-17956 - development server 404 page does not adapt to mobiles.
|
||||||
(pascalchevrel)
|
(pascalchevrel)
|
||||||
|
|
||||||
|
- CURL:
|
||||||
|
. Added CURLFOLLOW_ALL, CURLFOLLOW_OBEYCODE and CURLFOLLOW_FIRSTONLY
|
||||||
|
values for CURLOPT_FOLLOLOCATION curl_easy_setopt option. (David Carlier)
|
||||||
|
|
||||||
- COM:
|
- COM:
|
||||||
. Fixed property access of PHP objects wrapped in variant. (cmb)
|
. Fixed property access of PHP objects wrapped in variant. (cmb)
|
||||||
. Fixed method calls for PHP objects wrapped in variant. (cmb)
|
. Fixed method calls for PHP objects wrapped in variant. (cmb)
|
||||||
|
|
15
UPGRADING
15
UPGRADING
|
@ -159,6 +159,13 @@ PHP 8.5 UPGRADE NOTES
|
||||||
CURLOPT_INFILESIZE only accepts a 32-bit signed integer as the file
|
CURLOPT_INFILESIZE only accepts a 32-bit signed integer as the file
|
||||||
size (2.0 GiB) even on 64-bit systems. CURLOPT_INFILESIZE_LARGE
|
size (2.0 GiB) even on 64-bit systems. CURLOPT_INFILESIZE_LARGE
|
||||||
accepts the largest integer value the system can handle.
|
accepts the largest integer value the system can handle.
|
||||||
|
. Added CURLFOLLOW_OBEYCODE, CURLFOLLOW_FIRSTONLY and CURLFOLLOW_ALL values for
|
||||||
|
CURLOPT_FOLLOWLOCATION curl_easy_setopt option.
|
||||||
|
CURLFOLLOW_OBEYCODE to follow more strictly in regard of redirect
|
||||||
|
if they are allowed. CURLFOLLOW_FIRSTONLY to follow only the
|
||||||
|
first redirect thus if there any follow up redirect, it won't go
|
||||||
|
any further. CURLFOLLOW_ALL is equivalent to set CURLOPT_FOLLOWLOCATION
|
||||||
|
to true.
|
||||||
|
|
||||||
- DOM:
|
- DOM:
|
||||||
. Added Dom\Element::$outerHTML.
|
. Added Dom\Element::$outerHTML.
|
||||||
|
@ -361,6 +368,11 @@ PHP 8.5 UPGRADE NOTES
|
||||||
9. Other Changes to Extensions
|
9. Other Changes to Extensions
|
||||||
========================================
|
========================================
|
||||||
|
|
||||||
|
- Curl:
|
||||||
|
. curl_easy_setopt with CURLOPT_FOLLOWLOCATION option's value no longer
|
||||||
|
is treated as boolean but integer to handle CURLFOLLOW_OBEYCODE and
|
||||||
|
CURLFOLLOW_FIRSTONLY.
|
||||||
|
|
||||||
- Fileinfo:
|
- Fileinfo:
|
||||||
. Upgraded to file 5.46.
|
. Upgraded to file 5.46.
|
||||||
. The return type of finfo_close() has been changed to true, rather
|
. The return type of finfo_close() has been changed to true, rather
|
||||||
|
@ -387,6 +399,9 @@ PHP 8.5 UPGRADE NOTES
|
||||||
. CURLINFO_HTTPAUTH_USED.
|
. CURLINFO_HTTPAUTH_USED.
|
||||||
. CURLINFO_PROXYAUTH_USED.
|
. CURLINFO_PROXYAUTH_USED.
|
||||||
. CURLOPT_INFILESIZE_LARGE.
|
. CURLOPT_INFILESIZE_LARGE.
|
||||||
|
. CURLFOLLOW_ALL.
|
||||||
|
. CURLFOLLOW_OBEYCODE.
|
||||||
|
. CURLFOLLOW_FIRSTONLY.
|
||||||
|
|
||||||
- Intl:
|
- Intl:
|
||||||
. DECIMAL_COMPACT_SHORT.
|
. DECIMAL_COMPACT_SHORT.
|
||||||
|
|
|
@ -497,6 +497,24 @@ const CURLOPT_XFERINFOFUNCTION = UNKNOWN;
|
||||||
*/
|
*/
|
||||||
const CURLOPT_DEBUGFUNCTION = UNKNOWN;
|
const CURLOPT_DEBUGFUNCTION = UNKNOWN;
|
||||||
|
|
||||||
|
#if LIBCURL_VERSION_NUM >= 0x080d00 /* Available since 8.13.0 */
|
||||||
|
/**
|
||||||
|
* @var int
|
||||||
|
* @cvalue CURLFOLLOW_ALL
|
||||||
|
*/
|
||||||
|
const CURLFOLLOW_ALL = UNKNOWN;
|
||||||
|
/**
|
||||||
|
* @var int
|
||||||
|
* @cvalue CURLFOLLOW_OBEYCODE
|
||||||
|
*/
|
||||||
|
const CURLFOLLOW_OBEYCODE = UNKNOWN;
|
||||||
|
/**
|
||||||
|
* @var int
|
||||||
|
* @cvalue CURLFOLLOW_FIRSTONLY
|
||||||
|
*/
|
||||||
|
const CURLFOLLOW_FIRSTONLY = UNKNOWN;
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var int
|
* @var int
|
||||||
* @cvalue CURLINFO_TEXT
|
* @cvalue CURLINFO_TEXT
|
||||||
|
|
11
ext/curl/curl_arginfo.h
generated
11
ext/curl/curl_arginfo.h
generated
|
@ -1,5 +1,5 @@
|
||||||
/* This is a generated file, edit the .stub.php file instead.
|
/* This is a generated file, edit the .stub.php file instead.
|
||||||
* Stub hash: 77da3a34f08b3e932a0545f72b41bf0353e8b157 */
|
* Stub hash: 792cdfa8a8ce190d73dffe679c51a41a2ee46cd7 */
|
||||||
|
|
||||||
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_close, 0, 1, IS_VOID, 0)
|
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_close, 0, 1, IS_VOID, 0)
|
||||||
ZEND_ARG_OBJ_INFO(0, handle, CurlHandle, 0)
|
ZEND_ARG_OBJ_INFO(0, handle, CurlHandle, 0)
|
||||||
|
@ -326,6 +326,15 @@ static void register_curl_symbols(int module_number)
|
||||||
REGISTER_LONG_CONSTANT("CURLOPT_WRITEHEADER", CURLOPT_WRITEHEADER, CONST_PERSISTENT);
|
REGISTER_LONG_CONSTANT("CURLOPT_WRITEHEADER", CURLOPT_WRITEHEADER, CONST_PERSISTENT);
|
||||||
REGISTER_LONG_CONSTANT("CURLOPT_XFERINFOFUNCTION", CURLOPT_XFERINFOFUNCTION, CONST_PERSISTENT);
|
REGISTER_LONG_CONSTANT("CURLOPT_XFERINFOFUNCTION", CURLOPT_XFERINFOFUNCTION, CONST_PERSISTENT);
|
||||||
REGISTER_LONG_CONSTANT("CURLOPT_DEBUGFUNCTION", CURLOPT_DEBUGFUNCTION, CONST_PERSISTENT);
|
REGISTER_LONG_CONSTANT("CURLOPT_DEBUGFUNCTION", CURLOPT_DEBUGFUNCTION, CONST_PERSISTENT);
|
||||||
|
#if LIBCURL_VERSION_NUM >= 0x080d00 /* Available since 8.13.0 */
|
||||||
|
REGISTER_LONG_CONSTANT("CURLFOLLOW_ALL", CURLFOLLOW_ALL, CONST_PERSISTENT);
|
||||||
|
#endif
|
||||||
|
#if LIBCURL_VERSION_NUM >= 0x080d00 /* Available since 8.13.0 */
|
||||||
|
REGISTER_LONG_CONSTANT("CURLFOLLOW_OBEYCODE", CURLFOLLOW_OBEYCODE, CONST_PERSISTENT);
|
||||||
|
#endif
|
||||||
|
#if LIBCURL_VERSION_NUM >= 0x080d00 /* Available since 8.13.0 */
|
||||||
|
REGISTER_LONG_CONSTANT("CURLFOLLOW_FIRSTONLY", CURLFOLLOW_FIRSTONLY, CONST_PERSISTENT);
|
||||||
|
#endif
|
||||||
REGISTER_LONG_CONSTANT("CURLINFO_TEXT", CURLINFO_TEXT, CONST_PERSISTENT);
|
REGISTER_LONG_CONSTANT("CURLINFO_TEXT", CURLINFO_TEXT, CONST_PERSISTENT);
|
||||||
REGISTER_LONG_CONSTANT("CURLINFO_HEADER_IN", CURLINFO_HEADER_IN, CONST_PERSISTENT);
|
REGISTER_LONG_CONSTANT("CURLINFO_HEADER_IN", CURLINFO_HEADER_IN, CONST_PERSISTENT);
|
||||||
REGISTER_LONG_CONSTANT("CURLINFO_DATA_IN", CURLINFO_DATA_IN, CONST_PERSISTENT);
|
REGISTER_LONG_CONSTANT("CURLINFO_DATA_IN", CURLINFO_DATA_IN, CONST_PERSISTENT);
|
||||||
|
|
|
@ -1863,6 +1863,7 @@ static zend_result _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue
|
||||||
#if LIBCURL_VERSION_NUM >= 0x080900 /* Available since 8.9.0 */
|
#if LIBCURL_VERSION_NUM >= 0x080900 /* Available since 8.9.0 */
|
||||||
case CURLOPT_TCP_KEEPCNT:
|
case CURLOPT_TCP_KEEPCNT:
|
||||||
#endif
|
#endif
|
||||||
|
case CURLOPT_FOLLOWLOCATION:
|
||||||
lval = zval_get_long(zvalue);
|
lval = zval_get_long(zvalue);
|
||||||
if ((option == CURLOPT_PROTOCOLS || option == CURLOPT_REDIR_PROTOCOLS) &&
|
if ((option == CURLOPT_PROTOCOLS || option == CURLOPT_REDIR_PROTOCOLS) &&
|
||||||
(PG(open_basedir) && *PG(open_basedir)) && (lval & CURLPROTO_FILE)) {
|
(PG(open_basedir) && *PG(open_basedir)) && (lval & CURLPROTO_FILE)) {
|
||||||
|
@ -2210,11 +2211,6 @@ static zend_result _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue
|
||||||
/* Do nothing, just backward compatibility */
|
/* Do nothing, just backward compatibility */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CURLOPT_FOLLOWLOCATION:
|
|
||||||
lval = zend_is_true(zvalue);
|
|
||||||
error = curl_easy_setopt(ch->cp, option, lval);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CURLOPT_POSTFIELDS:
|
case CURLOPT_POSTFIELDS:
|
||||||
if (Z_TYPE_P(zvalue) == IS_ARRAY) {
|
if (Z_TYPE_P(zvalue) == IS_ARRAY) {
|
||||||
if (zend_hash_num_elements(Z_ARRVAL_P(zvalue)) == 0) {
|
if (zend_hash_num_elements(Z_ARRVAL_P(zvalue)) == 0) {
|
||||||
|
|
36
ext/curl/tests/curl_setopt_CURLOPT_FOLLOWLOCATION.phpt
Normal file
36
ext/curl/tests/curl_setopt_CURLOPT_FOLLOWLOCATION.phpt
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
--TEST--
|
||||||
|
CURLOPT_FOLLOWLOCATION values
|
||||||
|
--EXTENSIONS--
|
||||||
|
curl
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
include 'skipif-nocaddy.inc';
|
||||||
|
if (curl_version()['version_number'] < 0x080d00) die('skip requires curl >= 8.13.0');
|
||||||
|
?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
|
||||||
|
foreach ([
|
||||||
|
0,
|
||||||
|
CURLFOLLOW_ALL,
|
||||||
|
CURLFOLLOW_OBEYCODE,
|
||||||
|
CURLFOLLOW_FIRSTONLY
|
||||||
|
] as $follow) {
|
||||||
|
$ch = curl_init();
|
||||||
|
curl_setopt($ch,CURLOPT_URL, "https://localhost/redirect");
|
||||||
|
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
|
||||||
|
var_dump(curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $follow));
|
||||||
|
var_dump(curl_exec($ch));
|
||||||
|
curl_close($ch);
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
--EXPECTF--
|
||||||
|
bool(true)
|
||||||
|
string(%d) "%s"
|
||||||
|
bool(true)
|
||||||
|
string(%d) "%s"
|
||||||
|
bool(true)
|
||||||
|
string(%d) "%s"
|
||||||
|
bool(true)
|
||||||
|
string(%d) "%s"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue