From 85b5dc4711f6ce8b979ed60e3b60cf93225be32a Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 7 Sep 2020 11:12:41 +0200 Subject: [PATCH] Private/public split curl header To allow exporting the php_curl.h header containing curl class entries, split off a separate curl_private.h header with all the implementation details. We may move or expose additional APIs in php_curl.h on an as-needed basis. --- ext/curl/config.m4 | 1 + ext/curl/config.w32 | 1 + ext/curl/curl_file.c | 2 +- ext/curl/curl_private.h | 159 ++++++++++++++++++++++++++++++++++++++++ ext/curl/interface.c | 2 +- ext/curl/multi.c | 5 +- ext/curl/php_curl.h | 139 +---------------------------------- ext/curl/share.c | 2 +- 8 files changed, 168 insertions(+), 143 deletions(-) create mode 100644 ext/curl/curl_private.h diff --git a/ext/curl/config.m4 b/ext/curl/config.m4 index 051d97743b6..3b11739654b 100644 --- a/ext/curl/config.m4 +++ b/ext/curl/config.m4 @@ -82,5 +82,6 @@ int main(int argc, char *argv[]) ]) PHP_NEW_EXTENSION(curl, interface.c multi.c share.c curl_file.c, $ext_shared) + PHP_INSTALL_HEADERS([ext/curl], [php_curl.h]) PHP_SUBST(CURL_SHARED_LIBADD) fi diff --git a/ext/curl/config.w32 b/ext/curl/config.w32 index 8ff6718b606..9402e5b3ec8 100644 --- a/ext/curl/config.w32 +++ b/ext/curl/config.w32 @@ -29,6 +29,7 @@ if (PHP_CURL != "no") { EXTENSION("curl", "interface.c multi.c share.c curl_file.c"); AC_DEFINE('HAVE_CURL', 1, 'Have cURL library'); ADD_FLAG("CFLAGS_CURL", "/D CURL_STATICLIB"); + PHP_INSTALL_HEADERS("ext/curl", "php_curl.h"); // TODO: check for curl_version_info } else { WARNING("curl not enabled; libraries and headers not found"); diff --git a/ext/curl/curl_file.c b/ext/curl/curl_file.c index 3888840fd16..aad162604a1 100644 --- a/ext/curl/curl_file.c +++ b/ext/curl/curl_file.c @@ -21,7 +21,7 @@ #include "php.h" #include "Zend/zend_exceptions.h" #include "Zend/zend_interfaces.h" -#include "php_curl.h" +#include "curl_private.h" #include "curl_file_arginfo.h" PHP_CURL_API zend_class_entry *curl_CURLFile_class; diff --git a/ext/curl/curl_private.h b/ext/curl/curl_private.h new file mode 100644 index 00000000000..8ff0aef605c --- /dev/null +++ b/ext/curl/curl_private.h @@ -0,0 +1,159 @@ +/* + +----------------------------------------------------------------------+ + | Copyright (c) The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Author: Sterling Hughes | + | Wez Furlong | + +----------------------------------------------------------------------+ +*/ + +#ifndef _PHP_CURL_PRIVATE_H +#define _PHP_CURL_PRIVATE_H + +#include "php_curl.h" + +#define PHP_CURL_DEBUG 0 + +#include "php_version.h" +#define PHP_CURL_VERSION PHP_VERSION + +#include +#include + +#define CURLOPT_RETURNTRANSFER 19913 +#define CURLOPT_BINARYTRANSFER 19914 /* For Backward compatibility */ +#define PHP_CURL_STDOUT 0 +#define PHP_CURL_FILE 1 +#define PHP_CURL_USER 2 +#define PHP_CURL_DIRECT 3 +#define PHP_CURL_RETURN 4 +#define PHP_CURL_IGNORE 7 + +#define SAVE_CURL_ERROR(__handle, __err) \ + do { (__handle)->err.no = (int) __err; } while (0) + +PHP_MINIT_FUNCTION(curl); +PHP_MSHUTDOWN_FUNCTION(curl); +PHP_MINFO_FUNCTION(curl); + +typedef struct { + zval func_name; + zend_fcall_info_cache fci_cache; + FILE *fp; + smart_str buf; + int method; + zval stream; +} php_curl_write; + +typedef struct { + zval func_name; + zend_fcall_info_cache fci_cache; + FILE *fp; + zend_resource *res; + int method; + zval stream; +} php_curl_read; + +typedef struct { + zval func_name; + zend_fcall_info_cache fci_cache; + int method; +} php_curl_progress, php_curl_fnmatch, php_curlm_server_push; + +typedef struct { + php_curl_write *write; + php_curl_write *write_header; + php_curl_read *read; + zval std_err; + php_curl_progress *progress; +#if LIBCURL_VERSION_NUM >= 0x071500 /* Available since 7.21.0 */ + php_curl_fnmatch *fnmatch; +#endif +} php_curl_handlers; + +struct _php_curl_error { + char str[CURL_ERROR_SIZE + 1]; + int no; +}; + +struct _php_curl_send_headers { + zend_string *str; +}; + +struct _php_curl_free { + zend_llist str; + zend_llist post; + zend_llist stream; + HashTable *slist; +}; + +typedef struct { + CURL *cp; + php_curl_handlers *handlers; + struct _php_curl_free *to_free; + struct _php_curl_send_headers header; + struct _php_curl_error err; + zend_bool in_callback; + uint32_t* clone; + zval postfields; + zend_object std; +} php_curl; + +#define CURLOPT_SAFE_UPLOAD -1 + +typedef struct { + php_curlm_server_push *server_push; +} php_curlm_handlers; + +typedef struct { + int still_running; + CURLM *multi; + zend_llist easyh; + php_curlm_handlers *handlers; + struct { + int no; + } err; + zend_object std; +} php_curlm; + +typedef struct { + CURLSH *share; + struct { + int no; + } err; + zend_object std; +} php_curlsh; + +php_curl *init_curl_handle_into_zval(zval *curl); +void init_curl_handle(php_curl *ch); +void _php_curl_cleanup_handle(php_curl *); +void _php_curl_multi_cleanup_list(void *data); +void _php_curl_verify_handlers(php_curl *ch, int reporterror); +void _php_setup_easy_copy_handlers(php_curl *ch, php_curl *source); + +static inline php_curl *curl_from_obj(zend_object *obj) { + return (php_curl *)((char *)(obj) - XtOffsetOf(php_curl, std)); +} + +#define Z_CURL_P(zv) curl_from_obj(Z_OBJ_P(zv)) + +static inline php_curlsh *curl_share_from_obj(zend_object *obj) { + return (php_curlsh *)((char *)(obj) - XtOffsetOf(php_curlsh, std)); +} + +#define Z_CURL_SHARE_P(zv) curl_share_from_obj(Z_OBJ_P(zv)) + +void curl_multi_register_class(const zend_function_entry *method_entries); +void curl_share_register_class(const zend_function_entry *method_entries); +void curlfile_register_class(void); +int curl_cast_object(zend_object *obj, zval *result, int type); + +#endif /* _PHP_CURL_PRIVATE_H */ diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 906b1c4a0b6..09e02b3ba52 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -60,7 +60,7 @@ #include "ext/standard/info.h" #include "ext/standard/file.h" #include "ext/standard/url.h" -#include "php_curl.h" +#include "curl_private.h" #include "curl_arginfo.h" #ifdef PHP_CURL_NEED_OPENSSL_TSL /* {{{ */ diff --git a/ext/curl/multi.c b/ext/curl/multi.c index 954575d54f9..2c2e37e4028 100644 --- a/ext/curl/multi.c +++ b/ext/curl/multi.c @@ -22,8 +22,9 @@ #include "php.h" #include "Zend/zend_interfaces.h" +#include "Zend/zend_smart_str.h" -#include "php_curl.h" +#include "curl_private.h" #include #include @@ -48,7 +49,7 @@ /* CurlMultiHandle class */ -static zend_class_entry *curl_multi_ce; +zend_class_entry *curl_multi_ce; static inline php_curlm *curl_multi_from_obj(zend_object *obj) { return (php_curlm *)((char *)(obj) - XtOffsetOf(php_curlm, std)); diff --git a/ext/curl/php_curl.h b/ext/curl/php_curl.h index 2a195b082ba..ebb56278aa2 100644 --- a/ext/curl/php_curl.h +++ b/ext/curl/php_curl.h @@ -19,9 +19,6 @@ #define _PHP_CURL_H #include "php.h" -#include "zend_smart_str.h" - -#define PHP_CURL_DEBUG 0 #ifdef PHP_WIN32 # define PHP_CURL_API __declspec(dllexport) @@ -31,146 +28,12 @@ # define PHP_CURL_API #endif -#include "php_version.h" -#define PHP_CURL_VERSION PHP_VERSION - -#include -#include - extern zend_module_entry curl_module_entry; #define phpext_curl_ptr &curl_module_entry -#define CURLOPT_RETURNTRANSFER 19913 -#define CURLOPT_BINARYTRANSFER 19914 /* For Backward compatibility */ -#define PHP_CURL_STDOUT 0 -#define PHP_CURL_FILE 1 -#define PHP_CURL_USER 2 -#define PHP_CURL_DIRECT 3 -#define PHP_CURL_RETURN 4 -#define PHP_CURL_IGNORE 7 - -#define SAVE_CURL_ERROR(__handle, __err) \ - do { (__handle)->err.no = (int) __err; } while (0) - -PHP_MINIT_FUNCTION(curl); -PHP_MSHUTDOWN_FUNCTION(curl); -PHP_MINFO_FUNCTION(curl); - -typedef struct { - zval func_name; - zend_fcall_info_cache fci_cache; - FILE *fp; - smart_str buf; - int method; - zval stream; -} php_curl_write; - -typedef struct { - zval func_name; - zend_fcall_info_cache fci_cache; - FILE *fp; - zend_resource *res; - int method; - zval stream; -} php_curl_read; - -typedef struct { - zval func_name; - zend_fcall_info_cache fci_cache; - int method; -} php_curl_progress, php_curl_fnmatch, php_curlm_server_push; - -typedef struct { - php_curl_write *write; - php_curl_write *write_header; - php_curl_read *read; - zval std_err; - php_curl_progress *progress; -#if LIBCURL_VERSION_NUM >= 0x071500 /* Available since 7.21.0 */ - php_curl_fnmatch *fnmatch; -#endif -} php_curl_handlers; - -struct _php_curl_error { - char str[CURL_ERROR_SIZE + 1]; - int no; -}; - -struct _php_curl_send_headers { - zend_string *str; -}; - -struct _php_curl_free { - zend_llist str; - zend_llist post; - zend_llist stream; - HashTable *slist; -}; - -typedef struct { - CURL *cp; - php_curl_handlers *handlers; - struct _php_curl_free *to_free; - struct _php_curl_send_headers header; - struct _php_curl_error err; - zend_bool in_callback; - uint32_t* clone; - zval postfields; - zend_object std; -} php_curl; - -#define CURLOPT_SAFE_UPLOAD -1 - -typedef struct { - php_curlm_server_push *server_push; -} php_curlm_handlers; - -typedef struct { - int still_running; - CURLM *multi; - zend_llist easyh; - php_curlm_handlers *handlers; - struct { - int no; - } err; - zend_object std; -} php_curlm; - -typedef struct { - CURLSH *share; - struct { - int no; - } err; - zend_object std; -} php_curlsh; - -php_curl *init_curl_handle_into_zval(zval *curl); -void init_curl_handle(php_curl *ch); -void _php_curl_cleanup_handle(php_curl *); -void _php_curl_multi_cleanup_list(void *data); -void _php_curl_verify_handlers(php_curl *ch, int reporterror); -void _php_setup_easy_copy_handlers(php_curl *ch, php_curl *source); - -static inline php_curl *curl_from_obj(zend_object *obj) { - return (php_curl *)((char *)(obj) - XtOffsetOf(php_curl, std)); -} - -#define Z_CURL_P(zv) curl_from_obj(Z_OBJ_P(zv)) - -static inline php_curlsh *curl_share_from_obj(zend_object *obj) { - return (php_curlsh *)((char *)(obj) - XtOffsetOf(php_curlsh, std)); -} - -#define Z_CURL_SHARE_P(zv) curl_share_from_obj(Z_OBJ_P(zv)) - PHP_CURL_API extern zend_class_entry *curl_ce; PHP_CURL_API extern zend_class_entry *curl_share_ce; - -void curl_multi_register_class(const zend_function_entry *method_entries); -void curl_share_register_class(const zend_function_entry *method_entries); -void curlfile_register_class(void); -int curl_cast_object(zend_object *obj, zval *result, int type); - +PHP_CURL_API extern zend_class_entry *curl_multi_ce; PHP_CURL_API extern zend_class_entry *curl_CURLFile_class; #endif /* _PHP_CURL_H */ diff --git a/ext/curl/share.c b/ext/curl/share.c index d7eb7be56a2..58135acdb56 100644 --- a/ext/curl/share.c +++ b/ext/curl/share.c @@ -23,7 +23,7 @@ #include "php.h" #include "Zend/zend_interfaces.h" -#include "php_curl.h" +#include "curl_private.h" #include