- avoid lots of useless ops
[m6w6/ext-http] / http_functions.c
index a6542c2c31db4336fa79e722c44fe6298303b452..63a3423bb52341443cecb476bf8caf2d60926af1 100644 (file)
@@ -20,6 +20,8 @@
 #endif
 #include "php.h"
 
+#include "zend_operators.h"
+
 #include "SAPI.h"
 #include "php_ini.h"
 #include "ext/standard/info.h"
@@ -31,9 +33,9 @@
 #include "php_http.h"
 #include "php_http_std_defs.h"
 #include "php_http_api.h"
-#include "php_http_auth_api.h"
 #include "php_http_request_api.h"
 #include "php_http_cache_api.h"
+#include "php_http_request_method_api.h"
 #include "php_http_request_api.h"
 #include "php_http_date_api.h"
 #include "php_http_headers_api.h"
@@ -98,11 +100,54 @@ PHP_FUNCTION(http_absolute_uri)
 }
 /* }}} */
 
-/* {{{ proto string http_negotiate_language(array supported[, string default = 'en-US'])
+#define HTTP_DO_NEGOTIATE(type, supported, as_array) \
+{ \
+       HashTable *result; \
+       if (result = http_negotiate_ ##type(supported)) { \
+               if (as_array) { \
+                       Z_TYPE_P(return_value) = IS_ARRAY; \
+                       Z_ARRVAL_P(return_value) = result; \
+               } else { \
+                       char *key; \
+                       uint key_len; \
+                       ulong idx; \
+                        \
+                       if (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(); \
+                       } \
+                       zend_hash_destroy(result); \
+               } \
+       } else { \
+               if (as_array) { \
+                       zval **value; \
+                        \
+                       array_init(return_value); \
+                        \
+                       FOREACH_VAL(supported, value) { \
+                               convert_to_string_ex(value); \
+                               add_assoc_double(return_value, Z_STRVAL_PP(value), 1.0); \
+                       } \
+               } 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(); \
+                       } \
+               } \
+       } \
+}
+
+
+/* {{{ proto string http_negotiate_language(array supported[, bool return_quality_array = false])
  *
  * This function negotiates the clients preferred language based on its
  * Accept-Language HTTP header.  It returns the negotiated language or
- * the default language if none match.
+ * the default language (i.e. first array entry) if none match.
  *
  * The qualifier is recognized and languages without qualifier are rated highest.
  *
@@ -129,26 +174,21 @@ PHP_FUNCTION(http_absolute_uri)
 PHP_FUNCTION(http_negotiate_language)
 {
        zval *supported;
-       char *def = NULL;
-       int def_len = 0;
+       zend_bool as_array = 0;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|s", &supported, &def, &def_len) != SUCCESS) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|b", &supported, &as_array) != SUCCESS) {
                RETURN_FALSE;
        }
-
-       if (!def) {
-               def = "en-US";
-       }
-
-       RETURN_STRING(http_negotiate_language(supported, def), 0);
+       
+       HTTP_DO_NEGOTIATE(language, supported, as_array);
 }
 /* }}} */
 
-/* {{{ proto string http_negotiate_charset(array supported[, string default = 'iso-8859-1'])
+/* {{{ proto string http_negotiate_charset(array supported)
  *
  * This function negotiates the clients preferred charset based on its
  * Accept-Charset HTTP header.  It returns the negotiated charset or
- * the default charset if none match.
+ * the default charset (i.e. first array entry) if none match.
  *
  * The qualifier is recognized and charset without qualifier are rated highest.
  *
@@ -176,18 +216,13 @@ PHP_FUNCTION(http_negotiate_language)
 PHP_FUNCTION(http_negotiate_charset)
 {
        zval *supported;
-       char *def = NULL;
-       int def_len = 0;
+       zend_bool as_array = 0;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|s", &supported, &def, &def_len) != SUCCESS) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|b", &supported, &as_array) != SUCCESS) {
                RETURN_FALSE;
        }
 
-       if (!def) {
-               def = "iso-8859-1";
-       }
-
-       RETURN_STRING(http_negotiate_charset(supported, def), 0);
+       HTTP_DO_NEGOTIATE(charset, supported, as_array);
 }
 /* }}} */
 
@@ -408,7 +443,7 @@ PHP_FUNCTION(ob_etaghandler)
        }
 
        Z_TYPE_P(return_value) = IS_STRING;
-       http_ob_etaghandler(data, data_len, &Z_STRVAL_P(return_value), &Z_STRLEN_P(return_value), mode);
+       http_ob_etaghandler(data, data_len, &Z_STRVAL_P(return_value), (uint *) &Z_STRLEN_P(return_value), mode);
 }
 /* }}} */
 
