cvs: php4 /ext/curl curl.c php_curl.h
| From: | Sterling Hughes | 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;