X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http.c;h=a174960db9ff46d018feda0ffb76ab67a1b795a4;hp=b1039ade5fa4024e3cb741a5afa0aaa5905436eb;hb=3fa63677501feaa721b31715a2abe000e54415be;hpb=b0919f33875667baecb05888fba006d5652d68d1 diff --git a/http.c b/http.c index b1039ad..a174960 100644 --- a/http.c +++ b/http.c @@ -52,6 +52,14 @@ #include "phpstr/phpstr.h" #ifdef HTTP_HAVE_CURL +# if defined(ZTS) && defined(HTTP_HAVE_SSL) +# if !defined(HAVE_OPENSSL_CRYPTO_H) +# error "libcurl was compiled with OpenSSL support, but we have no crypto.h" +# else +# define HTTP_NEED_SSL +# include +# endif +# endif # ifdef PHP_WIN32 # include # endif @@ -71,7 +79,7 @@ ZEND_GET_MODULE(http) #endif /* {{{ http_functions[] */ -function_entry http_functions[] = { +zend_function_entry http_functions[] = { PHP_FE(http_test, NULL) PHP_FE(http_date, NULL) PHP_FE(http_absolute_uri, NULL) @@ -112,7 +120,8 @@ function_entry http_functions[] = { PHP_FE(http_build_query, NULL) #endif PHP_FE(ob_etaghandler, NULL) - {NULL, NULL, NULL} + + EMPTY_FUNCTION_ENTRY }; /* }}} */ @@ -249,6 +258,51 @@ PHP_INI_BEGIN() PHP_INI_END() /* }}} */ +/* {{{ SSL */ +#ifdef HTTP_NEED_SSL + +static MUTEX_T *http_ssl_mutex = NULL; + +static void http_ssl_lock(int mode, int n, const char * file, int line) +{ + if (mode & CRYPTO_LOCK) { + tsrm_mutex_lock(http_ssl_mutex[n]); + } else { + tsrm_mutex_unlock(http_ssl_mutex[n]); + } +} +static unsigned long http_ssl_id(void) +{ + return (unsigned long) tsrm_thread_id(); +} +static inline void http_ssl_init(void) +{ + int i, c = CRYPTO_num_locks(); + http_ssl_mutex = malloc(c * sizeof(MUTEX_T)); + + for (i = 0; i < c; ++i) { + http_ssl_mutex[i] = tsrm_mutex_alloc(); + } + + CRYPTO_set_id_callback(http_ssl_id); + CRYPTO_set_locking_callback(http_ssl_lock); +} +static inline void http_ssl_cleanup(void) +{ + int i, c = CRYPTO_num_locks(); + + CRYPTO_set_id_callback(NULL); + CRYPTO_set_locking_callback(NULL); + + for (i = 0; i < c; ++i) { + tsrm_mutex_free(http_ssl_mutex[i]); + } + + free(http_ssl_mutex); + http_ssl_mutex = NULL; +} +#endif +/* }}} */ /* {{{ PHP_MINIT_FUNCTION */ PHP_MINIT_FUNCTION(http) @@ -264,7 +318,14 @@ PHP_MINIT_FUNCTION(http) HTTP_LONG_CONSTANT("HTTP_ETAG_MHASH", HTTP_ETAG_MHASH); #ifdef HTTP_HAVE_CURL - if (CURLE_OK != curl_global_init(CURL_GLOBAL_ALL)) { + if (CURLE_OK == curl_global_init(CURL_GLOBAL_ALL)) { +# ifdef HTTP_NEED_SSL + curl_version_info_data *cvid = curl_version_info(CURLVERSION_NOW); + if (cvid && (cvid->features & CURL_VERSION_SSL)) { + http_ssl_init(); + } +# endif + } else { return FAILURE; } #endif /* HTTP_HAVE_CURL */ @@ -292,6 +353,11 @@ PHP_MSHUTDOWN_FUNCTION(http) UNREGISTER_INI_ENTRIES(); #ifdef HTTP_HAVE_CURL curl_global_cleanup(); +# ifdef HTTP_NEED_SSL + if (http_ssl_mutex) { + http_ssl_cleanup(); + } +# endif #endif return SUCCESS; }