From 456dd6f5e057a0fc4ff3dbaf006d71cf5c247f19 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Fri, 29 Apr 2005 17:19:53 +0000 Subject: [PATCH] - yay, I guess this needs to be done by hand... --- http_message_object.c | 57 ++++++++--------- http_methods.c | 131 +++++++++++++++++++++++++++----------- php_http_message_object.h | 4 +- 3 files changed, 121 insertions(+), 71 deletions(-) diff --git a/http_message_object.c b/http_message_object.c index 244e29d..0067151 100644 --- a/http_message_object.c +++ b/http_message_object.c @@ -53,6 +53,7 @@ zend_function_entry http_message_object_fe[] = { PHP_ME(HttpMessage, setRequestUri, NULL, ZEND_ACC_PUBLIC) PHP_ME(HttpMessage, getHttpVersion, NULL, ZEND_ACC_PUBLIC) PHP_ME(HttpMessage, setHttpVersion, NULL, ZEND_ACC_PUBLIC) + PHP_ME(HttpMessage, getNestedMessage, NULL, ZEND_ACC_PUBLIC) PHP_ME(HttpMessage, toString, NULL, ZEND_ACC_PUBLIC) ZEND_MALIAS(HttpMessage, __toString, toString, NULL, ZEND_ACC_PUBLIC) @@ -87,17 +88,13 @@ zend_object_value _http_message_object_new_ex(zend_class_entry *ce, http_message o = ecalloc(1, sizeof(http_message_object)); o->zo.ce = ce; - - MAKE_STD_ZVAL(o->nested); - Z_TYPE_P(o->nested) = IS_OBJECT; + o->message = NULL; if (msg) { o->message = msg; if (msg->nested) { - o->nested->value.obj = http_message_object_from_msg(msg->nested); + o->nested = http_message_object_from_msg(msg->nested); } - } else { - o->message = http_message_new(); } ALLOC_HASHTABLE(OBJ_PROP(o)); @@ -114,16 +111,13 @@ static inline void _http_message_object_declare_default_properties(TSRMLS_D) zend_class_entry *ce = http_message_object_ce; DCL_PROP(PROTECTED, long, type, HTTP_MSG_NONE); - DCL_PROP(PROTECTED, string, body, ""); - DCL_PROP(PROTECTED, string, requestMethod, ""); DCL_PROP(PROTECTED, string, requestUri, ""); DCL_PROP(PROTECTED, long, responseCode, 0); - DCL_PROP_N(PROTECTED, httpVersion); DCL_PROP_N(PROTECTED, headers); - + DCL_PROP_N(PUBLIC, nestedMessage); } @@ -139,8 +133,6 @@ static void _http_message_object_free(zend_object *object TSRMLS_DC) http_message_dtor(o->message); efree(o->message); } - FREE_ZVAL(o->nested); - zval_dtor(&o->_tmp_property); efree(o); } @@ -148,14 +140,15 @@ static zval *_http_message_object_read_prop(zval *object, zval *member, int type { getObjectEx(http_message_object, obj, object); http_message *msg = obj->message; - zval *return_value = &obj->_tmp_property; + zval *return_value; - /* public */ - if (strcmp(Z_STRVAL_P(member), "nestedMessage")) { - if (!EG(scope) || !instanceof_function(EG(scope), obj->zo.ce TSRMLS_CC)) { - zend_error(E_WARNING, "Cannot access protected property %s::$%s", obj->zo.ce->name, Z_STRVAL_P(member)); - return EG(uninitialized_zval_ptr); - } + /* tmp var */ + ALLOC_ZVAL(return_value); + return_value->refcount = 0; + + if (!EG(scope) || !instanceof_function(EG(scope), obj->zo.ce TSRMLS_CC)) { + zend_error(E_WARNING, "Cannot access protected property %s::$%s", obj->zo.ce->name, Z_STRVAL_P(member)); + return EG(uninitialized_zval_ptr); } zval_dtor(return_value); @@ -200,9 +193,12 @@ static zval *_http_message_object_read_prop(zval *object, zval *member, int type break; case HTTP_MSG_PROPHASH_NESTED_MESSAGE: - RETVAL_NULL(); if (msg->nested) { - return obj->nested; + Z_TYPE_P(return_value) = IS_OBJECT; + return_value->value.obj = obj->nested; + zend_objects_store_add_ref(return_value TSRMLS_CC); + } else { + RETVAL_NULL(); } break; @@ -243,11 +239,8 @@ static void _http_message_object_write_prop(zval *object, zval *member, zval *va getObjectEx(http_message_object, obj, object); http_message *msg = obj->message; - /* public */ - if (strcmp("nestedMessage", Z_STRVAL_P(member))) { - if (!EG(scope) || !instanceof_function(EG(scope), obj->zo.ce TSRMLS_CC)) { - zend_error(E_WARNING, "Cannot access protected property %s::$%s", obj->zo.ce->name, Z_STRVAL_P(member)); - } + if (!EG(scope) || !instanceof_function(EG(scope), obj->zo.ce TSRMLS_CC)) { + zend_error(E_WARNING, "Cannot access protected property %s::$%s", obj->zo.ce->name, Z_STRVAL_P(member)); } #if 0 @@ -301,9 +294,13 @@ static void _http_message_object_write_prop(zval *object, zval *member, zval *va break; case HTTP_MSG_PROPHASH_NESTED_MESSAGE: - zval_ptr_dtor(&obj->nested); - obj->nested->value.obj = value->value.obj; - zval_add_ref(&value); + if (msg->nested) { + zval tmp; + tmp.value.obj = obj->nested; + zend_objects_store_del_ref(&tmp TSRMLS_CC); + } + zend_objects_store_add_ref(value TSRMLS_CC); + obj->nested = value->value.obj; break; case HTTP_MSG_PROPHASH_REQUEST_METHOD: @@ -330,8 +327,6 @@ static void _http_message_object_write_prop(zval *object, zval *member, zval *va } break; } - zval_dtor(value); - FREE_ZVAL(value); } static HashTable *_http_message_object_get_props(zval *object TSRMLS_DC) diff --git a/http_methods.c b/http_methods.c index e4023bc..1440b13 100644 --- a/http_methods.c +++ b/http_methods.c @@ -317,7 +317,7 @@ PHP_METHOD(HttpResponse, setData) zval *the_data; getObject(http_response_object, obj); - if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &the_data)) { + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z/", &the_data)) { RETURN_FALSE; } @@ -558,8 +558,7 @@ PHP_METHOD(HttpMessage, getBody) NO_ARGS; - body = GET_PROP(obj, body); - RETURN_STRINGL(Z_STRVAL_P(body), Z_STRLEN_P(body), 1); + RETURN_PHPSTR(&obj->message->body, PHPSTR_FREE_NOT, 1); } /* }}} */ @@ -569,14 +568,14 @@ PHP_METHOD(HttpMessage, getBody) */ PHP_METHOD(HttpMessage, getHeaders) { - zval *headers; + zval headers; getObject(http_message_object, obj); NO_ARGS; - headers = GET_PROP(obj, headers); + Z_ARRVAL(headers) = &obj->message->hdrs; array_init(return_value); - array_copy(headers, return_value); + array_copy(&headers, return_value); } /* }}} */ @@ -586,14 +585,16 @@ PHP_METHOD(HttpMessage, getHeaders) */ PHP_METHOD(HttpMessage, setHeaders) { - zval *headers; + zval *new_headers, old_headers; getObject(http_message_object, obj); - if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a/", &headers)) { + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a/", &new_headers)) { return; } - SET_PROP(obj, headers, headers); + zend_hash_clean(&obj->message->hdrs); + Z_ARRVAL(old_headers) = &obj->message->hdrs; + array_copy(new_headers, &old_headers); } /* }}} */ @@ -603,7 +604,7 @@ PHP_METHOD(HttpMessage, setHeaders) */ PHP_METHOD(HttpMessage, addHeaders) { - zval *old_headers, *new_headers; + zval old_headers, *new_headers; zend_bool append = 0; getObject(http_message_object, obj); @@ -611,13 +612,12 @@ PHP_METHOD(HttpMessage, addHeaders) return; } - old_headers = GET_PROP(obj, headers); + Z_ARRVAL(old_headers) = &obj->message->hdrs; if (append) { - array_append(new_headers, old_headers); + array_append(new_headers, &old_headers); } else { - array_merge(new_headers, old_headers); + array_merge(new_headers, &old_headers); } - SET_PROP(obj, headers, old_headers); } /* }}} */ @@ -627,13 +627,11 @@ PHP_METHOD(HttpMessage, addHeaders) */ PHP_METHOD(HttpMessage, getType) { - zval *type; getObject(http_message_object, obj); NO_ARGS; - type = GET_PROP(obj, type); - RETURN_LONG(Z_LVAL_P(type)); + RETURN_LONG(obj->message->type); } /* }}} */ @@ -649,7 +647,21 @@ PHP_METHOD(HttpMessage, setType) if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &type)) { return; } - UPD_PROP(obj, long, type, type); + if (type != obj->message->type) { + if (obj->message->type == HTTP_MSG_REQUEST) { + if (obj->message->info.request.method) { + efree(obj->message->info.request.method); + } + if (obj->message->info.request.URI) { + efree(obj->message->info.request.URI); + } + } + obj->message->type = type; + if (obj->message->type == HTTP_MSG_REQUEST) { + obj->message->info.request.method = NULL; + obj->message->info.request.URI = NULL; + } + } } /* }}} */ @@ -659,7 +671,6 @@ PHP_METHOD(HttpMessage, setType) */ PHP_METHOD(HttpMessage, getResponseCode) { - zval *status; getObject(http_message_object, obj); NO_ARGS; @@ -669,8 +680,7 @@ PHP_METHOD(HttpMessage, getResponseCode) RETURN_NULL(); } - status = GET_PROP(obj, responseCode); - RETURN_LONG(Z_LVAL_P(status)); + RETURN_LONG(obj->message->info.response.code); } /* }}} */ @@ -698,7 +708,7 @@ PHP_METHOD(HttpMessage, setResponseCode) RETURN_FALSE; } - UPD_PROP(obj, long, responseCode, code); + obj->message->info.response.code = code; RETURN_TRUE; } /* }}} */ @@ -710,7 +720,6 @@ PHP_METHOD(HttpMessage, setResponseCode) */ PHP_METHOD(HttpMessage, getRequestMethod) { - zval *method; getObject(http_message_object, obj); NO_ARGS; @@ -720,8 +729,7 @@ PHP_METHOD(HttpMessage, getRequestMethod) RETURN_NULL(); } - method = GET_PROP(obj, requestMethod); - RETURN_STRINGL(Z_STRVAL_P(method), Z_STRLEN_P(method), 1); + RETURN_STRING(obj->message->info.request.method, 1); } /* }}} */ @@ -748,8 +756,15 @@ PHP_METHOD(HttpMessage, setRequestMethod) http_error(E_WARNING, HTTP_E_PARAM, "Cannot set HttpMessage::requestMethod to an empty string"); RETURN_FALSE; } + if (SUCCESS != http_check_method(method)) { + http_error_ex(E_WARNING, HTTP_E_PARAM, "Unkown request method: %s", method); + RETURN_FALSE; + } - UPD_PROP(obj, string, requestMethod, method); + if (obj->message->info.request.method) { + efree(obj->message->info.request.method); + } + obj->message->info.request.method = estrndup(method, method_len); RETURN_TRUE; } /* }}} */ @@ -766,11 +781,11 @@ PHP_METHOD(HttpMessage, getRequestUri) NO_ARGS; if (obj->message->type != HTTP_MSG_REQUEST) { + http_error(E_WARNING, HTTP_E_MSG, "HttpMessage is not of type HTTP_MSG_REQUEST"); RETURN_NULL(); } - uri = GET_PROP(obj, requestUri); - RETURN_STRINGL(Z_STRVAL_P(uri), Z_STRLEN_P(uri), 1); + RETURN_STRING(obj->message->info.request.URI, 1); } /* }}} */ @@ -798,7 +813,10 @@ PHP_METHOD(HttpMessage, setRequestUri) RETURN_FALSE; } - UPD_PROP(obj, string, requestUri, URI); + if (obj->message->info.request.URI) { + efree(obj->message->info.request.URI); + } + obj->message->info.request.URI = estrndup(URI, URIlen); RETURN_TRUE; } /* }}} */ @@ -809,19 +827,25 @@ PHP_METHOD(HttpMessage, setRequestUri) */ PHP_METHOD(HttpMessage, getHttpVersion) { - zval *version; char ver[4] = {0}; + float *version; getObject(http_message_object, obj); NO_ARGS; - version = GET_PROP(obj, httpVersion); - - if (Z_TYPE_P(version) == IS_NULL) { - RETURN_NULL(); + switch (obj->message->type) + { + case HTTP_MSG_RESPONSE: + version = &obj->message->info.response.http_version; + break; + case HTTP_MSG_REQUEST: + version = &obj->message->info.request.http_version; + break; + case HTTP_MSG_NONE: + default: + RETURN_NULL(); } - - sprintf(ver, "1.1f", Z_DVAL_P(version)); + sprintf(ver, "1.1f", version); RETURN_STRINGL(ver, 3, 1); } /* }}} */ @@ -841,14 +865,45 @@ PHP_METHOD(HttpMessage, setHttpVersion) return; } + if (obj->message->type == HTTP_MSG_NONE) { + http_error(E_WARNING, HTTP_E_MSG, "Message is neither of type HTTP_MSG_RESPONSE nor HTTP_MSG_REQUEST"); + RETURN_FALSE; + } + convert_to_double_ex(&zv); sprintf(v, "%1.1f", Z_DVAL_P(zv)); if (strcmp(v, "1.0") && strcmp(v, "1.1")) { - http_error_ex(E_WARNING, HTTP_E_PARAM, "Invalid HTTP version (1.0 or 1.1): %s", v); + http_error_ex(E_WARNING, HTTP_E_PARAM, "Invalid HTTP protocol version (1.0 or 1.1): %s", v); RETURN_FALSE; } - SET_PROP(obj, httpVersion, zv); + if (obj->message->type == HTTP_MSG_RESPONSE) { + obj->message->info.response.http_version = (float) Z_DVAL_P(zv); + } else { + obj->message->info.request.http_version = (float) Z_DVAL_P(zv); + } + RETURN_TRUE; +} +/* }}} */ + +/* {{{ proto HttpMessage HttpMessage::getNestedMessage() + * + * Get nested Message. + */ +PHP_METHOD(HttpMessage, getNestedMessage) +{ + getObject(http_message_object, obj); + + NO_ARGS; + + if (obj->message->nested) { + Z_TYPE_P(return_value) = IS_OBJECT; + return_value->value.obj = obj->nested; + return_value->is_ref = 1; + zend_objects_store_add_ref(return_value TSRMLS_CC); + } else { + RETVAL_NULL(); + } } /* }}} */ diff --git a/php_http_message_object.h b/php_http_message_object.h index eba3019..8a0bcad 100644 --- a/php_http_message_object.h +++ b/php_http_message_object.h @@ -24,8 +24,7 @@ typedef struct { zend_object zo; http_message *message; - zval *nested; - zval _tmp_property; + zend_object_value nested; } http_message_object; extern zend_class_entry *http_message_object_ce; @@ -66,6 +65,7 @@ PHP_METHOD(HttpMessage, getRequestUri); PHP_METHOD(HttpMessage, setRequestUri); PHP_METHOD(HttpMessage, getHttpVersion); PHP_METHOD(HttpMessage, setHttpVersion); +PHP_METHOD(HttpMessage, getNestedMessage); PHP_METHOD(HttpMessage, toString); PHP_METHOD(HttpMessage, fromString); -- 2.30.2