cvs: php4 /ext/curl curl.c php_curl.h

From: Date: Tue, 15 Aug 2000 16:50:14 +0000
Subject: cvs: php4 /ext/curl curl.c php_curl.h
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-1188@lists.php.net to get a copy of this message
sterling Tue Aug 15 09:50:14 2000 EDT Modified files: /php4/ext/curl curl.c php_curl.h Log: This fixes to problems: - Apache not having the output go to stdout in some cases. - Output being displayed before the header is displayed. And causes the following: - *Slightly* slower cURL transfers. Index: php4/ext/curl/curl.c diff -u php4/ext/curl/curl.c:1.5 php4/ext/curl/curl.c:1.6 --- php4/ext/curl/curl.c:1.5 Sun Aug 13 12:32:09 2000 +++ php4/ext/curl/curl.c Tue Aug 15 09:50:14 2000 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: curl.c,v 1.5 2000/08/13 19:32:09 sterling Exp $ */ +/* $Id: curl.c,v 1.6 2000/08/15 16:50:14 sterling Exp $ */ #include "php.h" @@ -24,6 +24,9 @@ #if HAVE_CURL #include <stdio.h> +#ifdef PHP_WIN32 +#include <winsock.h> +#endif #include <curl/curl.h> #include <curl/easy.h> #include "ext/standard/info.h" @@ -35,6 +38,40 @@ php_curl_globals curl_globals; #endif +/* Basically grabbed from the source code of cURL */ +#ifdef PHP_WIN32 +static void win32_cleanup(); +static void win32_init(); + +static void win32_cleanup() +{ + WSACleanup(); +} + +static CURLcode win32_init() +{ + WORD wVersionRequested; + WSADATA wsaData; + int err; + wVersionRequested = MAKEWORD(1, 1); + + err = WSAStartup(wVersionRequested, &wsaData); + + if (err != 0) return CURLE_FAILED_INIT; + + if ( LOBYTE( wsaData.wVersion ) != 1 || + HIBYTE( wsaData.wVersion ) != 1 ) { + WSACleanup(); + return CURLE_FAILED_INIT; + } + return CURLE_OK; +} +#else +static CURLcode win32_init(void) { return CURLE_OK; } +#define win32_cleanup() +#endif + + function_entry curl_functions[] = { PHP_FE(curl_init, NULL) PHP_FE(curl_version, NULL) @@ -48,7 +85,7 @@ "curl", curl_functions, PHP_MINIT(curl), - NULL, + PHP_MSHUTDOWN(curl), NULL, NULL, PHP_MINFO(curl), @@ -62,11 +99,6 @@ static void php_curl_close(CURL *cp); static int php_curl_error_translator(CURLcode err); -static void php_curl_close(CURL *cp) -{ - curl_easy_cleanup(cp); -} - PHP_MINFO_FUNCTION(curl) { php_info_print_table_start(); @@ -78,8 +110,9 @@ PHP_MINIT_FUNCTION(curl) { CURLLS_FETCH(); - CURLG(le_curl) = register_list_destructors(php_curl_close, NULL); + + /* Constants for curl_setopt() */ REGISTER_LONG_CONSTANT("CURLOPT_PORT", CURLOPT_PORT, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("CURLOPT_FILE", CURLOPT_FILE, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("CURLOPT_INFILE", CURLOPT_INFILE, CONST_CS | CONST_PERSISTENT); @@ -123,6 +156,8 @@ REGISTER_LONG_CONSTANT("CURLOPT_STDERR", CURLOPT_STDERR, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("CURLOPT_WRITEINFO", CURLOPT_WRITEINFO, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("CURLOPT_TRANSFERTEXT", CURLOPT_TRANSFERTEXT, CONST_CS | CONST_PERSISTENT); + + /* Error Constants */ REGISTER_LONG_CONSTANT("CURLE_OK", CE_OK, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("CURLE_UNSUPPORTED_PROTOCOL", CE_UNSUPPORTED_PROTOCOL, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("CURLE_FAILED_INIT", CE_FAILED_INIT, CONST_CS | CONST_PERSISTENT); @@ -169,11 +204,20 @@ REGISTER_LONG_CONSTANT("CURLE_BAD_FUNCTION_ARGUMENT", CE_BAD_FUNCTION_ARGUMENT, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("CURLE_BAD_CALLING_ORDER", CE_BAD_CALLING_ORDER, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("CURL_LAST", C_LAST, CONST_CS | CONST_PERSISTENT); + + if (win32_init() != CURLE_OK) + return FAILURE; return SUCCESS; } + +PHP_MSHUTDOWN_FUNCTION(curl) +{ + win32_cleanup(); +} + -/* {{{ proto string curl_version () +/* {{{ proto string curl_version (void) Return the CURL version string. */ PHP_FUNCTION (curl_version) { @@ -266,8 +310,12 @@ FILE *fp; ZEND_FETCH_RESOURCE(fp, FILE *, uCurlValue, -1, "File-handle", php_file_le_fopen()); ret = curl_easy_setopt(cp, option, fp); + + if (option & CURLOPT_FILE) + CURLG(use_file) = 1; + } - + RETURN_LONG(php_curl_error_translator(ret)); } /* }}} */ @@ -287,8 +335,32 @@ } ZEND_FETCH_RESOURCE(cp, CURL *, uCurlId, -1, "CURL Handle", CURLG(le_curl)); - ret = curl_easy_perform (cp); + if (CURLG(use_file)) { + ret = curl_easy_perform (cp); + } else { + FILE *tmp; + char buf[4096]; + int b; + + if ((tmp = tmpfile()) == NULL) { + php_error(E_WARNING, "Cannot create temporary file to stream output of cURL from"); + RETURN_LONG(-1); + } + + curl_easy_setopt(cp, CURLOPT_FILE, tmp); + ret = curl_easy_perform (cp); + + if (ret != CURLE_OK) + RETURN_LONG(php_curl_error_translator(ret)); + + fseek(tmp, 0, SEEK_SET); + + while ((b = fread(buf, 1, sizeof(buf), tmp)) > 0) + php_write(buf, b); + + fclose(tmp); + } RETURN_LONG(php_curl_error_translator(ret)); } /* }}} */ @@ -409,6 +481,11 @@ case CURL_LAST: return(C_LAST); } +} + +static void php_curl_close(CURL *cp) +{ + curl_easy_cleanup(cp); } #endif Index: php4/ext/curl/php_curl.h diff -u php4/ext/curl/php_curl.h:1.4 php4/ext/curl/php_curl.h:1.5 --- php4/ext/curl/php_curl.h:1.4 Sun Aug 13 12:32:09 2000 +++ php4/ext/curl/php_curl.h Tue Aug 15 09:50:14 2000 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_curl.h,v 1.4 2000/08/13 19:32:09 sterling Exp $ */ +/* $Id: php_curl.h,v 1.5 2000/08/15 16:50:14 sterling Exp $ */ #ifndef _PHP_CURL_H #define _PHP_CURL_H @@ -32,6 +32,7 @@ #define curl_module_ptr &curl_module_entry PHP_MINIT_FUNCTION(curl); +PHP_MSHUTDOWN_FUNCTION(curl); PHP_MINFO_FUNCTION(curl); PHP_FUNCTION(curl_version); PHP_FUNCTION(curl_init); @@ -87,6 +88,7 @@ #define C_LAST 45 typedef struct { + int use_file = 0; int le_curl; } php_curl_globals;

« previous php.cvs (#1188) next »