- update test files
[m6w6/ext-http] / http_api.c
index f8f93e161b3364b772fcf0896bfc1f01382d0d34..4e304af3628c16b97abf46288b96b42540ceb2f9 100644 (file)
@@ -267,11 +267,26 @@ STATUS _http_check_method_ex(const char *method, const char *methods)
 /* {{{ zval *http_get_server_var_ex(char *, size_t) */
 PHP_HTTP_API zval *_http_get_server_var_ex(const char *key, size_t key_size, zend_bool check TSRMLS_DC)
 {
-       zval **hsv;
-       zval **var;
+       zval **hsv, **var;
+       char *env;
+       
+       /* if available, this is a lot faster than accessing $_SERVER */
+       if (sapi_module.getenv) {
+               if ((!(env = sapi_module.getenv((char *) key, key_size TSRMLS_CC))) || (check && !*env)) {
+                       return NULL;
+               }
+               if (HTTP_G->server_var) {
+                       zval_ptr_dtor(&HTTP_G->server_var);
+               }
+               MAKE_STD_ZVAL(HTTP_G->server_var);
+               ZVAL_STRING(HTTP_G->server_var, env, 1);
+               return HTTP_G->server_var;
+       }
+       
 #ifdef ZEND_ENGINE_2
        zend_is_auto_global("_SERVER", lenof("_SERVER") TSRMLS_CC);
 #endif
+       
        if ((SUCCESS != zend_hash_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER"), (void *) &hsv)) || (Z_TYPE_PP(hsv) != IS_ARRAY)) {
                return NULL;
        }
@@ -584,6 +599,70 @@ failure:
 }
 /* }}} */
 
+/* {{{ array_join */
+int apply_array_append_func(void *pDest, int num_args, va_list args, zend_hash_key *hash_key)
+{
+       int flags;
+       char *key = NULL;
+       HashTable *dst;
+       zval **data = NULL, **value = (zval **) pDest;
+       
+       dst = va_arg(args, HashTable *);
+       flags = va_arg(args, int);
+       
+       if ((!(flags & ARRAY_JOIN_STRONLY)) || hash_key->nKeyLength) {
+               if ((flags & ARRAY_JOIN_PRETTIFY) && hash_key->nKeyLength) {
+                       key = pretty_key(estrndup(hash_key->arKey, hash_key->nKeyLength - 1), hash_key->nKeyLength - 1, 1, 1);
+                       zend_hash_find(dst, key, hash_key->nKeyLength, (void *) &data);
+               } else {
+                       zend_hash_quick_find(dst, hash_key->arKey, hash_key->nKeyLength, hash_key->h, (void *) &data);
+               }
+               
+               ZVAL_ADDREF(*value);
+               if (data) {
+                       if (Z_TYPE_PP(data) != IS_ARRAY) {
+                               convert_to_array(*data);
+                       }
+                       add_next_index_zval(*data, *value);
+               } else if (key) {
+                       zend_hash_add(dst, key, hash_key->nKeyLength, value, sizeof(zval *), NULL);
+               } else {
+                       zend_hash_quick_add(dst, hash_key->arKey, hash_key->nKeyLength, hash_key->h, value, sizeof(zval *), NULL);
+               }
+               
+               if (key) {
+                       efree(key);
+               }
+       }
+       
+       return ZEND_HASH_APPLY_KEEP;
+}
+
+int apply_array_merge_func(void *pDest, int num_args, va_list args, zend_hash_key *hash_key)
+{
+       int flags;
+       char *key = NULL;
+       HashTable *dst;
+       zval **value = (zval **) pDest;
+       
+       dst = va_arg(args, HashTable *);
+       flags = va_arg(args, int);
+       
+       if ((!(flags & ARRAY_JOIN_STRONLY)) || hash_key->nKeyLength) {
+               ZVAL_ADDREF(*value);
+               if ((flags & ARRAY_JOIN_PRETTIFY) && hash_key->nKeyLength) {
+                       key = pretty_key(estrndup(hash_key->arKey, hash_key->nKeyLength - 1), hash_key->nKeyLength - 1, 1, 1);
+                       zend_hash_update(dst, key, hash_key->nKeyLength, (void *) value, sizeof(zval *), NULL);
+                       efree(key);
+               } else {
+                       zend_hash_quick_update(dst, hash_key->arKey, hash_key->nKeyLength, hash_key->h, (void *) value, sizeof(zval *), NULL);
+               }
+       }
+       
+       return ZEND_HASH_APPLY_KEEP;
+}
+/* }}} */
+
 /*
  * Local variables:
  * tab-width: 4