- Fixed build on php-trunk
[m6w6/ext-http] / http_functions.c
index 511230eaedef4ab1f63b7884db0b6f9f2eb65b2b..079996986697c361a73f6c6a9e6ce520d24db4cc 100644 (file)
@@ -6,7 +6,7 @@
     | modification, are permitted provided that the conditions mentioned |
     | in the accompanying LICENSE file are met.                          |
     +--------------------------------------------------------------------+
-    | Copyright (c) 2004-2006, Michael Wallner <mike@php.net>            |
+    | Copyright (c) 2004-2010, Michael Wallner <mike@php.net>            |
     +--------------------------------------------------------------------+
 */
 
@@ -43,6 +43,7 @@
 PHP_FUNCTION(http_date)
 {
        long t = -1;
+       char *date;
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &t) != SUCCESS) {
                RETURN_FALSE;
@@ -52,17 +53,22 @@ PHP_FUNCTION(http_date)
                t = HTTP_G->request.time;
        }
 
-       RETURN_STRING(http_date(t), 0);
+       if (!(date = http_date(t))) {
+               http_error_ex(HE_WARNING, HTTP_E_INVALID_PARAM, "Could not compose date of timestamp %ld", t);
+               RETURN_FALSE;
+       }
+       
+       RETURN_STRING(date, 0);
 }
 /* }}} */
 
-/* {{{ proto string http_build_url([mixed url[, mixed parts[, int flags = HTTP_URL_REPLACE[, array &new_url]]]])
+/* {{{ proto string http_build_url([mixed url[, mixed parts[, int flags = HTTP_URL_REPLACE|HTTP_URL_FROM_ENV[, array &new_url]]]])
        Build an URL. */
 PHP_FUNCTION(http_build_url)
 {
        char *url_str = NULL;
        size_t url_len = 0;
-       long flags = HTTP_URL_REPLACE;
+       long flags = HTTP_URL_REPLACE|HTTP_URL_FROM_ENV;
        zval *z_old_url = NULL, *z_new_url = NULL, *z_composed_url = NULL;
        php_url *old_url = NULL, *new_url = NULL, *composed_url = NULL;
 
@@ -148,6 +154,17 @@ PHP_FUNCTION(http_build_str)
 }
 /* }}} */
 
+#define HTTP_DO_NEGOTIATE_DEFAULT(supported) \
+       { \
+               zval **value; \
+                \
+               zend_hash_internal_pointer_reset(Z_ARRVAL_P(supported)); \
+               if (SUCCESS == zend_hash_get_current_data(Z_ARRVAL_P(supported), (void *) &value)) { \
+                       RETVAL_ZVAL(*value, 1, 0); \
+               } else { \
+                       RETVAL_NULL(); \
+               } \
+       }
 #define HTTP_DO_NEGOTIATE(type, supported, rs_array) \
 { \
        HashTable *result; \
@@ -156,10 +173,10 @@ PHP_FUNCTION(http_build_str)
                uint key_len; \
                ulong idx; \
                 \
-               if (HASH_KEY_IS_STRING == zend_hash_get_current_key_ex(result, &key, &key_len, &idx, 1, NULL)) { \
+               if (zend_hash_num_elements(result) && HASH_KEY_IS_STRING == zend_hash_get_current_key_ex(result, &key, &key_len, &idx, 1, NULL)) { \
                        RETVAL_STRINGL(key, key_len-1, 0); \
                } else { \
-                       RETVAL_NULL(); \
+                       HTTP_DO_NEGOTIATE_DEFAULT(supported); \
                } \
                \
                if (rs_array) { \
@@ -170,22 +187,16 @@ PHP_FUNCTION(http_build_str)
                FREE_HASHTABLE(result); \
                \
        } else { \
-               zval **value; \
-                \
-               zend_hash_internal_pointer_reset(Z_ARRVAL_P(supported)); \
-               if (SUCCESS == zend_hash_get_current_data(Z_ARRVAL_P(supported), (void *) &value)) { \
-                       RETVAL_ZVAL(*value, 1, 0); \
-               } else { \
-                       RETVAL_NULL(); \
-               } \
+               HTTP_DO_NEGOTIATE_DEFAULT(supported); \
                \
                if (rs_array) { \
                        HashPosition pos; \
-                       zval **value; \
+                       zval **value_ptr; \
                         \
-                       FOREACH_VAL(pos, supported, value) { \
-                               convert_to_string_ex(value); \
-                               add_assoc_double(rs_array, Z_STRVAL_PP(value), 1.0); \
+                       FOREACH_VAL(pos, supported, value_ptr) { \
+                               zval *value = http_zsep(IS_STRING, *value_ptr); \
+                               add_assoc_double(rs_array, Z_STRVAL_P(value), 1.0); \
+                               zval_ptr_dtor(&value); \
                        } \
                } \
        } \
@@ -229,7 +240,7 @@ PHP_FUNCTION(http_negotiate_charset)
 }
 /* }}} */
 
-/* {{{ proto string http_negotiate_ctype(array supported[, array &result])
+/* {{{ proto string http_negotiate_content_type(array supported[, array &result])
        Negotiate the clients preferred content type. */
 PHP_FUNCTION(http_negotiate_content_type)
 {
@@ -252,7 +263,7 @@ PHP_FUNCTION(http_negotiate_content_type)
        Send HTTP status code. */
 PHP_FUNCTION(http_send_status)
 {
-       int status = 0;
+       long status = 0;
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &status) != SUCCESS) {
                RETURN_FALSE;
@@ -488,7 +499,7 @@ PHP_FUNCTION(http_redirect)
                }
        }
 
-       URI = http_absolute_url(url);
+       URI = http_absolute_url_ex(url, HTTP_URL_FROM_ENV);
 
        if (query_len) {
                spprintf(&LOC, 0, "Location: %s?%s", URI, query);
@@ -671,10 +682,9 @@ PHP_FUNCTION(http_parse_cookie)
        if (allowed_extras_array) {
                allowed_extras = ecalloc(zend_hash_num_elements(Z_ARRVAL_P(allowed_extras_array)) + 1, sizeof(char *));
                FOREACH_VAL(pos, allowed_extras_array, entry) {
-                       ZVAL_ADDREF(*entry);
-                       convert_to_string_ex(entry);
-                       allowed_extras[i++] = estrndup(Z_STRVAL_PP(entry), Z_STRLEN_PP(entry));
-                       zval_ptr_dtor(entry);
+                       zval *data = http_zsep(IS_STRING, *entry);
+                       allowed_extras[i++] = estrndup(Z_STRVAL_P(data), Z_STRLEN_P(data));
+                       zval_ptr_dtor(&data);
                }
        }
        
@@ -729,15 +739,18 @@ PHP_FUNCTION(http_parse_params)
                RETURN_FALSE;
        }
        
-       params = ecalloc(1, sizeof(zval));
+       MAKE_STD_ZVAL(params);
        array_init(params);
        if (SUCCESS != http_parse_params(param, flags, Z_ARRVAL_P(params))) {
-               zval_dtor(params);
-               FREE_ZVAL(params);
+               zval_ptr_dtor(&params);
                RETURN_FALSE;
        }
+       
        object_init(return_value);
        add_property_zval(return_value, "params", params);
+#ifdef ZEND_ENGINE_2
+       zval_ptr_dtor(&params);
+#endif
 }
 /* }}} */
 
