+void php_http_header_to_callback_ex(const char *key, zval *val, zend_bool crlf, php_http_pass_format_callback_t cb, void *cb_arg)
+{
+ zval *aval;
+ zend_string *str;
+
+ ZVAL_DEREF(val);
+ switch (Z_TYPE_P(val)) {
+ case IS_ARRAY:
+ ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(val), aval)
+ {
+ php_http_header_to_callback_ex(key, aval, crlf, cb, cb_arg);
+ }
+ ZEND_HASH_FOREACH_END();
+ break;
+
+ case IS_TRUE:
+ cb(cb_arg, "%s: true%s", key, crlf ? PHP_HTTP_CRLF:"");
+ break;
+
+ case IS_FALSE:
+ cb(cb_arg, "%s: false%s", key, crlf ? PHP_HTTP_CRLF:"");
+ break;
+
+ default:
+ str = zval_get_string(val);
+ cb(cb_arg, "%s: %s%s", key, str->val, crlf ? PHP_HTTP_CRLF:"");
+ zend_string_release(str);
+ break;
+ }
+}
+
+void php_http_header_to_string_ex(php_http_buffer_t *str, const char *key, zval *val)
+{
+ php_http_header_to_callback_ex(key, val, 1, (php_http_pass_format_callback_t) php_http_buffer_appendf, str);
+}
+