-#define http_urlencode_hash_implementation(ht, formstr, argsep) \
- http_urlencode_hash_implementation_ex((ht), (formstr), (argsep), NULL, 0, NULL, 0, NULL, 0, NULL)
-#define http_urlencode_hash_implementation_ex(ht, formstr, argsep, np, npl, kp, kpl, ks, ksl, type) \
- _http_urlencode_hash_implementation_ex((ht), (formstr), (argsep), (np), (npl), (kp), (kpl), (ks), (ksl), (type) TSRMLS_CC)
-PHP_HTTP_API STATUS _http_urlencode_hash_implementation_ex(
- HashTable *ht, phpstr *formstr, char *arg_sep,
- const char *num_prefix, int num_prefix_len,
- const char *key_prefix, int key_prefix_len,
- const char *key_suffix, int key_suffix_len,
- zval *type TSRMLS_DC);
+#define http_urlencode_hash_recursive(ht, s, as, al, pr, pl) _http_urlencode_hash_recursive((ht), (s), (as), (al), (pr), (pl) TSRMLS_CC)
+PHP_HTTP_API STATUS _http_urlencode_hash_recursive(HashTable *ht, phpstr *str, const char *arg_sep, size_t arg_sep_len, const char *prefix, size_t prefix_len TSRMLS_DC);
+
+#define http_url_from_struct(u, ht) _http_url_from_struct((u), (ht) TSRMLS_CC)
+static inline php_url *_http_url_from_struct(php_url *url, HashTable *ht TSRMLS_DC)
+{
+ zval **e;
+
+ if (!url) {
+ url = ecalloc(1, sizeof(php_url));
+ }
+
+ if ((SUCCESS == zend_hash_find(ht, "scheme", sizeof("scheme"), (void *) &e))
+ && (Z_TYPE_PP(e) == IS_STRING) && Z_STRLEN_PP(e)) {
+ url->scheme = estrndup(Z_STRVAL_PP(e), Z_STRLEN_PP(e));
+ }
+ if ((SUCCESS == zend_hash_find(ht, "user", sizeof("user"), (void *) &e))
+ && (Z_TYPE_PP(e) == IS_STRING) && Z_STRLEN_PP(e)) {
+ url->user = estrndup(Z_STRVAL_PP(e), Z_STRLEN_PP(e));
+ }
+ if ((SUCCESS == zend_hash_find(ht, "pass", sizeof("pass"), (void *) &e))
+ && (Z_TYPE_PP(e) == IS_STRING) && Z_STRLEN_PP(e)) {
+ url->pass = estrndup(Z_STRVAL_PP(e), Z_STRLEN_PP(e));
+ }
+ if ((SUCCESS == zend_hash_find(ht, "host", sizeof("host"), (void *) &e))
+ && (Z_TYPE_PP(e) == IS_STRING) && Z_STRLEN_PP(e)) {
+ url->host = estrndup(Z_STRVAL_PP(e), Z_STRLEN_PP(e));
+ }
+ if ((SUCCESS == zend_hash_find(ht, "path", sizeof("path"), (void *) &e))
+ && (Z_TYPE_PP(e) == IS_STRING) && Z_STRLEN_PP(e)) {
+ url->path = estrndup(Z_STRVAL_PP(e), Z_STRLEN_PP(e));
+ }
+ if ((SUCCESS == zend_hash_find(ht, "query", sizeof("query"), (void *) &e))
+ && (Z_TYPE_PP(e) == IS_STRING) && Z_STRLEN_PP(e)) {
+ url->query = estrndup(Z_STRVAL_PP(e), Z_STRLEN_PP(e));
+ }
+ if ((SUCCESS == zend_hash_find(ht, "fragment", sizeof("fragment"), (void *) &e))
+ && (Z_TYPE_PP(e) == IS_STRING) && Z_STRLEN_PP(e)) {
+ url->fragment = estrndup(Z_STRVAL_PP(e), Z_STRLEN_PP(e));
+ }
+ if (SUCCESS == zend_hash_find(ht, "port", sizeof("port"), (void *) &e)) {
+ if (Z_TYPE_PP(e) == IS_LONG) {
+ url->port = (unsigned short) Z_LVAL_PP(e);
+ } else {
+ zval *o = *e;
+
+ convert_to_long_ex(e);
+ url->port = (unsigned short) Z_LVAL_PP(e);
+ if (o != *e) zval_ptr_dtor(e);
+ }
+ }
+
+ return url;
+}