@@ -615,14 +650,15 @@ PHP_FUNCTION(http_send_stream)
 PHP_FUNCTION(http_chunked_decode)
 {
        char *encoded = NULL, *decoded = NULL;
-       int encoded_len = 0, decoded_len = 0;
+       size_t decoded_len = 0;
+       int encoded_len = 0;
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &encoded, &encoded_len) != SUCCESS) {
                RETURN_FALSE;
        }
 
        if (NULL != http_chunked_decode(encoded, encoded_len, &decoded, &decoded_len)) {
-               RETURN_STRINGL(decoded, decoded_len, 0);
+               RETURN_STRINGL(decoded, (int) decoded_len, 0);
        } else {
                RETURN_FALSE;
        }
@@ -1046,6 +1082,8 @@ PHP_FUNCTION(http_put_stream)
        }
 }
 /* }}} */
+#endif /* HTTP_HAVE_CURL */
+/* }}} HAVE_CURL */
 
 /* {{{ proto long http_request_method_register(string method)
  *
@@ -1085,7 +1123,6 @@ PHP_FUNCTION(http_request_method_unregister)
                case IS_OBJECT:
                        convert_to_string(method);
                case IS_STRING:
-#include "zend_operators.h"
                        if (is_numeric_string(Z_STRVAL_P(method), Z_STRLEN_P(method), NULL, NULL, 1)) {
                                convert_to_long(method);
                        } else {
@@ -1153,118 +1190,6 @@ PHP_FUNCTION(http_request_method_name)
        }
 }
 /* }}} */
-#endif
-/* }}} HAVE_CURL */
-
-
-/* {{{ proto bool http_auth_basic(string user, string pass[, string realm = "Restricted"])
- *
- * Example:
- * <pre>
- * <?php
- * if (!http_auth_basic('mike', 's3c|r3t')) {
- *     die('<h1>Authorization failed!</h1>');
- * }
- * ?>
- * </pre>
- */
-PHP_FUNCTION(http_auth_basic)
-{
-       char *realm = NULL, *user, *pass, *suser, *spass;
-       int r_len, u_len, p_len;
-
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|s", &user, &u_len, &pass, &p_len, &realm, &r_len) != SUCCESS) {
-               RETURN_FALSE;
-       }
-
-       if (!realm) {
-               realm = "Restricted";
-       }
-
-       if (SUCCESS != http_auth_basic_credentials(&suser, &spass)) {
-               http_auth_basic_header(realm);
-               RETURN_FALSE;
-       }
-
-       if (strcasecmp(suser, user)) {
-               http_auth_basic_header(realm);
-               RETURN_FALSE;
-       }
-
-       if (strcmp(spass, pass)) {
-               http_auth_basic_header(realm);
-               RETURN_FALSE;
-       }
-
-       RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto bool http_auth_basic_cb(mixed callback[, string realm = "Restricted"])
- *
- * Example:
- * <pre>
- * <?php
- * function auth_cb($user, $pass)
- * {
- *     global $db;
- *     $query = 'SELECT pass FROM users WHERE user='. $db->quoteSmart($user);
- *     if (strlen($realpass = $db->getOne($query)) {
- *         return $pass === $realpass;
- *     }
- *     return false;
- * }
- * if (!http_auth_basic_cb('auth_cb')) {
- *     die('<h1>Authorization failed</h1>');
- * }
- * ?>
- * </pre>
- */
-PHP_FUNCTION(http_auth_basic_cb)
-{
-       zval *cb;
-       char *realm = NULL, *user, *pass;
-       int r_len;
-
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|s", &cb, &realm, &r_len) != SUCCESS) {
-               RETURN_FALSE;
-       }
-
-       if (!realm) {
-               realm = "Restricted";
-       }
-
-       if (SUCCESS != http_auth_basic_credentials(&user, &pass)) {
-               http_auth_basic_header(realm);
-               RETURN_FALSE;
-       }
-       {
-               zval *zparams[2] = {NULL, NULL}, retval;
-               int result = 0;
-
-               MAKE_STD_ZVAL(zparams[0]);
-               MAKE_STD_ZVAL(zparams[1]);
-               ZVAL_STRING(zparams[0], user, 0);
-               ZVAL_STRING(zparams[1], pass, 0);
-
-               if (SUCCESS == call_user_function(EG(function_table), NULL, cb,
-                               &retval, 2, zparams TSRMLS_CC)) {
-                       result = Z_LVAL(retval);
-               }
-
-               efree(user);
-               efree(pass);
-               efree(zparams[0]);
-               efree(zparams[1]);
-
-               if (!result) {
-                       http_auth_basic_header(realm);
-               }
-
-               RETURN_BOOL(result);
-       }
-}
-/* }}}*/
 
 /* {{{ Sara Golemons http_build_query() */
 #ifndef ZEND_ENGINE_2