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)
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));
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);
}
http_message_dtor(o->message);
efree(o->message);
}
- FREE_ZVAL(o->nested);
- zval_dtor(&o->_tmp_property);
efree(o);
}
{
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);
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;
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
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:
}
break;
}
- zval_dtor(value);
- FREE_ZVAL(value);
}
static HashTable *_http_message_object_get_props(zval *object TSRMLS_DC)
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;
}
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);
}
/* }}} */
*/
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);
}
/* }}} */
*/
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);
}
/* }}} */
*/
PHP_METHOD(HttpMessage, addHeaders)
{
- zval *old_headers, *new_headers;
+ zval old_headers, *new_headers;
zend_bool append = 0;
getObject(http_message_object, obj);
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);
}
/* }}} */
*/
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);
}
/* }}} */
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;
+ }
+ }
}
/* }}} */
*/
PHP_METHOD(HttpMessage, getResponseCode)
{
- zval *status;
getObject(http_message_object, obj);
NO_ARGS;
RETURN_NULL();
}
- status = GET_PROP(obj, responseCode);
- RETURN_LONG(Z_LVAL_P(status));
+ RETURN_LONG(obj->message->info.response.code);
}
/* }}} */
RETURN_FALSE;
}
- UPD_PROP(obj, long, responseCode, code);
+ obj->message->info.response.code = code;
RETURN_TRUE;
}
/* }}} */
*/
PHP_METHOD(HttpMessage, getRequestMethod)
{
- zval *method;
getObject(http_message_object, obj);
NO_ARGS;
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);
}
/* }}} */
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;
}
/* }}} */
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);
}
/* }}} */
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;
}
/* }}} */
*/
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);
}
/* }}} */
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();
+ }
}
/* }}} */