X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_methods.c;h=1440b13230259685aeb00ebe345635ee3234ba2b;hp=1ad3d388ab14bf3b02fc111ea2f1e31ceed954bf;hb=456dd6f5e057a0fc4ff3dbaf006d71cf5c247f19;hpb=7ead3beaa8b181edbf99123b8e3af696f60cb403 diff --git a/http_methods.c b/http_methods.c index 1ad3d38..1440b13 100644 --- a/http_methods.c +++ b/http_methods.c @@ -317,13 +317,13 @@ 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; } convert_to_string_ex(&the_data); SET_PROP(obj, data, the_data); - UPD_PROP(obj, long, lastModified, http_lmod(the_data, SEND_DATA)); + UPD_PROP(obj, long, lastModified, http_last_modified(the_data, SEND_DATA)); UPD_PROP(obj, long, send_mode, SEND_DATA); RETURN_TRUE; } @@ -362,7 +362,7 @@ PHP_METHOD(HttpResponse, setStream) php_stream_from_zval(the_real_stream, &the_stream); SET_PROP(obj, stream, the_stream); - UPD_PROP(obj, long, lastModified, http_lmod(the_real_stream, SEND_RSRC)); + UPD_PROP(obj, long, lastModified, http_last_modified(the_real_stream, SEND_RSRC)); UPD_PROP(obj, long, send_mode, SEND_RSRC); RETURN_TRUE; } @@ -400,7 +400,7 @@ PHP_METHOD(HttpResponse, setFile) convert_to_string_ex(&the_file); UPD_PROP(obj, string, file, Z_STRVAL_P(the_file)); - UPD_PROP(obj, long, lastModified, http_lmod(the_file, -1)); + UPD_PROP(obj, long, lastModified, http_last_modified(the_file, -1)); UPD_PROP(obj, long, send_mode, -1); RETURN_TRUE; } @@ -523,7 +523,7 @@ PHP_METHOD(HttpResponse, send) /* {{{ HttpMessage */ -/* {{{ static HttpMessage HttpMessage::fromString(string raw_message) +/* {{{ proto static HttpMessage HttpMessage::fromString(string raw_message) * * Create an HttpMessage object from a string. */ @@ -532,6 +532,7 @@ PHP_METHOD(HttpMessage, fromString) char *string = NULL; int length = 0; http_message *msg = NULL; + http_message_object obj; if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &string, &length)) { RETURN_NULL(); @@ -546,46 +547,7 @@ PHP_METHOD(HttpMessage, fromString) } /* }}} */ -/* {{{ void HttpMessage::__construct([string raw_message]) - * - * Instantiate a new HttpMessage object based on the optionally provided - * raw message. An HTTP Message can be either a response or a request. - */ -PHP_METHOD(HttpMessage, __construct) -{ - zval *message = NULL; - getObject(http_message_object, obj); - - SET_EH_THROW_HTTP(); - if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|z/", &message)) { - if (message) { - convert_to_string(message); - SET_PROP(obj, raw, message); - } - } - SET_EH_NORMAL(); -} -/* }}} */ - -/* {{{ void HttpMessage::setRaw(string raw_message) - * - * Parse a new raw message. - */ -PHP_METHOD(HttpMessage, setRaw) -{ - zval *message; - getObject(http_message_object, obj); - - if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z/", &message)) { - return; - } - - convert_to_string(message); - SET_PROP(obj, raw, message); -} -/* }}} */ - -/* {{{ string HttpMessage::getBody() +/* {{{ proto string HttpMessage::getBody() * * Get the body of the parsed Message. */ @@ -596,52 +558,53 @@ 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); } /* }}} */ -/* {{{ array HttpMessage::getHeaders() +/* {{{ proto array HttpMessage::getHeaders() * * Get Message Headers. */ 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); } /* }}} */ -/* {{{ void HttpMessage::setHeaders(array headers) +/* {{{ proto void HttpMessage::setHeaders(array headers) * * Sets new headers. */ 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); } /* }}} */ -/* {{{ void HttpMessage::addHeaders(array headers[, bool append = false]) +/* {{{ 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; + zval old_headers, *new_headers; zend_bool append = 0; getObject(http_message_object, obj); @@ -649,33 +612,30 @@ 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); } /* }}} */ -/* {{{ long HttpMessage::getType() +/* {{{ proto long HttpMessage::getType() * * Get Message Type. (HTTP_MSG_NONE|HTTP_MSG_REQUEST|HTTP_MSG_RESPONSE) */ 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); } /* }}} */ -/* {{{ void HttpMessage::setType(long type) +/* {{{ proto void HttpMessage::setType(long type) * * Set Message Type. (HTTP_MSG_NONE|HTTP_MSG_REQUEST|HTTP_MSG_RESPONSE) */ @@ -683,21 +643,34 @@ 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); + 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; + } + } } /* }}} */ -/* {{{ long HttpMessage::getResponseCode() +/* {{{ proto long HttpMessage::getResponseCode() * * Get the Response Code of the Message. */ PHP_METHOD(HttpMessage, getResponseCode) { - zval *status; getObject(http_message_object, obj); NO_ARGS; @@ -707,15 +680,14 @@ PHP_METHOD(HttpMessage, getResponseCode) RETURN_NULL(); } - status = GET_PROP(obj, responseCode); - RETURN_LONG(Z_LVAL_P(status)); + RETURN_LONG(obj->message->info.response.code); } /* }}} */ -/* {{{ bool HttpMessage::setResponseCode(long 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, + * 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) @@ -731,24 +703,23 @@ PHP_METHOD(HttpMessage, setResponseCode) if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &code)) { RETURN_FALSE; } - if (code < 100 && code > 510) { + 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); + obj->message->info.response.code = code; RETURN_TRUE; } /* }}} */ -/* {{{ string HttpMessage::getRequestMethod() +/* {{{ 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) { - zval *method; getObject(http_message_object, obj); NO_ARGS; @@ -758,12 +729,11 @@ 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); } /* }}} */ -/* {{{ bool HttpMessage::setRequestMethod(string method) +/* {{{ 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. @@ -782,13 +752,24 @@ PHP_METHOD(HttpMessage, setRequestMethod) 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; + } - 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; } /* }}} */ -/* {{{ string HttpMessage::getRequestUri() +/* {{{ proto string HttpMessage::getRequestUri() * * Get the Request URI of the Message. */ @@ -800,15 +781,15 @@ 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); } /* }}} */ -/* {{{ bool HttpMessage::setRequestUri(string URI) +/* {{{ 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, @@ -828,65 +809,105 @@ PHP_METHOD(HttpMessage, setRequestUri) RETURN_FALSE; } if (URIlen < 1) { - http_error(E_WARNING, HTTP_E_PARAM, "Cannot set HttpMessage::requestMethod to an empty string"); + http_error(E_WARNING, HTTP_E_PARAM, "Cannot set HttpMessage::requestUri to an empty string"); 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; } /* }}} */ -/* {{{ string HttpMessage::getHttpVersion() +/* {{{ proto string HttpMessage::getHttpVersion() * * Get the HTTP Protocol Version of the Message. */ 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); } /* }}} */ -/* {{{ bool HttpMessage::setHttpVersion(string version) - * +/* {{{ proto 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; + char v[4]; + zval *zv, *version; getObject(http_message_object, obj); - - if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &v)) { + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z/", &zv)) { 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)); + 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(&v); - SET_PROP(obj, httpVersion, v); + 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 protocol version (1.0 or 1.1): %s", v); + RETURN_FALSE; + } + + 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(); + } } /* }}} */ -/* {{{ string HttpMessage::toString() +/* {{{ proto string HttpMessage::toString() * * Get the string representation of the Message. */