From: Michael Wallner Date: Tue, 26 Apr 2005 11:11:33 +0000 (+0000) Subject: - added missing methods (except setBody) for HttpMessage X-Git-Tag: RELEASE_0_8_0~58 X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=commitdiff_plain;h=7ead3beaa8b181edbf99123b8e3af696f60cb403 - added missing methods (except setBody) for HttpMessage --- diff --git a/http_message_object.c b/http_message_object.c index e23f555..0f72351 100644 --- a/http_message_object.c +++ b/http_message_object.c @@ -43,11 +43,18 @@ zend_function_entry http_message_object_fe[] = { PHP_ME(HttpMessage, setRaw, NULL, ZEND_ACC_PUBLIC) PHP_ME(HttpMessage, getBody, NULL, ZEND_ACC_PUBLIC) PHP_ME(HttpMessage, getHeaders, NULL, ZEND_ACC_PUBLIC) + PHP_ME(HttpMessage, setHeaders, NULL, ZEND_ACC_PUBLIC) + PHP_ME(HttpMessage, addHeaders, NULL, ZEND_ACC_PUBLIC) PHP_ME(HttpMessage, getType, NULL, ZEND_ACC_PUBLIC) + PHP_ME(HttpMessage, setType, NULL, ZEND_ACC_PUBLIC) PHP_ME(HttpMessage, getResponseCode, NULL, ZEND_ACC_PUBLIC) + PHP_ME(HttpMessage, setResponseCode, NULL, ZEND_ACC_PUBLIC) PHP_ME(HttpMessage, getRequestMethod, NULL, ZEND_ACC_PUBLIC) + PHP_ME(HttpMessage, setRequestMethod, NULL, ZEND_ACC_PUBLIC) PHP_ME(HttpMessage, getRequestUri, NULL, ZEND_ACC_PUBLIC) + 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, toString, NULL, ZEND_ACC_PUBLIC) ZEND_MALIAS(HttpMessage, __toString, toString, NULL, ZEND_ACC_PUBLIC) @@ -244,7 +251,22 @@ static void _http_message_object_write_prop(zval *object, zval *member, zval *va switch (zend_get_hash_value(Z_STRVAL_P(member), strlen(Z_STRVAL_P(member)) + 1)) { case HTTP_MSG_PROPHASH_TYPE: - msg->type = Z_LVAL_P(value); + if (Z_LVAL_P(value) != msg->type) { + if (msg->type == HTTP_MSG_REQUEST) { + if (msg->info.request.method) { + efree(msg->info.request.method); + } + if (msg->info.request.URI) { + efree(msg->info.request.URI); + } + } + msg->type = Z_LVAL_P(value); + if (msg->type == HTTP_MSG_REQUEST) { + msg->info.request.method = NULL; + msg->info.request.URI = NULL; + } + } + break; case HTTP_MSG_PROPHASH_HTTP_VERSION: diff --git a/http_methods.c b/http_methods.c index af7586d..1ad3d38 100644 --- a/http_methods.c +++ b/http_methods.c @@ -618,6 +618,47 @@ PHP_METHOD(HttpMessage, getHeaders) } /* }}} */ +/* {{{ void HttpMessage::setHeaders(array headers) + * + * Sets new headers. + */ +PHP_METHOD(HttpMessage, setHeaders) +{ + zval *headers; + getObject(http_message_object, obj); + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a/", &headers)) { + return; + } + + SET_PROP(obj, headers, headers); +} +/* }}} */ + +/* {{{ void HttpMessage::addHeaders(array headers[, bool append = false]) + * + * Add headers. If append is true, headers with the same name will be separated, else overwritten. + */ +PHP_METHOD(HttpMessage, addHeaders) +{ + zval *old_headers, *new_headers; + zend_bool append = 0; + getObject(http_message_object, obj); + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|b", &new_headers, &append)) { + return; + } + + old_headers = GET_PROP(obj, headers); + if (append) { + array_append(new_headers, old_headers); + } else { + array_merge(new_headers, old_headers); + } + SET_PROP(obj, headers, old_headers); +} +/* }}} */ + /* {{{ long HttpMessage::getType() * * Get Message Type. (HTTP_MSG_NONE|HTTP_MSG_REQUEST|HTTP_MSG_RESPONSE) @@ -634,7 +675,23 @@ PHP_METHOD(HttpMessage, getType) } /* }}} */ -/* {{{ int HttpMessage::getResponseCode() +/* {{{ void HttpMessage::setType(long type) + * + * Set Message Type. (HTTP_MSG_NONE|HTTP_MSG_REQUEST|HTTP_MSG_RESPONSE) + */ +PHP_METHOD(HttpMessage, setType) +{ + long type; + getObject(http_message_object, obj); + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &type)) { + return; + } + UPD_PROP(obj, long, type, type); +} +/* }}} */ + +/* {{{ long HttpMessage::getResponseCode() * * Get the Response Code of the Message. */ @@ -646,6 +703,7 @@ PHP_METHOD(HttpMessage, getResponseCode) NO_ARGS; if (obj->message->type != HTTP_MSG_RESPONSE) { + http_error(E_NOTICE, HTTP_E_MSG, "HttpMessage is not of type HTTP_MSG_RESPONSE"); RETURN_NULL(); } @@ -654,9 +712,39 @@ PHP_METHOD(HttpMessage, getResponseCode) } /* }}} */ +/* {{{ bool HttpMessage::setResponseCode(long code) + * + * Set the response code of an HTTP Response Message. + * Returns false if the Message is not of type HTTP_MSG_RESPONSE, + * or if the response code is out of range (100-510). + */ +PHP_METHOD(HttpMessage, setResponseCode) +{ + long code; + getObject(http_message_object, obj); + + if (obj->message->type != HTTP_MSG_RESPONSE) { + http_error(E_WARNING, HTTP_E_MSG, "HttpMessage is not of type HTTP_MSG_RESPONSE"); + RETURN_FALSE; + } + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &code)) { + RETURN_FALSE; + } + if (code < 100 && code > 510) { + http_error_ex(E_WARNING, HTTP_E_PARAM, "Invalid response code (100-510): %ld", code); + RETURN_FALSE; + } + + UPD_PROP(obj, long, responseCode, code); + RETURN_TRUE; +} +/* }}} */ + /* {{{ string HttpMessage::getRequestMethod() * * Get the Request Method of the Message. + * Returns false if the Message is not of type HTTP_MSG_REQUEST. */ PHP_METHOD(HttpMessage, getRequestMethod) { @@ -666,6 +754,7 @@ PHP_METHOD(HttpMessage, getRequestMethod) NO_ARGS; if (obj->message->type != HTTP_MSG_REQUEST) { + http_error(E_NOTICE, HTTP_E_MSG, "HttpMessage is not of type HTTP_MSG_REQUEST"); RETURN_NULL(); } @@ -674,6 +763,31 @@ PHP_METHOD(HttpMessage, getRequestMethod) } /* }}} */ +/* {{{ bool HttpMessage::setRequestMethod(string method) + * + * Set the Request Method of the HTTP Message. + * Returns false if the Message is not of type HTTP_MSG_REQUEST. + */ +PHP_METHOD(HttpMessage, setRequestMethod) +{ + char *method; + int method_len; + getObject(http_message_object, obj); + + if (obj->message->type != HTTP_MSG_REQUEST) { + http_error(E_WARNING, HTTP_E_MSG, "HttpMessage is not of type HTTP_MSG_REQUEST"); + RETURN_FALSE; + } + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &method, &method_len)) { + RETURN_FALSE; + } + + UPD_PROP(obj, string, requestMethod, method); + RETURN_TRUE; +} +/* }}} */ + /* {{{ string HttpMessage::getRequestUri() * * Get the Request URI of the Message. @@ -694,6 +808,35 @@ PHP_METHOD(HttpMessage, getRequestUri) } /* }}} */ +/* {{{ bool HttpMessage::setRequestUri(string URI) + * + * Set the Request URI of the HTTP Message. + * Returns false if the Message is not of type HTTP_MSG_REQUEST, + * or if paramtere URI was empty. + */ +PHP_METHOD(HttpMessage, setRequestUri) +{ + char *URI; + int URIlen; + getObject(http_message_object, obj); + + if (obj->message->type != HTTP_MSG_REQUEST) { + http_error(E_WARNING, HTTP_E_MSG, "HttpMessage is not of type HTTP_MSG_REQUEST"); + RETURN_FALSE; + } + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &URI, &URIlen)) { + RETURN_FALSE; + } + if (URIlen < 1) { + http_error(E_WARNING, HTTP_E_PARAM, "Cannot set HttpMessage::requestMethod to an empty string"); + RETURN_FALSE; + } + + UPD_PROP(obj, string, requestUri, URI); + RETURN_TRUE; +} +/* }}} */ + /* {{{ string HttpMessage::getHttpVersion() * * Get the HTTP Protocol Version of the Message. @@ -717,6 +860,32 @@ PHP_METHOD(HttpMessage, getHttpVersion) } /* }}} */ +/* {{{ bool HttpMessage::setHttpVersion(string version) + * + * Set the HTTP Protocol version of the Message. + * Returns false if version is invalid (1.0 and 1.1). + */ +PHP_METHOD(HttpMessage, setHttpVersion) +{ + zval *v; + zval *version; + getObject(http_message_object, obj); + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &v)) { + return; + } + + convert_to_string_ex(&v); + if (strcmp(Z_STRVAL_P(v), "1.0") && strcmp(Z_STRVAL_P(v), "1.1")) { + http_error_ex(E_WARNING, HTTP_E_PARAM, "Invalid HTTP version (1.0 or 1.1): %s", Z_STRVAL_P(v)); + RETURN_FALSE; + } + convert_to_double_ex(&v); + + SET_PROP(obj, httpVersion, v); +} +/* }}} */ + /* {{{ string HttpMessage::toString() * * Get the string representation of the Message. diff --git a/php_http_message_object.h b/php_http_message_object.h index 484c562..ba5a073 100644 --- a/php_http_message_object.h +++ b/php_http_message_object.h @@ -55,11 +55,18 @@ PHP_METHOD(HttpMessage, __construct); PHP_METHOD(HttpMessage, setRaw); PHP_METHOD(HttpMessage, getBody); PHP_METHOD(HttpMessage, getHeaders); +PHP_METHOD(HttpMessage, setHeaders); +PHP_METHOD(HttpMessage, addHeaders); PHP_METHOD(HttpMessage, getType); +PHP_METHOD(HttpMessage, setType); PHP_METHOD(HttpMessage, getResponseCode); +PHP_METHOD(HttpMessage, setResponseCode); PHP_METHOD(HttpMessage, getRequestMethod); +PHP_METHOD(HttpMessage, setRequestMethod); PHP_METHOD(HttpMessage, getRequestUri); +PHP_METHOD(HttpMessage, setRequestUri); PHP_METHOD(HttpMessage, getHttpVersion); +PHP_METHOD(HttpMessage, setHttpVersion); PHP_METHOD(HttpMessage, toString); PHP_METHOD(HttpMessage, fromString); diff --git a/php_http_std_defs.h b/php_http_std_defs.h index 03911a8..a15a32a 100644 --- a/php_http_std_defs.h +++ b/php_http_std_defs.h @@ -84,6 +84,34 @@ typedef int STATUS; #define array_copy(src, dst) zend_hash_copy(Z_ARRVAL_P(dst), Z_ARRVAL_P(src), (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *)) #define array_merge(src, dst) zend_hash_merge(Z_ARRVAL_P(dst), Z_ARRVAL_P(src), (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *), 1) +#define array_append(src, dst) \ + { \ + ulong idx; \ + uint klen; \ + char *key = NULL; \ + zval **data; \ + \ + for ( zend_hash_internal_pointer_reset(Z_ARRVAL_P(src)); \ + zend_hash_get_current_key_ex(Z_ARRVAL_P(src), &key, &klen, &idx, 0, NULL) != HASH_KEY_NON_EXISTANT && \ + zend_hash_get_current_data(Z_ARRVAL_P(src), (void **) &data) == SUCCESS; \ + zend_hash_move_forward(Z_ARRVAL_P(src))) \ + { \ + if (key) { \ + zval **tmp; \ + \ + if (SUCCESS == zend_hash_find(Z_ARRVAL_P(dst), key, klen, (void **) &tmp)) { \ + if (Z_TYPE_PP(tmp) != IS_ARRAY) { \ + convert_to_array_ex(tmp); \ + } \ + add_next_index_zval(*tmp, *data); \ + } else { \ + add_assoc_zval(dst, key, *data); \ + } \ + zval_add_ref(data); \ + key = NULL; \ + } \ + } \ + } /* }}} */ #define HTTP_LONG_CONSTANT(name, const) REGISTER_LONG_CONSTANT(name, const, CONST_CS | CONST_PERSISTENT); @@ -160,6 +188,7 @@ typedef int STATUS; #define HTTP_E_ENCODE 5L #define HTTP_E_PARAM 6L #define HTTP_E_URL 7L +#define HTTP_E_MSG 8L #endif /* PHP_HTTP_STD_DEFS_H */