Skip to content

Commit

Permalink
Refactor curl hook, support PHP-8.4
Browse files Browse the repository at this point in the history
  • Loading branch information
matyhtf committed Oct 19, 2024
1 parent 5ea581d commit 52f238f
Show file tree
Hide file tree
Showing 10 changed files with 599 additions and 1,628 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

#include "php_swoole_cxx.h"

#if defined(SW_USE_CURL) && PHP_VERSION_ID < 80400
#ifdef SW_USE_CURL
SW_EXTERN_C_BEGIN

#include <curl/curl.h>
Expand Down Expand Up @@ -34,5 +34,13 @@ PHP_FUNCTION(swoole_native_curl_multi_setopt);
PHP_FUNCTION(swoole_native_curl_multi_getcontent);
PHP_FUNCTION(swoole_native_curl_multi_info_read);
PHP_FUNCTION(swoole_native_curl_multi_init);

#if PHP_VERSION_ID >= 80400
PHP_FUNCTION(swoole_native_curl_upkeep);
PHP_FUNCTION(swoole_native_curl_version);
PHP_FUNCTION(swoole_native_curl_strerror);
PHP_FUNCTION(swoole_native_curl_multi_strerror);
#endif

SW_EXTERN_C_END
#endif
6 changes: 1 addition & 5 deletions ext-src/swoole_runtime.cc
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,7 @@
#include "thirdparty/php/standard/proc_open.h"

#ifdef SW_USE_CURL
#if PHP_VERSION_ID >= 80400
#include "thirdparty/php84/curl/curl_interface.h"
#else
#include "thirdparty/php/curl/curl_interface.h"
#endif
#include "swoole_curl_interface.h"
#endif

#include <unordered_map>
Expand Down
2 changes: 1 addition & 1 deletion thirdparty/php/curl/curl_arginfo.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/* This is a generated file, edit the .stub.php file instead.
* Stub hash: f1d616c644ad366405816cde0384f6f391773ebf */

#include "curl_interface.h"
#include "swoole_curl_interface.h"

#if defined(SW_USE_CURL) && PHP_VERSION_ID < 80400

Expand Down
2 changes: 1 addition & 1 deletion thirdparty/php/curl/interface.cc
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
using namespace swoole;

SW_EXTERN_C_BEGIN
#include "curl_interface.h"
#include "swoole_curl_interface.h"
#include "curl_arginfo.h"

#include <stdio.h>
Expand Down
2 changes: 1 addition & 1 deletion thirdparty/php/curl/multi.cc
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ using swoole::curl::Multi;
using swoole::curl::Selector;

SW_EXTERN_C_BEGIN
#include "curl_interface.h"
#include "swoole_curl_interface.h"
#include "curl_arginfo.h"

#include <stdio.h>
Expand Down
1,109 changes: 69 additions & 1,040 deletions thirdparty/php84/curl/curl_arginfo.h

Large diffs are not rendered by default.

152 changes: 82 additions & 70 deletions thirdparty/php84/curl/curl_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
+----------------------------------------------------------------------+
*/

#if defined(SW_USE_CURL) && PHP_VERSION_ID >= 80400

#ifndef _PHP_CURL_PRIVATE_H
#define _PHP_CURL_PRIVATE_H

Expand All @@ -31,129 +33,139 @@
#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_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)
#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 {
zend_fcall_info_cache fcc;
FILE *fp;
smart_str buf;
int method;
zval stream;
zend_fcall_info_cache fcc;
FILE *fp;
smart_str buf;
int method;
zval stream;
} php_curl_write;

typedef struct {
zend_fcall_info_cache fcc;
FILE *fp;
zend_resource *res;
int method;
zval stream;
zend_fcall_info_cache fcc;
FILE *fp;
zend_resource *res;
int method;
zval stream;
} php_curl_read;

typedef struct {
php_curl_write *write;
php_curl_write *write_header;
php_curl_read *read;
zval std_err;
zend_fcall_info_cache progress;
zend_fcall_info_cache xferinfo;
zend_fcall_info_cache fnmatch;
zend_fcall_info_cache debug;
php_curl_write *write;
php_curl_write *write_header;
php_curl_read *read;
zval std_err;
zend_fcall_info_cache progress;
zend_fcall_info_cache xferinfo;
zend_fcall_info_cache fnmatch;
zend_fcall_info_cache debug;
#if LIBCURL_VERSION_NUM >= 0x075000 /* Available since 7.80.0 */
zend_fcall_info_cache prereq;
zend_fcall_info_cache prereq;
#endif
#if LIBCURL_VERSION_NUM >= 0x075400 /* Available since 7.84.0 */
zend_fcall_info_cache sshhostkey;
zend_fcall_info_cache sshhostkey;
#endif
} php_curl_handlers;

struct _php_curl_error {
char str[CURL_ERROR_SIZE + 1];
int no;
struct _php_curl_error {
char str[CURL_ERROR_SIZE + 1];
int no;
};

struct _php_curl_send_headers {
zend_string *str;
zend_string *str;
};

struct _php_curl_free {
zend_llist post;
zend_llist stream;
HashTable *slist;
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;
bool in_callback;
uint32_t* clone;
zval postfields;
/* For CURLOPT_PRIVATE */
zval private_data;
/* CurlShareHandle object set using CURLOPT_SHARE. */
struct _php_curlsh *share;
zend_object std;
CURL *cp;
php_curl_handlers handlers;
struct _php_curl_free *to_free;
struct _php_curl_send_headers header;
struct _php_curl_error err;
bool in_callback;
uint32_t *clone;
zval postfields;
/* For CURLOPT_PRIVATE */
zval private_data;
/* CurlShareHandle object set using CURLOPT_SHARE. */
struct _php_curlsh *share;
zend_object std;
} php_curl;

#define CURLOPT_SAFE_UPLOAD -1

typedef struct {
zend_fcall_info_cache server_push;
zend_fcall_info_cache server_push;
} php_curlm_handlers;

namespace swoole {
namespace curl {
class Multi;
}
} // namespace swoole

using swoole::curl::Multi;

typedef struct {
CURLM *multi;
zend_llist easyh;
php_curlm_handlers handlers;
struct {
int no;
} err;
zend_object std;
Multi *multi;
zend_llist easyh;
php_curlm_handlers handlers;
struct {
int no;
} err;
zend_object std;
} php_curlm;

typedef struct _php_curlsh {
CURLSH *share;
struct {
int no;
} err;
zend_object std;
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, bool reporterror);
void _php_setup_easy_copy_handlers(php_curl *ch, php_curl *source);
php_curl *swoole_curl_init_handle_into_zval(zval *curl);
void swoole_curl_init_handle(php_curl *ch);
void swoole_curl_cleanup_handle(php_curl *);
void swoole_curl_multi_cleanup_list(void *data);
void swoole_curl_verify_handlers(php_curl *ch, bool reporterror);
void swoole_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));
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));
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);
zend_result swoole_curl_cast_object(zend_object *obj, zval *result, int type);

void curl_multi_register_handlers(void);
void curl_share_register_handlers(void);
void curlfile_register_class(void);
zend_result curl_cast_object(zend_object *obj, zval *result, int type);
php_curl *swoole_curl_get_handle(zval *zid, bool exclusive = true, bool required = true);

#endif /* _PHP_CURL_PRIVATE_H */
#endif /* _PHP_CURL_PRIVATE_H */
#endif
Loading

0 comments on commit 52f238f

Please sign in to comment.