X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_api.c;h=e2e04208a531e037ebaf47f5070558fbb5c32309;hp=e1dae2dbcbe09e4b07d6c72461f7782ddfcc9e76;hb=007a8514b1fd679453526f96dc8a908a8e6354e8;hpb=86e60ef185c731dd86cef3c849282eb4f33edd4a diff --git a/http_api.c b/http_api.c index e1dae2d..e2e0420 100644 --- a/http_api.c +++ b/http_api.c @@ -58,6 +58,9 @@ #endif +#if !defined(CURLINFO_RESONSE_CODE) && defined(CURLINFO_HTTP_CODE) +#define CURLINFO_RESONSE_CODE CURLINFO_HTTP_CODE +#endif ZEND_DECLARE_MODULE_GLOBALS(http) @@ -432,7 +435,7 @@ static inline void _http_curl_setopts(CURL *ch, const char *url, HashTable *opti curl_easy_setopt(ch, CURLOPT_AUTOREFERER, 1); curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, http_curl_body_callback); curl_easy_setopt(ch, CURLOPT_HEADERFUNCTION, http_curl_hdrs_callback); -#ifdef ZTS +#if defined(ZTS) && (LIBCURL_VERSION_NUM >= 0x070a00) curl_easy_setopt(ch, CURLOPT_NOSIGNAL, 1); #endif @@ -462,19 +465,23 @@ static inline void _http_curl_setopts(CURL *ch, const char *url, HashTable *opti if (zoption = http_curl_getopt1(options, "proxyauth", IS_STRING)) { curl_easy_setopt(ch, CURLOPT_PROXYUSERPWD, Z_STRVAL_P(zoption)); } +#if LIBCURL_VERSION_NUM > 0x070a06 /* auth method */ if (zoption = http_curl_getopt1(options, "proxyauthtype", IS_LONG)) { curl_easy_setopt(ch, CURLOPT_PROXYAUTH, Z_LVAL_P(zoption)); } +#endif } /* auth */ if (zoption = http_curl_getopt1(options, "httpauth", IS_STRING)) { curl_easy_setopt(ch, CURLOPT_USERPWD, Z_STRVAL_P(zoption)); } +#if LIBCURL_VERSION_NUM > 0x070a05 if (zoption = http_curl_getopt1(options, "httpauthtype", IS_LONG)) { curl_easy_setopt(ch, CURLOPT_HTTPAUTH, Z_LVAL_P(zoption)); } +#endif /* compress, enabled by default (empty string enables deflate and gzip) */ if (zoption = http_curl_getopt2(options, "compress", IS_LONG, IS_BOOL)) { @@ -526,6 +533,7 @@ static inline void _http_curl_setopts(CURL *ch, const char *url, HashTable *opti if (qstr.c) { curl_easy_setopt(ch, CURLOPT_COOKIE, qstr.c); + efree(qstr.c); } } @@ -562,13 +570,17 @@ static inline void _http_curl_setopts(CURL *ch, const char *url, HashTable *opti /* {{{ static inline char *http_curl_getinfoname(CURLINFO) */ static inline char *_http_curl_getinfoname(CURLINFO i TSRMLS_DC) { -#define CASE(I) case CURLINFO_ ##I : return pretty_key(estrdup( #I ), strlen(#I), 0, 0) +#define CASE(I) case CURLINFO_ ##I : { static char I[] = #I; return pretty_key(I, sizeof(#I)-1, 0, 0); } switch (i) { /* CURLINFO_EFFECTIVE_URL = CURLINFO_STRING +1, */ CASE(EFFECTIVE_URL); /* CURLINFO_RESPONSE_CODE = CURLINFO_LONG +2, */ +#if LIBCURL_VERSION_NUM > 0x070a06 CASE(RESPONSE_CODE); +#else + CASE(HTTP_CODE); +#endif /* CURLINFO_TOTAL_TIME = CURLINFO_DOUBLE +3, */ CASE(TOTAL_TIME); /* CURLINFO_NAMELOOKUP_TIME = CURLINFO_DOUBLE +4, */ @@ -605,14 +617,16 @@ static inline char *_http_curl_getinfoname(CURLINFO i TSRMLS_DC) CASE(REDIRECT_TIME); /* CURLINFO_REDIRECT_COUNT = CURLINFO_LONG +20, */ CASE(REDIRECT_COUNT); - /* CURLINFO_PRIVATE = CURLINFO_STRING +21, */ + /* CURLINFO_PRIVATE = CURLINFO_STRING +21, * (mike) / CASE(PRIVATE); /* CURLINFO_HTTP_CONNECTCODE = CURLINFO_LONG +22, */ CASE(HTTP_CONNECTCODE); +#if LIBCURL_VERSION_NUM > 0x070a07 /* CURLINFO_HTTPAUTH_AVAIL = CURLINFO_LONG +23, */ CASE(HTTPAUTH_AVAIL); /* CURLINFO_PROXYAUTH_AVAIL = CURLINFO_LONG +24, */ CASE(PROXYAUTH_AVAIL); +#endif } #undef CASE return NULL; @@ -666,8 +680,12 @@ static inline void _http_curl_getinfo(CURL *ch, HashTable *info TSRMLS_DC) #define INFO(I) http_curl_getinfo_ex(ch, CURLINFO_ ##I , &array) /* CURLINFO_EFFECTIVE_URL = CURLINFO_STRING +1, */ INFO(EFFECTIVE_URL); +#if LIBCURL_VERSION_NUM > 0x070a06 /* CURLINFO_RESPONSE_CODE = CURLINFO_LONG +2, */ INFO(RESPONSE_CODE); +#else + INFO(HTTP_CODE); +#endif /* CURLINFO_TOTAL_TIME = CURLINFO_DOUBLE +3, */ INFO(TOTAL_TIME); /* CURLINFO_NAMELOOKUP_TIME = CURLINFO_DOUBLE +4, */ @@ -708,10 +726,12 @@ static inline void _http_curl_getinfo(CURL *ch, HashTable *info TSRMLS_DC) INFO(PRIVATE); /* CURLINFO_HTTP_CONNECTCODE = CURLINFO_LONG +22, */ INFO(HTTP_CONNECTCODE); +#if LIBCURL_VERSION_NUM > 0x070a07 /* CURLINFO_HTTPAUTH_AVAIL = CURLINFO_LONG +23, */ INFO(HTTPAUTH_AVAIL); /* CURLINFO_PROXYAUTH_AVAIL = CURLINFO_LONG +24, */ INFO(PROXYAUTH_AVAIL); +#endif #undef INFO } /* }}} */ @@ -1060,9 +1080,12 @@ PHP_HTTP_API inline time_t _http_lmod(const void *data_ptr, const http_send_mode default: { - zval mtime; - php_stat(Z_STRVAL_P((zval *) data_ptr), Z_STRLEN_P((zval *) data_ptr), FS_MTIME, &mtime TSRMLS_CC); - return Z_LVAL(mtime); + if (!HTTP_G(ssb).sb.st_mtime) { + if(php_stream_stat_path(Z_STRVAL_P((zval *) data_ptr), &HTTP_G(ssb))) { + return 0; + } + } + return HTTP_G(ssb).sb.st_mtime; } } } @@ -1329,7 +1352,7 @@ PHP_HTTP_API STATUS _http_send_content_type(const char *content_type, /* {{{ STATUS http_send_content_disposition(char *, size_t, zend_bool) */ PHP_HTTP_API STATUS _http_send_content_disposition(const char *filename, - const size_t f_len, const zend_bool send_inline TSRMLS_DC) + const size_t f_len, const int send_inline TSRMLS_DC) { STATUS status; char *cd_header; @@ -1936,15 +1959,14 @@ PHP_HTTP_API STATUS _http_chunked_decode(const char *encoded, } /* }}} */ -/* {{{ proto STATUS http_split_response(zval *, zval *, zval *) */ -PHP_HTTP_API STATUS _http_split_response(const zval *zresponse, zval *zheaders, - zval *zbody TSRMLS_DC) +/* {{{ proto STATUS http_split_response_ex(char *, size_t, zval *, zval *) */ +PHP_HTTP_API STATUS _http_split_response_ex( char *response, + size_t response_len, zval *zheaders, zval *zbody TSRMLS_DC) { - char *header, *response, *body = NULL; - long response_len = Z_STRLEN_P(zresponse); - header = response = Z_STRVAL_P(zresponse); + char *body = NULL; + char *header = response; - while ((response - Z_STRVAL_P(zresponse) + 3) < response_len) { + while ((response - header + 4) < response_len) { if ( (*response++ == '\r') && (*response++ == '\n') && (*response++ == '\r') && @@ -1960,7 +1982,7 @@ PHP_HTTP_API STATUS _http_split_response(const zval *zresponse, zval *zheaders, Z_TYPE_P(zbody) = IS_NULL; } - return http_parse_headers(header, body - Z_STRVAL_P(zresponse), zheaders); + return http_parse_headers(header, body ? body - header : response_len, zheaders); } /* }}} */