| modification, are permitted provided that the conditions mentioned |
| in the accompanying LICENSE file are met. |
+--------------------------------------------------------------------+
- | Copyright (c) 2004-2013, Michael Wallner <mike@php.net> |
+ | Copyright (c) 2004-2014, Michael Wallner <mike@php.net> |
+--------------------------------------------------------------------+
*/
zval_dtor(&tval);
}
}
+#else
+ if (OG(ob_nesting_level)) {
+ if (php_get_output_start_filename(TSRMLS_C)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not fetch response body, output has already been sent at %s:%d", php_get_output_start_filename(TSRMLS_C), php_get_output_start_lineno(TSRMLS_C));
+ goto error;
+ } else if (SUCCESS != php_ob_get_buffer(&tval TSRMLS_CC)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not fetch response body");
+ goto error;
+ } else {
+ php_http_message_body_append(message->body, Z_STRVAL(tval), Z_STRLEN(tval));
+ zval_dtor(&tval);
+ }
+ }
#endif
break;
zval *php_http_message_header(php_http_message_t *msg, const char *key_str, size_t key_len, int join)
{
zval *ret = NULL, **header;
- char *key = php_http_pretty_key(estrndup(key_str, key_len), key_len, 1, 1);
+ char *key;
+ ALLOCA_FLAG(free_key);
+
+ key = do_alloca(key_len + 1, free_key);
+ memcpy(key, key_str, key_len);
+ key[key_len] = '\0';
+ php_http_pretty_key(key, key_len, 1, 1);
if (SUCCESS == zend_symtable_find(&msg->hdrs, key, key_len + 1, (void *) &header)) {
if (join && Z_TYPE_PP(header) == IS_ARRAY) {
}
}
- efree(key);
+ free_alloca(key, free_key);
return ret;
}
zval_ptr_dtor(&h);
}
}
+ } else if ((h = php_http_message_header(msg, ZEND_STRL("Content-Length"), 1))) {
+ zval *h_cpy = php_http_ztyp(IS_LONG, h);
+
+ zval_ptr_dtor(&h);
+ if (Z_LVAL_P(h_cpy)) {
+ zend_hash_del(&msg->hdrs, "Content-Length", sizeof("Content-Length"));
+ }
+ zval_ptr_dtor(&h_cpy);
}
}
}
body_obj = zend_object_store_get_object(zbody TSRMLS_CC);
-
+ if (!body_obj->body) {
+ body_obj->body = php_http_message_body_init(NULL, NULL TSRMLS_CC);
+ }
if (msg_obj->body) {
zend_objects_store_del_ref_by_handle(msg_obj->body->zv.handle TSRMLS_CC);
}
STATUS php_http_message_object_init_body_object(php_http_message_object_t *obj)
{
- TSRMLS_FETCH_FROM_CTX(obj);
+ TSRMLS_FETCH_FROM_CTX(obj->message->ts);
php_http_message_body_addref(obj->message->body);
return php_http_new(NULL, php_http_message_body_class_entry, (php_http_new_t) php_http_message_body_object_new_ex, NULL, obj->message->body, (void *) &obj->body TSRMLS_CC);
{
zval *headers;
php_http_message_object_t *obj = zend_object_store_get_object(object TSRMLS_CC);
- php_http_message_t *msg = obj->message;
HashTable *props = zend_get_std_object_handlers()->get_properties(object TSRMLS_CC);
zval array, *parent, *body;
char *version;
+ int verlen;
PHP_HTTP_MESSAGE_OBJECT_INIT(obj);
-
INIT_PZVAL_ARRAY(&array, props);
#define ASSOC_PROP(ptype, n, val) \
} \
} while(0)
- ASSOC_PROP(long, "type", msg->type);
- ASSOC_STRINGL_EX("httpVersion", version, spprintf(&version, 0, "%u.%u", msg->http.version.major, msg->http.version.minor), 0);
+ ASSOC_PROP(long, "type", obj->message->type);
+ verlen = spprintf(&version, 0, "%u.%u", obj->message->http.version.major, obj->message->http.version.minor);
+ ASSOC_STRINGL_EX("httpVersion", version, verlen, 0);
- switch (msg->type) {
+ switch (obj->message->type) {
case PHP_HTTP_REQUEST:
ASSOC_PROP(long, "responseCode", 0);
ASSOC_STRINGL("responseStatus", "", 0);
- ASSOC_STRING("requestMethod", STR_PTR(msg->http.info.request.method));
- ASSOC_STRING("requestUrl", STR_PTR(msg->http.info.request.url));
+ ASSOC_STRING("requestMethod", STR_PTR(obj->message->http.info.request.method));
+ ASSOC_STRING("requestUrl", STR_PTR(obj->message->http.info.request.url));
break;
case PHP_HTTP_RESPONSE:
- ASSOC_PROP(long, "responseCode", msg->http.info.response.code);
- ASSOC_STRING("responseStatus", STR_PTR(msg->http.info.response.status));
+ ASSOC_PROP(long, "responseCode", obj->message->http.info.response.code);
+ ASSOC_STRING("responseStatus", STR_PTR(obj->message->http.info.response.status));
ASSOC_STRINGL("requestMethod", "", 0);
ASSOC_STRINGL("requestUrl", "", 0);
break;
MAKE_STD_ZVAL(headers);
array_init(headers);
- zend_hash_copy(Z_ARRVAL_P(headers), &msg->hdrs, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
+ zend_hash_copy(Z_ARRVAL_P(headers), &obj->message->hdrs, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
ASSOC_PROP(zval, "headers", headers);
MAKE_STD_ZVAL(body);
- if (!obj->body) {
- php_http_new(NULL, php_http_message_body_class_entry, (php_http_new_t) php_http_message_body_object_new_ex, NULL, (void *) php_http_message_body_init(&obj->message->body, NULL TSRMLS_CC), (void *) &obj->body TSRMLS_CC);
+ if (obj->body) {
+ ZVAL_OBJVAL(body, obj->body->zv, 1);
+ } else {
+ ZVAL_NULL(body);
}
- ZVAL_OBJVAL(body, obj->body->zv, 1);
ASSOC_PROP(zval, "body", body);
MAKE_STD_ZVAL(parent);
- if (msg->parent) {
+ if (obj->message->parent) {
ZVAL_OBJVAL(parent, obj->parent->zv, 1);
} else {
ZVAL_NULL(parent);
if (s && php_http_message_parser_init(&p TSRMLS_CC)) {
unsigned flags = (greedy ? PHP_HTTP_MESSAGE_PARSER_GREEDY : 0);
+ php_http_buffer_t buf;
- if (PHP_HTTP_MESSAGE_PARSER_STATE_FAILURE == php_http_message_parser_parse_stream(&p, s, flags, &msg)) {
+ php_http_buffer_init_ex(&buf, 0x1000, PHP_HTTP_BUFFER_INIT_PREALLOC);
+ if (PHP_HTTP_MESSAGE_PARSER_STATE_FAILURE == php_http_message_parser_parse_stream(&p, &buf, s, flags, &msg)) {
if (!EG(exception)) {
php_http_throw(bad_message, "Could not parse message from stream", NULL);
}
}
-
+ php_http_buffer_dtor(&buf);
php_http_message_parser_dtor(&p);
}
ZEND_END_ARG_INFO();
static PHP_METHOD(HttpMessage, count)
{
- if (SUCCESS == zend_parse_parameters_none()) {
+ long count_mode = -1;
+
+ if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &count_mode)) {
long i = 0;
php_http_message_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);