* allow curl use zends memory functions (just to check if everything goes right)
[m6w6/ext-http] / http.c
diff --git a/http.c b/http.c
index b46ba9ef4f2f3deb98756e893fa113f4217a23b6..4e1f0b356331aa3f319ed3046a3329093176cad2 100644 (file)
--- a/http.c
+++ b/http.c
 
 /* $Id$ */
 
-#define _WINSOCKAPI_
-#define ZEND_INCLUDE_FULL_WINDOWS_HEADERS
 
 #ifdef HAVE_CONFIG_H
 #      include "config.h"
 #endif
 
+#ifdef HTTP_HAVE_CURL
+#      ifdef PHP_WIN32
+#              include <winsock2.h>
+#      endif
+#      include <curl/curl.h>
+#endif
+
 #include "php.h"
 #include "php_ini.h"
 #include "snprintf.h"
 #include "php_http.h"
 #include "php_http_api.h"
 #include "php_http_curl_api.h"
+#include "php_http_std_defs.h"
 
 #ifdef ZEND_ENGINE_2
 #      include "ext/standard/php_http.h"
 #endif
 
 #ifdef HTTP_HAVE_CURL
-
-#      ifdef PHP_WIN32
-#              include <winsock2.h>
-#              include <sys/types.h>
-#      endif
-
-#      include <curl/curl.h>
-
 /* {{{ ARG_INFO */
 #      ifdef ZEND_BEGIN_ARG_INFO
 ZEND_BEGIN_ARG_INFO(http_request_info_ref_3, 0)
