-/* {{{ proto void HTTPi_Response::__construct(bool cache, bool gzip)
- *
- */
-PHP_METHOD(HTTPi_Response, __construct)
-{
- zend_bool do_cache = 0, do_gzip = 0;
- getObject(httpi_response_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|bb", &do_cache, &do_gzip)) {
- // throw exception
- return;
- }
-
- UPD_PROP(obj, long, cache, do_cache);
- UPD_PROP(obj, long, gzip, do_gzip);
-}
-/* }}} */
-
-/* {{{ proto bool HTTPi_Response::setCache(bool cache)
- *
- */
-PHP_METHOD(HTTPi_Response, setCache)
-{
- zend_bool do_cache = 0;
- getObject(httpi_response_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "b", &do_cache)) {
- RETURN_FALSE;
- }
-
- UPD_PROP(obj, long, cache, do_cache);
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto bool HTTPi_Response::getCache()
- *
- */
-PHP_METHOD(HTTPi_Response, getCache)
-{
- zval *do_cache = NULL;
- getObject(httpi_response_object, obj);
-
- if (ZEND_NUM_ARGS()) {
- WRONG_PARAM_COUNT;
- }
-
- do_cache = GET_PROP(obj, cache);
- RETURN_BOOL(Z_LVAL_P(do_cache));
-}
-/* }}}*/
-
-/* {{{ proto bool HTTPi_Response::setGzip(bool gzip)
- *
- */
-PHP_METHOD(HTTPi_Response, setGzip)
-{
- zend_bool do_gzip = 0;
- getObject(httpi_response_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "b", &do_gzip)) {
- RETURN_FALSE;
- }
-
- UPD_PROP(obj, long, gzip, do_gzip);
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto bool HTTPi_Response::getGzip()
- *
- */
-PHP_METHOD(HTTPi_Response, getGzip)
-{
- zval *do_gzip = NULL;
- getObject(httpi_response_object, obj);
-
- if (ZEND_NUM_ARGS()) {
- WRONG_PARAM_COUNT;
- }
-
- do_gzip = GET_PROP(obj, gzip);
- RETURN_BOOL(Z_LVAL_P(do_gzip));
-}
-/* }}} */
-
-/* {{{ proto bool HTTPi_Response::setCacheControl(string control[, bool raw = false])
- *
- */
-PHP_METHOD(HTTPi_Response, setCacheControl)
-{
- char *ccontrol;
- int cc_len;
- zend_bool raw = 0;
- getObject(httpi_response_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|b", &ccontrol, &cc_len, &raw)) {
- RETURN_FALSE;
- }
-
- if ((!raw) && (strcmp(ccontrol, "public") && strcmp(ccontrol, "private") && strcmp(ccontrol, "no-cache"))) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cache-Control '%s' doesn't match public, private or no-cache", ccontrol);
- RETURN_FALSE;
- }
-
- UPD_PROP(obj, long, raw_cache_header, raw);
- UPD_PROP(obj, string, cacheControl, ccontrol);
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto string HTTPi_Response::getCacheControl()
- *
- */
-PHP_METHOD(HTTPi_Response, getCacheControl)
-{
- zval *ccontrol;
- getObject(httpi_response_object, obj);
-
- if (ZEND_NUM_ARGS()) {
- WRONG_PARAM_COUNT;
- }
-
- ccontrol = GET_PROP(obj, cacheControl);
- RETURN_STRINGL(Z_STRVAL_P(ccontrol), Z_STRLEN_P(ccontrol), 1);
-}
-/* }}} */
-
-/* {{{ proto bool HTTPi::setContentType(string content_type)
- *
- */
-PHP_METHOD(HTTPi_Response, setContentType)
-{
- char *ctype;
- int ctype_len;
- getObject(httpi_response_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &ctype, &ctype_len)) {
- RETURN_FALSE;
- }
-
- if (!strchr(ctype, '/')) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Content type '%s' doesn't seem to contain a primary and secondary part", ctype);
- RETURN_FALSE;
- }
-
- UPD_PROP(obj, string, contentType, ctype);
- if (HTTP_G(ctype)) {
- efree(HTTP_G(ctype));
- }
- HTTP_G(ctype) = estrndup(ctype, ctype_len);
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto string HTTPi_Response::getContentType()
- *
- */
-PHP_METHOD(HTTPi_Response, getContentType)
-{
- zval *ctype;
- getObject(httpi_response_object, obj);
-
- if (ZEND_NUM_ARGS()) {
- WRONG_PARAM_COUNT;
- }
-
- ctype = GET_PROP(obj, contentType);
- RETURN_STRINGL(Z_STRVAL_P(ctype), Z_STRLEN_P(ctype), 1);
-}
-/* }}} */
-
-/* {{{ proto bool HTTPi_Response::setContentDisposition(string filename[, bool inline = false])
- *
- */
-PHP_METHOD(HTTPi_Response, setContentDisposition)
-{
- char *file;
- int file_len;
- zend_bool is_inline = 0;
- getObject(httpi_response_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|b", &file, &file_len, &is_inline)) {
- RETURN_FALSE;
- }
-
- UPD_PROP(obj, string, dispoFile, file);
- UPD_PROP(obj, long, dispoInline, is_inline);
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto array HTTPi_Response::getContentDisposition()
- *
- */
-PHP_METHOD(HTTPi_Response, getContentDisposition)
-{
- zval *file;
- zval *is_inline;
- getObject(httpi_response_object, obj);
-
- if (ZEND_NUM_ARGS()) {
- WRONG_PARAM_COUNT;
- }
-
- file = GET_PROP(obj, dispoFile);
- is_inline = GET_PROP(obj, dispoInline);
-
- array_init(return_value);
- add_assoc_stringl(return_value, "filename", Z_STRVAL_P(file), Z_STRLEN_P(file), 1);
- add_assoc_bool(return_value, "inline", Z_LVAL_P(is_inline));
-}
-/* }}} */
-
-/* {{{ proto bool HTTPi_Response::setETag(string etag)
- *
- */
-PHP_METHOD(HTTPi_Response, setETag)
-{
- char *etag;
- int etag_len;
- getObject(httpi_response_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &etag, &etag_len)) {
- RETURN_FALSE;
- }
-
- UPD_PROP(obj, string, eTag, etag);
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto string HTTPi_Response::getETag()
- *
- */
-PHP_METHOD(HTTPi_Response, getETag)
-{
- zval *etag;
- getObject(httpi_response_object, obj);
-
- if (ZEND_NUM_ARGS()) {
- WRONG_PARAM_COUNT;
- }
-
- etag = GET_PROP(obj, eTag);
- RETURN_STRINGL(Z_STRVAL_P(etag), Z_STRLEN_P(etag), 1);
-}
-/* }}} */
-
-/* {{{ proto bool HTTPi_Response::setData(string data)
- *
- */
-PHP_METHOD(HTTPi_Response, setData)
-{
- zval *the_data;
- getObject(httpi_response_object, obj);
-
- 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, string, eTag, http_etag(Z_STRVAL_P(the_data), Z_STRLEN_P(the_data), SEND_DATA));
- UPD_PROP(obj, long, size, Z_STRLEN_P(the_data));
- UPD_PROP(obj, long, lastModified, time(NULL));
- UPD_PROP(obj, long, send_mode, SEND_DATA);
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto string HTTPi_Response::getData()
- *
- */
-PHP_METHOD(HTTPi_Response, getData)
-{
- zval *the_data;
- getObject(httpi_response_object, obj);
-
- if (ZEND_NUM_ARGS()) {
- WRONG_PARAM_COUNT;
- }
-
- the_data = GET_PROP(obj, data);
- RETURN_STRINGL(Z_STRVAL_P(the_data), Z_STRLEN_P(the_data), 1);
-}
-/* }}} */
-
-/* {{{ proto bool HTTPi_Response::setStream(resource stream)
- *
- */
-PHP_METHOD(HTTPi_Response, setStream)
-{
- zval *the_stream;
- php_stream *the_real_stream;
- getObject(httpi_response_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &the_stream)) {
- RETURN_FALSE;
- }
-
- php_stream_from_zval(the_real_stream, &the_stream);
-
- SET_PROP(obj, stream, the_stream);
- UPD_PROP(obj, string, eTag, http_etag(the_real_stream, 0, SEND_RSRC));
- UPD_PROP(obj, long, size, HTTP_G(ssb).sb.st_size);
- UPD_PROP(obj, long, lastModified, HTTP_G(ssb).sb.st_mtime);
- UPD_PROP(obj, long, send_mode, SEND_RSRC);
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto resource HTTPi_Response::getStream()
- *
- */
-PHP_METHOD(HTTPi_Response, getStream)
-{
- zval *the_stream;
- getObject(httpi_response_object, obj);
-
- if (ZEND_NUM_ARGS()) {
- WRONG_PARAM_COUNT;
- }
-
- the_stream = GET_PROP(obj, stream);
- RETURN_RESOURCE(Z_LVAL_P(the_stream));
-}
-/* }}} */
-
-/* {{{ proto bool HTTPi_Response::setFile(string file)
- *
- */
-PHP_METHOD(HTTPi_Response, setFile)
-{
- char *the_file;
- int file_len;
- zval fmtime, fsize;
- getObject(httpi_response_object, obj);
-
- if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &the_file, &file_len)) {
- RETURN_FALSE;
- }
-
- php_stat(the_file, file_len, FS_SIZE, &fsize TSRMLS_CC);
- php_stat(the_file, file_len, FS_MTIME, &fmtime TSRMLS_CC);
-
- UPD_PROP(obj, string, file, the_file);
- UPD_PROP(obj, long, size, Z_LVAL(fsize));
- UPD_PROP(obj, long, lastModified, Z_LVAL(fmtime));
- UPD_PROP(obj, long, send_mode, -1);
- RETURN_TRUE;
-}
-/* }}} */
-
-/* {{{ proto string HTTPi_Response::getFile()
- *
- */
-PHP_METHOD(HTTPi_Response, getFile)
-{
- zval *the_file;
- getObject(httpi_response_object, obj);
-
- if (ZEND_NUM_ARGS()) {
- WRONG_PARAM_COUNT;
- }
-
- the_file = GET_PROP(obj, file);
- RETURN_STRINGL(Z_STRVAL_P(the_file), Z_STRLEN_P(the_file), 1);
-}
-/* }}} */
-
-/* {{{ proto int HTTPi_Response::getSize()
- *
- */
-PHP_METHOD(HTTPi_Response, getSize)
-{
- zval *the_size;
- getObject(httpi_response_object, obj);
-
- if (ZEND_NUM_ARGS()) {
- WRONG_PARAM_COUNT;
- }
-
- the_size = GET_PROP(obj, size);
- RETURN_LONG(Z_LVAL_P(the_size));
-}
-/* }}} */
-
-PHP_METHOD(HTTPi_Response, send)
-{
- zval *do_cache;
- getObject(httpi_response_object, obj);
-
- do_cache = GET_PROP(obj, cache);
-
- /* caching */
- if (Z_LVAL_P(do_cache)) {
- /* cache header */
- {
- zval *ccontrol = GET_PROP(obj, cacheControl);
- if (Z_STRLEN_P(ccontrol)) {
- char *cc_header;
- zval *cc_raw = GET_PROP(obj, raw_cache_control);
- if (Z_LVAL_P(cc_raw)) {
- cc_header = ecalloc(sizeof("Cache-Control: ") + Z_STRLEN_P(ccontrol), 1);
- sprintf(cc_header, "Cache-Control: %s", Z_STRVAL_P(ccontrol));
- } else {
- cc_header = ecalloc(sizeof("Cache-Control: , must-revalidate, max-age=0") + Z_STRLEN_P(ccontrol), 1);
- sprintf(cc_header, "Cache-Control: %s, must-revalidate, max-age=0", Z_STRVAL_P(ccontrol));
- }
- http_send_header(cc_header);
- efree(cc_header);
- } else {
- http_send_header("Cache-Control: public, must-revalidate, max-age=0");
- }
- }
- /* etag */
- {
- zval *etag = GET_PROP(obj, eTag);
- if (Z_STRLEN_P(etag)) {
- if ((!http_is_range_request()) && http_etag_match("HTTP_IF_NONE_MATCH", Z_STRVAL_P(etag))) {
- http_send_status(304);
- RETURN_TRUE;
- }
- http_send_etag(Z_STRVAL_P(etag), Z_STRLEN_P(etag));
- if (HTTP_G(etag)) {
- efree(HTTP_G(etag));
- }
- HTTP_G(etag) = estrndup(Z_STRVAL_P(etag), Z_STRLEN_P(etag));
- }
- }
- /* last modified */
- {
- zval *lmod = GET_PROP(obj, lastModified);
- if (Z_LVAL_P(lmod)) {
- if (http_modified_match("HTTP_IF_MODIFIED_SINCE", Z_LVAL_P(lmod))) {
- http_send_status(304);
- RETURN_TRUE;
- }
- http_send_last_modified(Z_LVAL_P(lmod));
- HTTP_G(lmod) = Z_LVAL_P(lmod);
- } else {
- time_t t = time(NULL);
- http_send_last_modified(t);
- HTTP_G(lmod) = t;
- }
- }
- } /* caching done */
-
- /* gzip */
- /* ... */
-
- /* content type */
- {
- zval *ctype = GET_PROP(obj, contentType);
- if (Z_STRLEN_P(ctype)) {
- char *ctype_header = ecalloc(sizeof("Content-Type: ") + Z_STRLEN_P(ctype), 1);
- sprintf(ctype_header, "Content-Type: %s", Z_STRVAL_P(ctype));
- http_send_header(ctype_header);
- efree(ctype_header);
- if (HTTP_G(ctype)) {
- efree(HTTP_G(ctype));
- }
- HTTP_G(ctype) = estrndup(Z_STRVAL_P(ctype), Z_STRLEN_P(ctype));
- } else {
- http_send_header("Content-Type: application/x-octetstream");
- if (HTTP_G(ctype)) {
- efree(HTTP_G(ctype));
- }
- HTTP_G(ctype) = estrdup("application/x-octetstream");
- }
- }
-
- /* content disposition */
- {
- zval *dispo_file = GET_PROP(obj, dispoFile);
- if (Z_STRLEN_P(dispo_file)) {
- char *dispo_header;
- zval *dispo_inline = GET_PROP(obj, dispoInline);
- if (Z_LVAL_P(dispo_inline)) {
- dispo_header = ecalloc(sizeof("Content-Disposition: inline; filename=\"\"") + Z_STRLEN_P(dispo_file), 1);
- sprintf(dispo_header, "Content-Disposition: inline; filename=\"%s\"", Z_STRVAL_P(dispo_file));
- } else {
- dispo_header = ecalloc(sizeof("Content-Disposition: attachment; filename=\"\"") + Z_STRLEN_P(dispo_file), 1);
- sprintf(dispo_header, "Content-Disposition: attachment; filename=\"%s\"", Z_STRVAL_P(dispo_file));
- }
- http_send_header(dispo_header);
- efree(dispo_header);
- }
- }
-
- /* send */
- {
- zval *send_mode = GET_PROP(obj, send_mode);
- switch (Z_LVAL_P(send_mode))
- {
- case SEND_DATA:
- {
- RETURN_SUCCESS(http_send_data(GET_PROP(obj, data)));
- }
-
- case SEND_RSRC:
- {
- php_stream *the_real_stream;
- zval *the_stream = GET_PROP(obj, stream);
- php_stream_from_zval(the_real_stream, &the_stream);
- RETURN_SUCCESS(http_send_stream(the_real_stream));
- }
-
- default:
- {
- RETURN_SUCCESS(http_send_file(GET_PROP(obj, file)));
- }
- }
- }
-}
-
-#endif /* ZEND_ENGINE_2 */
-
-/* {{{ http_module_entry */
-zend_module_entry http_module_entry = {
-#if ZEND_MODULE_API_NO >= 20010901
- STANDARD_MODULE_HEADER,
-#endif
- "http",
- http_functions,
- PHP_MINIT(http),
- PHP_MSHUTDOWN(http),
- PHP_RINIT(http),
- PHP_RSHUTDOWN(http),
- PHP_MINFO(http),
-#if ZEND_MODULE_API_NO >= 20010901
- PHP_EXT_HTTP_VERSION,
-#endif
- STANDARD_MODULE_PROPERTIES
-};
-/* }}} */
-
-/* {{{ proto string http_date([int timestamp])
- *
- * This function returns a valid HTTP date regarding RFC 822/1123
- * looking like: "Wed, 22 Dec 2004 11:34:47 GMT"
- *
- */
-PHP_FUNCTION(http_date)
-{
- long t = -1;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &t) != SUCCESS) {
- RETURN_FALSE;
- }
-
- if (t == -1) {
- t = (long) time(NULL);
- }
-
- RETURN_STRING(http_date(t), 0);
-}
-/* }}} */
-
-/* {{{ proto string http_absolute_uri(string url[, string proto])
- *
- * This function returns an absolute URI constructed from url.
- * If the url is already abolute but a different proto was supplied,
- * only the proto part of the URI will be updated. If url has no
- * path specified, the path of the current REQUEST_URI will be taken.
- * The host will be taken either from the Host HTTP header of the client
- * the SERVER_NAME or just localhost if prior are not available.
- *
- * Some examples:
- * <pre>
- * url = "page.php" => http://www.example.com/current/path/page.php
- * url = "/page.php" => http://www.example.com/page.php
- * url = "/page.php", proto = "https" => https://www.example.com/page.php
- * </pre>
- *
- */
-PHP_FUNCTION(http_absolute_uri)
-{
- char *url = NULL, *proto = NULL;
- int url_len = 0, proto_len = 0;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", &url, &url_len, &proto, &proto_len) != SUCCESS) {
- RETURN_FALSE;
- }
-
- RETURN_STRING(http_absolute_uri(url, proto), 0);
-}
-/* }}} */
-
-/* {{{ proto string http_negotiate_language(array supported[, string default = 'en-US'])
- *
- * This function negotiates the clients preferred language based on its
- * Accept-Language HTTP header. It returns the negotiated language or
- * the default language if none match.
- *
- * The qualifier is recognized and languages without qualifier are rated highest.
- *
- * The supported parameter is expected to be an array having
- * the supported languages as array values.
- *
- * Example:
- * <pre>
- * <?php
- * $langs = array(
- * 'en-US',// default
- * 'fr',
- * 'fr-FR',
- * 'de',
- * 'de-DE',
- * 'de-AT',
- * 'de-CH',
- * );
- * include './langs/'. http_negotiate_language($langs) .'.php';
- * ?>
- * </pre>
- *
- */
-PHP_FUNCTION(http_negotiate_language)
-{
- zval *supported;
- char *def = NULL;
- int def_len = 0;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|s", &supported, &def, &def_len) != SUCCESS) {
- RETURN_FALSE;
- }
-
- if (!def) {
- def = "en-US";
- }
-
- RETURN_STRING(http_negotiate_language(supported, def), 0);
-}
-/* }}} */
-
-/* {{{ proto string http_negotiate_charset(array supported[, string default = 'iso-8859-1'])
- *
- * This function negotiates the clients preferred charset based on its
- * Accept-Charset HTTP header. It returns the negotiated charset or
- * the default charset if none match.
- *
- * The qualifier is recognized and charset without qualifier are rated highest.
- *
- * The supported parameter is expected to be an array having
- * the supported charsets as array values.
- *
- * Example:
- * <pre>
- * <?php
- * $charsets = array(
- * 'iso-8859-1', // default
- * 'iso-8859-2',
- * 'iso-8859-15',
- * 'utf-8'
- * );
- * $pref = http_negotiate_charset($charsets);
- * if (!strcmp($pref, 'iso-8859-1')) {
- * iconv_set_encoding('internal_encoding', 'iso-8859-1');
- * iconv_set_encoding('output_encoding', $pref);
- * ob_start('ob_iconv_handler');
- * }
- * ?>
- * </pre>
- */
-PHP_FUNCTION(http_negotiate_charset)
-{
- zval *supported;
- char *def = NULL;
- int def_len = 0;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|s", &supported, &def, &def_len) != SUCCESS) {
- RETURN_FALSE;
- }
-
- if (!def) {
- def = "iso-8859-1";
- }
-
- RETURN_STRING(http_negotiate_charset(supported, def), 0);
-}
-/* }}} */
-
-/* {{{ proto bool http_send_status(int status)
- *
- * Send HTTP status code.
- *
- */
-PHP_FUNCTION(http_send_status)
-{
- int status = 0;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &status) != SUCCESS) {
- RETURN_FALSE;
- }
- if (status < 100 || status > 510) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid HTTP status code (100-510): %d", status);
- RETURN_FALSE;
- }
-
- RETURN_SUCCESS(http_send_status(status));
-}
-/* }}} */