X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=http_methods.c;h=e4023bc5a7c46d4b0b030af431997bf594cde198;hb=b7d46301e6a672db53cec3363ab0d2f31ccb6de9;hp=af7586d86e2ba3ddc7f5288258cdacc2e5d3d9c2;hpb=cf9967800843ea01e77b374b4d78fad4bc18a3f6;p=m6w6%2Fext-http diff --git a/http_methods.c b/http_methods.c index af7586d..e4023bc 100644 --- a/http_methods.c +++ b/http_methods.c @@ -323,7 +323,7 @@ PHP_METHOD(HttpResponse, setData) 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,79 +547,81 @@ PHP_METHOD(HttpMessage, fromString) } /* }}} */ -/* {{{ void HttpMessage::__construct([string raw_message]) +/* {{{ proto string HttpMessage::getBody() * - * Instantiate a new HttpMessage object based on the optionally provided - * raw message. An HTTP Message can be either a response or a request. + * Get the body of the parsed Message. */ -PHP_METHOD(HttpMessage, __construct) +PHP_METHOD(HttpMessage, getBody) { - zval *message = NULL; + zval *body; 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(); + NO_ARGS; + + body = GET_PROP(obj, body); + RETURN_STRINGL(Z_STRVAL_P(body), Z_STRLEN_P(body), 1); } /* }}} */ -/* {{{ void HttpMessage::setRaw(string raw_message) +/* {{{ proto array HttpMessage::getHeaders() * - * Parse a new raw message. + * Get Message Headers. */ -PHP_METHOD(HttpMessage, setRaw) +PHP_METHOD(HttpMessage, getHeaders) { - zval *message; + zval *headers; getObject(http_message_object, obj); - if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z/", &message)) { - return; - } + NO_ARGS; - convert_to_string(message); - SET_PROP(obj, raw, message); + headers = GET_PROP(obj, headers); + array_init(return_value); + array_copy(headers, return_value); } /* }}} */ -/* {{{ string HttpMessage::getBody() +/* {{{ proto void HttpMessage::setHeaders(array headers) * - * Get the body of the parsed Message. + * Sets new headers. */ -PHP_METHOD(HttpMessage, getBody) +PHP_METHOD(HttpMessage, setHeaders) { - zval *body; + zval *headers; getObject(http_message_object, obj); - NO_ARGS; + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a/", &headers)) { + return; + } - body = GET_PROP(obj, body); - RETURN_STRINGL(Z_STRVAL_P(body), Z_STRLEN_P(body), 1); + SET_PROP(obj, headers, headers); } /* }}} */ -/* {{{ array HttpMessage::getHeaders() +/* {{{ proto void HttpMessage::addHeaders(array headers[, bool append = false]) * - * Get Message Headers. + * Add headers. If append is true, headers with the same name will be separated, else overwritten. */ -PHP_METHOD(HttpMessage, getHeaders) +PHP_METHOD(HttpMessage, addHeaders) { - zval *headers; + zval *old_headers, *new_headers; + zend_bool append = 0; getObject(http_message_object, obj); - NO_ARGS; + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|b", &new_headers, &append)) { + return; + } - headers = GET_PROP(obj, headers); - array_init(return_value); - array_copy(headers, return_value); + 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() +/* {{{ proto long HttpMessage::getType() * * Get Message Type. (HTTP_MSG_NONE|HTTP_MSG_REQUEST|HTTP_MSG_RESPONSE) */ @@ -634,7 +637,23 @@ PHP_METHOD(HttpMessage, getType) } /* }}} */ -/* {{{ int HttpMessage::getResponseCode() +/* {{{ 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; + } + UPD_PROP(obj, long, type, type); +} +/* }}} */ + +/* {{{ proto long HttpMessage::getResponseCode() * * Get the Response Code of the Message. */ @@ -646,6 +665,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 +674,39 @@ PHP_METHOD(HttpMessage, getResponseCode) } /* }}} */ -/* {{{ string HttpMessage::getRequestMethod() +/* {{{ 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; + } + + UPD_PROP(obj, long, responseCode, 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) { @@ -666,6 +716,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,7 +725,36 @@ PHP_METHOD(HttpMessage, getRequestMethod) } /* }}} */ -/* {{{ string HttpMessage::getRequestUri() +/* {{{ 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; + } + + UPD_PROP(obj, string, requestMethod, method); + RETURN_TRUE; +} +/* }}} */ + +/* {{{ proto string HttpMessage::getRequestUri() * * Get the Request URI of the Message. */ @@ -694,7 +774,36 @@ PHP_METHOD(HttpMessage, getRequestUri) } /* }}} */ -/* {{{ string HttpMessage::getHttpVersion() +/* {{{ 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; + } + + UPD_PROP(obj, string, requestUri, URI); + RETURN_TRUE; +} +/* }}} */ + +/* {{{ proto string HttpMessage::getHttpVersion() * * Get the HTTP Protocol Version of the Message. */ @@ -717,7 +826,33 @@ PHP_METHOD(HttpMessage, getHttpVersion) } /* }}} */ -/* {{{ string HttpMessage::toString() +/* {{{ 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) +{ + char v[4]; + zval *zv, *version; + getObject(http_message_object, obj); + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z/", &zv)) { + return; + } + + 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); + RETURN_FALSE; + } + + SET_PROP(obj, httpVersion, zv); +} +/* }}} */ + +/* {{{ proto string HttpMessage::toString() * * Get the string representation of the Message. */