@@ -310,6 +308,10 @@ zend_function_entry httpi_request_class_methods[] = {
 
        PHP_ME(HTTPi_Request, setOptions, NULL, ZEND_ACC_PUBLIC)
        PHP_ME(HTTPi_Request, getOptions, NULL, ZEND_ACC_PUBLIC)
+       PHP_ME(HTTPi_Request, unsetOptions, NULL, ZEND_ACC_PUBLIC)
+
+       PHP_ME(HTTPi_Request, addHeader, NULL, ZEND_ACC_PUBLIC)
+       PHP_ME(HTTPi_Request, addCookie, NULL, ZEND_ACC_PUBLIC)
 
        PHP_ME(HTTPi_Request, setMethod, NULL, ZEND_ACC_PUBLIC)
        PHP_ME(HTTPi_Request, getMethod, NULL, ZEND_ACC_PUBLIC)
@@ -337,7 +339,8 @@ zend_function_entry httpi_request_class_methods[] = {
        PHP_ME(HTTPi_Request, send, NULL, ZEND_ACC_PUBLIC)
 
        PHP_ME(HTTPi_Request, getResponseData, NULL, ZEND_ACC_PUBLIC)
-       PHP_ME(HTTPi_Request, getResponseHeaders, NULL, ZEND_ACC_PUBLIC)
+       PHP_ME(HTTPi_Request, getResponseHeader, NULL, ZEND_ACC_PUBLIC)
+       PHP_ME(HTTPi_Request, getResponseCode, NULL, ZEND_ACC_PUBLIC)
        PHP_ME(HTTPi_Request, getResponseBody, NULL, ZEND_ACC_PUBLIC)
        PHP_ME(HTTPi_Request, getResponseInfo, NULL, ZEND_ACC_PUBLIC)
 
@@ -368,9 +371,10 @@ zend_module_entry http_module_entry = {
 };
 /* }}} */
 
-static void free_to_free(void **s)
+
+static void free_to_free(void *s)
 {
-       efree(*s);
+       efree(*(char **)s);
 }
 
 /* {{{ php_http_init_globals(zend_http_globals *) */
@@ -414,21 +418,55 @@ PHP_INI_MH(update_allowed_methods)
 }
 
 PHP_INI_BEGIN()
-       STD_PHP_INI_ENTRY("http.allowed_methods", "OPTIONS,GET,HEAD,POST,PUT,DELETE,TRACE,CONNECT", PHP_INI_ALL, update_allowed_methods, allowed_methods, zend_http_globals, http_globals)
+       STD_PHP_INI_ENTRY("http.allowed_methods",
+               /* HTTP 1.1 */
+               "GET, HEAD, POST, PUT, DELETE, OPTIONS, TRACE, CONNECT, "
+               /* WebDAV - RFC 2518 * /
+               "PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK, "
+               /* WebDAV Versioning - RFC 3253 * /
+               "VERSION-CONTROL, REPORT, CHECKOUT, CHECKIN, UNCHECKOUT, "
+               "MKWORKSPACE, UPDATE, LABEL, MERGE, BASELINE-CONTROL, MKACTIVITY, "
+               /* WebDAV Access Control - RFC 3744 * /
+               "ACL, "
+               /* END */
+               ,
+               PHP_INI_ALL, update_allowed_methods, allowed_methods, zend_http_globals, http_globals)
 PHP_INI_END()
 /* }}} */
 
+/* {{{ HTTP_CURL_USE_ZEND_MM */
+#if defined(HTTP_HAVE_CURL) && defined(HTTP_CURL_USE_ZEND_MM)
+static void http_curl_free(void *p)                                    { efree(p); }
+static char *http_curl_strdup(const char *p)           { return estrdup(p); }
+static void *http_curl_malloc(size_t s)                                { return emalloc(s); }
+static void *http_curl_realloc(void *p, size_t s)      { return erealloc(p, s); }
+static void *http_curl_calloc(size_t n, size_t s)      { return ecalloc(n, s); }
+#endif /* HTTP_HAVE_CURL && HTTP_CURL_USE_ZEND_MM */
+/* }}} */
+
 /* {{{ PHP_MINIT_FUNCTION */
 PHP_MINIT_FUNCTION(http)
 {
        ZEND_INIT_MODULE_GLOBALS(http, php_http_init_globals, NULL);
        REGISTER_INI_ENTRIES();
 
-#if defined(HTTP_HAVE_CURL) && (LIBCURL_VERSION_NUM >= 0x070a05)
+#ifdef HTTP_HAVE_CURL
+#      ifdef HTTP_CURL_USE_ZEND_MM
+       if (CURLE_OK != curl_global_init_mem(CURL_GLOBAL_ALL, 
+                       http_curl_malloc, 
+                       http_curl_free,
+                       http_curl_realloc,
+                       http_curl_strdup,
+                       http_curl_calloc)) {
+               return FAILURE;
+       }
+#      endif /* HTTP_CURL_USE_ZEND_MM */
+#      if LIBCURL_VERSION_NUM >= 0x070a05
        REGISTER_LONG_CONSTANT("HTTP_AUTH_BASIC", CURLAUTH_BASIC, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("HTTP_AUTH_DIGEST", CURLAUTH_DIGEST, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("HTTP_AUTH_NTLM", CURLAUTH_NTLM, CONST_CS | CONST_PERSISTENT);
-#endif
+#      endif /* LIBCURL_VERSION_NUM */
+#endif /* HTTP_HAVE_CURL */
 
 #ifdef ZEND_ENGINE_2
        HTTP_REGISTER_CLASS(HTTPi, httpi, NULL, ZEND_ACC_FINAL_CLASS);
@@ -448,6 +486,9 @@ PHP_MINIT_FUNCTION(http)
 PHP_MSHUTDOWN_FUNCTION(http)
 {
        UNREGISTER_INI_ENTRIES();
+#ifdef HTTP_HAVE_CURL
+       curl_global_cleanup();
+#endif
        return SUCCESS;
 }
 /* }}} */
@@ -476,6 +517,7 @@ PHP_RSHUTDOWN_FUNCTION(http)
                efree(HTTP_G(ctype));
                HTTP_G(ctype) = NULL;
        }
+
 #ifdef HTTP_HAVE_CURL
        if (HTTP_G(curlbuf).data) {
                efree(HTTP_G(curlbuf).data);
@@ -484,6 +526,7 @@ PHP_RSHUTDOWN_FUNCTION(http)
                HTTP_G(curlbuf).free = 0;
        }
 #endif
+
        return SUCCESS;
 }
 /* }}} */
@@ -491,16 +534,37 @@ PHP_RSHUTDOWN_FUNCTION(http)
 /* {{{ PHP_MINFO_FUNCTION */
 PHP_MINFO_FUNCTION(http)
 {
-       php_info_print_table_start();
-       php_info_print_table_header(2, "Extended HTTP support", "enabled");
-       php_info_print_table_row(2, "Version:", PHP_EXT_HTTP_VERSION);
-       php_info_print_table_row(2, "cURL convenience functions:",
+#ifdef ZEND_ENGINE_2
+#      define HTTP_FUNC_AVAIL(CLASS) "procedural, object oriented (class " CLASS ")"
+#else
+#      define HTTP_FUNC_AVAIL(CLASS) "procedural"
+#endif
+
 #ifdef HTTP_HAVE_CURL
-                       "enabled"
+#      define HTTP_CURL_VERSION curl_version()
+#      ifdef ZEND_ENGINE_2
+#              define HTTP_CURL_AVAIL(CLASS) "procedural, object oriented (class " CLASS ")"
+#      else
+#              define HTTP_CURL_AVAIL(CLASS) "procedural"
+#      endif
 #else
-                       "disabled"
+#      define HTTP_CURL_VERSION "libcurl not available"
+#      define HTTP_CURL_AVAIL(CLASS) "libcurl not available"
 #endif
-       );
+
+       char full_version_string[1024] = {0};
+       snprintf(full_version_string, 1023, "%s (%s)", PHP_EXT_HTTP_VERSION, HTTP_CURL_VERSION);
+
+       php_info_print_table_start();
+       php_info_print_table_row(2, "Extended HTTP support", "enabled");
+       php_info_print_table_row(2, "Extension Version:", full_version_string);
+       php_info_print_table_end();
+
+       php_info_print_table_start();
+       php_info_print_table_header(2, "Functionality",            "Availability");
+       php_info_print_table_row(2,    "Miscellaneous Utilities:", HTTP_FUNC_AVAIL("HTTPi"));
+       php_info_print_table_row(2,    "Extended HTTP Responses:", HTTP_FUNC_AVAIL("HTTPi_Response"));
+       php_info_print_table_row(2,    "Extended HTTP Requests:",  HTTP_CURL_AVAIL("HTTPi_Request"));
        php_info_print_table_end();
 
        DISPLAY_INI_ENTRIES();