X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=php_http_message.c;h=9aa7d12ac4d3a5a7f1525d87d16480ed65a43c4a;hb=a5dac57bfda10f24d6f2fb5047b4c5408a97651d;hp=88fc5a60daaeb6ce303c3070e101d1e99d537404;hpb=eba42bcdd8a59dacc713f04e68d6293ab52861c6;p=m6w6%2Fext-http diff --git a/php_http_message.c b/php_http_message.c index 88fc5a6..9aa7d12 100644 --- a/php_http_message.c +++ b/php_http_message.c @@ -133,7 +133,7 @@ PHP_HTTP_API php_http_message_t *php_http_message_parse(php_http_message_t *msg, if (greedy) { flags |= PHP_HTTP_MESSAGE_PARSER_GREEDY; } - if (FAILURE == php_http_message_parser_parse(&p, &buf, flags, &msg)) { + if (PHP_HTTP_MESSAGE_PARSER_STATE_FAILURE == php_http_message_parser_parse(&p, &buf, flags, &msg)) { if (free_msg) { php_http_message_free(&msg); } @@ -610,7 +610,6 @@ PHP_HTTP_EMPTY_ARGS(splitMultipartBody); static zval *php_http_message_object_read_prop(zval *object, zval *member, int type PHP_HTTP_ZEND_LITERAL_DC TSRMLS_DC); static void php_http_message_object_write_prop(zval *object, zval *member, zval *value PHP_HTTP_ZEND_LITERAL_DC TSRMLS_DC); -static zval **php_http_message_object_get_prop_ptr(zval *object, zval *member PHP_HTTP_ZEND_LITERAL_DC TSRMLS_DC); static HashTable *php_http_message_object_get_props(zval *object TSRMLS_DC); static zend_class_entry *php_http_message_class_entry; @@ -689,11 +688,6 @@ static STATUS php_http_message_object_add_prophandler(const char *prop_str, size php_http_message_object_prophandler_t h = { read, write }; return zend_hash_add(&php_http_message_object_prophandlers, prop_str, prop_len + 1, (void *) &h, sizeof(h), NULL); } -/* -static int php_http_message_object_has_prophandler(const char *prop_str, size_t prop_len) { - return zend_hash_exists(&php_http_message_object_prophandlers, prop_str, prop_len + 1); -} -*/ static STATUS php_http_message_object_get_prophandler(const char *prop_str, size_t prop_len, php_http_message_object_prophandler_t **handler) { return zend_hash_find(&php_http_message_object_prophandlers, prop_str, prop_len + 1, (void *) handler); } @@ -824,7 +818,7 @@ PHP_MINIT_FUNCTION(http_message) php_http_message_object_handlers.read_property = php_http_message_object_read_prop; php_http_message_object_handlers.write_property = php_http_message_object_write_prop; php_http_message_object_handlers.get_properties = php_http_message_object_get_props; - php_http_message_object_handlers.get_property_ptr_ptr = php_http_message_object_get_prop_ptr; + php_http_message_object_handlers.get_property_ptr_ptr = NULL; zend_class_implements(php_http_message_class_entry TSRMLS_CC, 3, spl_ce_Countable, zend_ce_serializable, zend_ce_iterator); @@ -1088,21 +1082,6 @@ void php_http_message_object_free(void *object TSRMLS_DC) efree(o); } - -static zval **php_http_message_object_get_prop_ptr(zval *object, zval *member PHP_HTTP_ZEND_LITERAL_DC TSRMLS_DC) -{ - php_http_message_object_prophandler_t *handler; - zval *copy = php_http_ztyp(IS_STRING, member); - - if (SUCCESS == php_http_message_object_get_prophandler(Z_STRVAL_P(copy), Z_STRLEN_P(copy), &handler)) { - zval_ptr_dtor(©); - return &php_http_property_proxy_init(NULL, object, member, NULL TSRMLS_CC)->myself; - } - zval_ptr_dtor(©); - - return zend_get_std_object_handlers()->get_property_ptr_ptr(object, member PHP_HTTP_ZEND_LITERAL_CC TSRMLS_CC); -} - static zval *php_http_message_object_read_prop(zval *object, zval *member, int type PHP_HTTP_ZEND_LITERAL_DC TSRMLS_DC) { php_http_message_object_t *obj = zend_object_store_get_object(object TSRMLS_CC); @@ -1112,15 +1091,15 @@ static zval *php_http_message_object_read_prop(zval *object, zval *member, int t PHP_HTTP_MESSAGE_OBJECT_INIT(obj); if (SUCCESS == php_http_message_object_get_prophandler(Z_STRVAL_P(copy), Z_STRLEN_P(copy), &handler)) { - if (type == BP_VAR_R) { - ALLOC_ZVAL(return_value); - Z_SET_REFCOUNT_P(return_value, 0); - Z_UNSET_ISREF_P(return_value); + ALLOC_ZVAL(return_value); + Z_SET_REFCOUNT_P(return_value, 0); + Z_UNSET_ISREF_P(return_value); + if (type == BP_VAR_R) { handler->read(obj, return_value TSRMLS_CC); } else { - zend_error(E_ERROR, "Cannot access HttpMessage properties by reference or array key/index"); - return_value = NULL; + php_property_proxy_t *proxy = php_property_proxy_init(object, Z_STRVAL_P(copy), Z_STRLEN_P(copy) TSRMLS_CC); + RETVAL_OBJVAL(php_property_proxy_object_new_ex(php_property_proxy_get_class_entry(), proxy, NULL TSRMLS_CC), 0); } } else { return_value = zend_get_std_object_handlers()->read_property(object, member, type PHP_HTTP_ZEND_LITERAL_CC TSRMLS_CC); @@ -1148,7 +1127,6 @@ static void php_http_message_object_write_prop(zval *object, zval *member, zval zval_ptr_dtor(©); } - static HashTable *php_http_message_object_get_props(zval *object TSRMLS_DC) { zval *headers; @@ -1159,66 +1137,65 @@ static HashTable *php_http_message_object_get_props(zval *object TSRMLS_DC) char *version; PHP_HTTP_MESSAGE_OBJECT_INIT(obj); - + INIT_PZVAL_ARRAY(&array, props); + +#define ASSOC_PROP(ptype, n, val) \ + do { \ + zend_property_info *pi; \ + if (SUCCESS == zend_hash_find(&obj->zo.ce->properties_info, n, sizeof(n), (void *) &pi)) { \ + add_assoc_ ##ptype## _ex(&array, pi->name, pi->name_length + 1, val); \ + } \ + } while(0) \ -#define ASSOC_PROP(array, ptype, name, val) \ - { \ - char *m_prop_name; \ - int m_prop_len; \ - zend_mangle_property_name(&m_prop_name, &m_prop_len, "*", 1, name, lenof(name), 0); \ - add_assoc_ ##ptype## _ex(&array, m_prop_name, sizeof(name)+3, val); \ - efree(m_prop_name); \ - } -#define ASSOC_STRING(array, name, val) ASSOC_STRINGL(array, name, val, strlen(val)) -#define ASSOC_STRINGL(array, name, val, len) ASSOC_STRINGL_EX(array, name, val, len, 1) -#define ASSOC_STRINGL_EX(array, name, val, len, cpy) \ - { \ - char *m_prop_name; \ - int m_prop_len; \ - zend_mangle_property_name(&m_prop_name, &m_prop_len, "*", 1, name, lenof(name), 0); \ - add_assoc_stringl_ex(&array, m_prop_name, sizeof(name)+3, val, len, cpy); \ - efree(m_prop_name); \ - } +#define ASSOC_STRING(name, val) ASSOC_STRINGL(name, val, strlen(val)) +#define ASSOC_STRINGL(name, val, len) ASSOC_STRINGL_EX(name, val, len, 1) +#define ASSOC_STRINGL_EX(n, val, len, cpy) \ + do { \ + zend_property_info *pi; \ + if (SUCCESS == zend_hash_find(&obj->zo.ce->properties_info, n, sizeof(n), (void *) &pi)) { \ + add_assoc_stringl_ex(&array, pi->name, pi->name_length + 1, val, len, cpy); \ + } \ + } while(0) - ASSOC_PROP(array, long, "type", msg->type); - ASSOC_STRINGL_EX(array, "httpVersion", version, spprintf(&version, 0, "%u.%u", msg->http.version.major, msg->http.version.minor), 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); switch (msg->type) { case PHP_HTTP_REQUEST: - ASSOC_PROP(array, long, "responseCode", 0); - ASSOC_STRINGL(array, "responseStatus", "", 0); - ASSOC_STRING(array, "requestMethod", STR_PTR(msg->http.info.request.method)); - ASSOC_STRING(array, "requestUrl", STR_PTR(msg->http.info.request.url)); + 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)); break; case PHP_HTTP_RESPONSE: - ASSOC_PROP(array, long, "responseCode", msg->http.info.response.code); - ASSOC_STRING(array, "responseStatus", STR_PTR(msg->http.info.response.status)); - ASSOC_STRINGL(array, "requestMethod", "", 0); - ASSOC_STRINGL(array, "requestUrl", "", 0); + ASSOC_PROP(long, "responseCode", msg->http.info.response.code); + ASSOC_STRING("responseStatus", STR_PTR(msg->http.info.response.status)); + ASSOC_STRINGL("requestMethod", "", 0); + ASSOC_STRINGL("requestUrl", "", 0); break; case PHP_HTTP_NONE: default: - ASSOC_PROP(array, long, "responseCode", 0); - ASSOC_STRINGL(array, "responseStatus", "", 0); - ASSOC_STRINGL(array, "requestMethod", "", 0); - ASSOC_STRINGL(array, "requestUrl", "", 0); + ASSOC_PROP(long, "responseCode", 0); + ASSOC_STRINGL("responseStatus", "", 0); + 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 *)); - ASSOC_PROP(array, zval, "headers", headers); + ASSOC_PROP(zval, "headers", headers); MAKE_STD_ZVAL(body); if (!obj->body.handle) { php_http_new(&obj->body, php_http_message_body_get_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), NULL TSRMLS_CC); } ZVAL_OBJVAL(body, obj->body, 1); - ASSOC_PROP(array, zval, "body", body); + ASSOC_PROP(zval, "body", body); MAKE_STD_ZVAL(parent); if (msg->parent) { @@ -1226,7 +1203,7 @@ static HashTable *php_http_message_object_get_props(zval *object TSRMLS_DC) } else { ZVAL_NULL(parent); } - ASSOC_PROP(array, zval, "parentMessage", parent); + ASSOC_PROP(zval, "parentMessage", parent); return props; }