@@ -802,15 +815,10 @@ PHP_FUNCTION(http_match_request_header)
 }
 /* }}} */
 
-/* {{{ HAVE_CURL */
-#ifdef HTTP_HAVE_CURL
-#ifdef HTTP_HAVE_PERSISTENT_HANDLES
-
 /* {{{ proto object http_persistent_handles_count() */
 PHP_FUNCTION(http_persistent_handles_count)
 {
        NO_ARGS;
-       
        object_init(return_value);
        if (!http_persistent_handle_statall_ex(HASH_OF(return_value))) {
                zval_dtor(return_value);
@@ -826,19 +834,35 @@ PHP_FUNCTION(http_persistent_handles_clean)
        int name_len = 0;
        
        if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &name_str, &name_len)) {
-               http_persistent_handle_cleanup_ex(name_str, name_len);
+               http_persistent_handle_cleanup_ex(name_str, name_len, 1);
        }
 }
 /* }}} */
 
-#endif /* HTTP_HAVE_PERSISTENT_HANDLES */
+/* {{{ proto string http_persistent_handles_ident([string ident]) */
+PHP_FUNCTION(http_persistent_handles_ident)
+{
+       char *ident_str = NULL;
+       int ident_len = 0;
+       
+       if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &ident_str, &ident_len)) {
+               RETVAL_STRING(zend_ini_string(ZEND_STRS("http.persistent.handles.ident"), 0), 1);
+               if (ident_str && ident_len) {
+                       zend_alter_ini_entry(ZEND_STRS("http.persistent.handles.ident"), ident_str, ident_len, ZEND_INI_USER, PHP_INI_STAGE_RUNTIME);
+               }
+       }
+}
+/* }}} */
+
+/* {{{ HAVE_CURL */
+#ifdef HTTP_HAVE_CURL
 
 #define RETVAL_RESPONSE_OR_BODY(request) \
        { \
                zval **bodyonly; \
                 \
                /* check if only the body should be returned */ \
-               if (options && (SUCCESS == zend_hash_find(Z_ARRVAL_P(options), "bodyonly", sizeof("bodyonly"), (void *) &bodyonly)) && zval_is_true(*bodyonly)) { \
+               if (options && (SUCCESS == zend_hash_find(Z_ARRVAL_P(options), "bodyonly", sizeof("bodyonly"), (void *) &bodyonly)) && i_zend_is_true(*bodyonly)) { \
                        http_message *msg = http_message_parse(PHPSTR_VAL(&request.conv.response), PHPSTR_LEN(&request.conv.response)); \
                         \
                        if (msg) { \