PHP_HTTP_ARG_VAL(code, 0)
PHP_HTTP_END_ARGS;
+PHP_HTTP_EMPTY_ARGS(getResponseStatusForAllCodes);
+
PHP_HTTP_BEGIN_ARGS(getResponseHeader, 0)
PHP_HTTP_ARG_VAL(header_name, 0)
PHP_HTTP_END_ARGS;
PHP_HTTP_ENV_ME(getRequestBody)
PHP_HTTP_ENV_ME(getResponseStatusForCode)
+ PHP_HTTP_ENV_ME(getResponseStatusForAllCodes)
PHP_HTTP_ENV_ME(getResponseHeader)
PHP_HTTP_ENV_ME(getResponseCode)
RETURN_FALSE;
}
+PHP_METHOD(HttpEnv, getResponseStatusForAllCodes)
+{
+ const char *s;
+ unsigned c;
+ php_http_strlist_iterator_t i;
+
+ if (SUCCESS != zend_parse_parameters_none()) {
+ RETURN_FALSE;
+ }
+
+ array_init(return_value);
+ for ( php_http_strlist_iterator_init(&i, php_http_env_response_status, 100);
+ *(s = php_http_strlist_iterator_this(&i, &c));
+ php_http_strlist_iterator_next(&i)
+ ) {
+ add_index_string(return_value, c, s, 1);
+ }
+}
+
PHP_METHOD(HttpEnv, getResponseHeader)
{
char *header_name_str = NULL;
#include "php_http_api.h"
+static zval *message_header_strval(zval **header TSRMLS_DC);
+static void message_headers(php_http_message_t *msg, php_http_buffer_t *str);
+
PHP_HTTP_API zend_bool php_http_message_info_callback(php_http_message_t **message, HashTable **headers, php_http_info_t *info TSRMLS_DC)
{
php_http_message_t *old = *message;
if (SUCCESS == zend_symtable_find(&msg->hdrs, key, key_len + 1, (void *) &header)) {
if (join && Z_TYPE_PP(header) == IS_ARRAY) {
- zval *header_str, **val;
- HashPosition pos;
- php_http_buffer_t str;
TSRMLS_FETCH_FROM_CTX(msg->ts);
- php_http_buffer_init(&str);
- MAKE_STD_ZVAL(header_str);
- FOREACH_VAL(pos, *header, val) {
- zval *strval = php_http_ztyp(IS_STRING, *val);
- php_http_buffer_appendf(&str, PHP_HTTP_BUFFER_LEN(&str) ? ", %s":"%s", Z_STRVAL_P(strval));
- zval_ptr_dtor(&strval);
- }
- php_http_buffer_fix(&str);
- ZVAL_STRINGL(header_str, PHP_HTTP_BUFFER_VAL(&str), PHP_HTTP_BUFFER_LEN(&str), 0);
- ret = header_str;
+ ret = message_header_strval(header TSRMLS_CC);
} else {
Z_ADDREF_PP(header);
ret = *header;
}
}
}
-static inline void message_headers(php_http_message_t *msg, php_http_buffer_t *str)
+
+static zval *message_header_strval(zval **header TSRMLS_DC)
+{
+ zval *ret;
+
+ if (Z_TYPE_PP(header) == IS_BOOL) {
+ MAKE_STD_ZVAL(ret);
+ ZVAL_STRING(ret, Z_BVAL_PP(header) ? "true" : "false", 1);
+ } else if (Z_TYPE_PP(header) == IS_ARRAY) {
+ zval **val;
+ HashPosition pos;
+ php_http_buffer_t str;
+
+ php_http_buffer_init(&str);
+ MAKE_STD_ZVAL(ret);
+ FOREACH_VAL(pos, *header, val) {
+ zval *strval = message_header_strval(val TSRMLS_CC);
+
+ php_http_buffer_appendf(&str, PHP_HTTP_BUFFER_LEN(&str) ? ", %s":"%s", Z_STRVAL_P(strval));
+ zval_ptr_dtor(&strval);
+ }
+ php_http_buffer_fix(&str);
+ ZVAL_STRINGL(ret, PHP_HTTP_BUFFER_VAL(&str), PHP_HTTP_BUFFER_LEN(&str), 0);
+ } else {
+ ret = php_http_zsep(1, IS_STRING, *header);
+ }
+
+ return ret;
+}
+
+static void message_headers(php_http_message_t *msg, php_http_buffer_t *str)
{
php_http_array_hashkey_t key = php_http_array_hashkey_init(0);
HashPosition pos1;
FOREACH_HASH_KEYVAL(pos1, &msg->hdrs, key, header) {
if (key.type == HASH_KEY_IS_STRING) {
- HashPosition pos2;
- zval **single_header;
-
- switch (Z_TYPE_PP(header)) {
- case IS_BOOL:
- php_http_buffer_appendf(str, "%s: %s" PHP_HTTP_CRLF, key.str, Z_BVAL_PP(header)?"true":"false");
- break;
-
- case IS_LONG:
- php_http_buffer_appendf(str, "%s: %ld" PHP_HTTP_CRLF, key.str, Z_LVAL_PP(header));
- break;
-
- case IS_DOUBLE:
- php_http_buffer_appendf(str, "%s: %F" PHP_HTTP_CRLF, key.str, Z_DVAL_PP(header));
- break;
-
- case IS_STRING:
- if (Z_STRVAL_PP(header)[Z_STRLEN_PP(header)-1] == '\r') fprintf(stderr, "DOH!\n");
- php_http_buffer_appendf(str, "%s: %s" PHP_HTTP_CRLF, key.str, Z_STRVAL_PP(header));
- break;
-
- case IS_ARRAY:
- FOREACH_VAL(pos2, *header, single_header) {
- switch (Z_TYPE_PP(single_header)) {
- case IS_BOOL:
- php_http_buffer_appendf(str, "%s: %s" PHP_HTTP_CRLF, key.str, Z_BVAL_PP(single_header)?"true":"false");
- break;
-
- case IS_LONG:
- php_http_buffer_appendf(str, "%s: %ld" PHP_HTTP_CRLF, key.str, Z_LVAL_PP(single_header));
- break;
-
- case IS_DOUBLE:
- php_http_buffer_appendf(str, "%s: %F" PHP_HTTP_CRLF, key.str, Z_DVAL_PP(single_header));
- break;
-
- case IS_STRING:
- php_http_buffer_appendf(str, "%s: %s" PHP_HTTP_CRLF, key.str, Z_STRVAL_PP(single_header));
- break;
+ if (key.len == sizeof("Set-Cookie") && !strcasecmp(key.str, "Set-Cookie") && Z_TYPE_PP(header) == IS_ARRAY) {
+ HashPosition pos2;
+ zval **single_header;
+
+ FOREACH_VAL(pos2, *header, single_header) {
+ if (Z_TYPE_PP(single_header) == IS_ARRAY) {
+ php_http_cookie_list_t *cookie = php_http_cookie_list_from_struct(NULL, *single_header TSRMLS_CC);
+
+ if (cookie) {
+ char *buf;
+ size_t len;
+
+ php_http_cookie_list_to_string(cookie, &buf, &len);
+ php_http_buffer_appendf(str, "Set-Cookie: %s" PHP_HTTP_CRLF, buf);
+ php_http_cookie_list_free(&cookie);
+ efree(buf);
}
+ } else {
+ zval *strval = message_header_strval(single_header TSRMLS_CC);
+
+ php_http_buffer_appendf(str, "Set-Cookie: %s" PHP_HTTP_CRLF, Z_STRVAL_P(strval));
+ zval_ptr_dtor(&strval);
}
- break;
+ }
+ } else {
+ zval *strval = message_header_strval(header TSRMLS_CC);
+
+ php_http_buffer_appendf(str, "%s: %s" PHP_HTTP_CRLF, key.str, Z_STRVAL_P(strval));
+ zval_ptr_dtor(&strval);
}
}
}