+
+ } else if (!obj->message) {
+
+ obj->message = http_message_new();
+
+ }
+
+ SET_EH_NORMAL();
+
+}
+
+/* }}} */
+
+
+
+/* {{{ proto string HttpMessage::getBody()
+
+ *
+
+ * Get the body of the parsed Message.
+
+ */
+
+PHP_METHOD(HttpMessage, getBody)
+
+{
+
+ zval *body;
+
+ getObject(http_message_object, obj);
+
+
+
+ NO_ARGS;
+
+
+
+ RETURN_PHPSTR(&obj->message->body, PHPSTR_FREE_NOT, 1);
+
+}
+
+/* }}} */
+
+
+
+/* {{{ proto array HttpMessage::getHeaders()
+
+ *
+
+ * Get Message Headers.
+
+ */
+
+PHP_METHOD(HttpMessage, getHeaders)
+
+{
+
+ zval headers;
+
+ getObject(http_message_object, obj);
+
+
+
+ NO_ARGS;
+
+
+
+ Z_ARRVAL(headers) = &obj->message->hdrs;
+
+ array_init(return_value);
+
+ array_copy(&headers, return_value);
+
+}
+
+/* }}} */
+
+
+
+/* {{{ proto void HttpMessage::setHeaders(array headers)
+
+ *
+
+ * Sets new headers.
+
+ */
+
+PHP_METHOD(HttpMessage, setHeaders)
+
+{
+
+ zval *new_headers, old_headers;
+
+ getObject(http_message_object, obj);
+
+
+
+ if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a/", &new_headers)) {
+
+ return;
+
+ }
+
+
+
+ zend_hash_clean(&obj->message->hdrs);
+
+ Z_ARRVAL(old_headers) = &obj->message->hdrs;
+
+ array_copy(new_headers, &old_headers);
+
+}
+
+/* }}} */
+
+
+
+/* {{{ proto 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;
+
+ }
+
+
+
+ Z_ARRVAL(old_headers) = &obj->message->hdrs;
+
+ if (append) {
+
+ array_append(new_headers, &old_headers);
+
+ } else {
+
+ array_merge(new_headers, &old_headers);
+
+ }
+
+}
+
+/* }}} */
+
+
+
+/* {{{ proto long HttpMessage::getType()
+
+ *
+
+ * Get Message Type. (HTTP_MSG_NONE|HTTP_MSG_REQUEST|HTTP_MSG_RESPONSE)
+
+ */
+
+PHP_METHOD(HttpMessage, getType)
+
+{
+
+ getObject(http_message_object, obj);
+
+
+
+ NO_ARGS;
+
+
+
+ RETURN_LONG(obj->message->type);
+
+}
+
+/* }}} */
+
+
+
+/* {{{ proto 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;
+
+ }
+
+ http_message_set_type(obj->message, type);
+
+}
+
+/* }}} */
+
+
+
+/* {{{ proto long HttpMessage::getResponseCode()
+
+ *
+
+ * Get the Response Code of the Message.
+
+ */
+
+PHP_METHOD(HttpMessage, getResponseCode)
+
+{
+
+ getObject(http_message_object, obj);
+
+
+
+ NO_ARGS;
+
+
+
+ if (!HTTP_MSG_TYPE(RESPONSE, obj->message)) {
+
+ http_error(E_NOTICE, HTTP_E_MSG, "HttpMessage is not of type HTTP_MSG_RESPONSE");
+
+ RETURN_NULL();
+
+ }
+
+
+
+ RETURN_LONG(obj->message->info.response.code);
+
+}
+
+/* }}} */
+
+
+
+/* {{{ proto 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;
+
+ }
+
+
+
+ obj->message->info.response.code = code;
+
+ RETURN_TRUE;
+
+}
+
+/* }}} */
+
+
+
+/* {{{ proto 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)
+
+{
+
+ getObject(http_message_object, obj);
+
+
+
+ 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();
+
+ }
+
+
+
+ RETURN_STRING(obj->message->info.request.method, 1);
+
+}
+
+/* }}} */
+
+
+
+/* {{{ proto 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;
+
+ }
+
+ if (method_len < 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;
+
+ }
+
+
+
+ if (obj->message->info.request.method) {
+
+ efree(obj->message->info.request.method);
+
+ }
+
+ obj->message->info.request.method = estrndup(method, method_len);
+
+ RETURN_TRUE;
+
+}
+
+/* }}} */
+
+
+
+/* {{{ proto string HttpMessage::getRequestUri()
+
+ *
+
+ * Get the Request URI of the Message.
+
+ */
+
+PHP_METHOD(HttpMessage, getRequestUri)
+
+{
+
+ zval *uri;
+
+ getObject(http_message_object, obj);
+
+
+
+ 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();
+
+ }
+
+
+
+ RETURN_STRING(obj->message->info.request.URI, 1);
+
+}
+
+/* }}} */
+
+
+
+/* {{{ proto 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::requestUri to an empty string");
+
+ RETURN_FALSE;
+
+ }
+
+
+
+ if (obj->message->info.request.URI) {
+
+ efree(obj->message->info.request.URI);
+