X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_response_object.c;h=366cf9dddff0de8c0455707a062186bdd516145c;hp=e60b555b78818a20489507c8fb828d5a633897f2;hb=fc42cf454f14d7ddd13d34a7b6add61de1bdd1a3;hpb=fe1756974358a47c3295429657a0ff3121df32ef diff --git a/http_response_object.c b/http_response_object.c index e60b555..366cf9d 100644 --- a/http_response_object.c +++ b/http_response_object.c @@ -38,6 +38,13 @@ #include "php_http_cache_api.h" #include "php_http_headers_api.h" +#ifdef HTTP_HAVE_MHASH +# include +#endif +#ifdef HTTP_HAVE_MAGIC +# include +#endif + ZEND_EXTERN_MODULE_GLOBALS(http); #define GET_STATIC_PROP(n) *GET_STATIC_PROP_EX(http_response_object_ce, n) @@ -220,11 +227,11 @@ static inline void _http_response_object_declare_default_properties(TSRMLS_D) DCL_STATIC_PROP(PRIVATE, bool, sent, 0); DCL_STATIC_PROP(PRIVATE, bool, catch, 0); DCL_STATIC_PROP(PRIVATE, long, mode, -1); + DCL_STATIC_PROP(PRIVATE, long, stream, 0); + DCL_STATIC_PROP_N(PRIVATE, file); + DCL_STATIC_PROP_N(PRIVATE, data); DCL_STATIC_PROP(PROTECTED, bool, cache, 0); DCL_STATIC_PROP(PROTECTED, bool, gzip, 0); - DCL_STATIC_PROP(PROTECTED, long, stream, 0); - DCL_STATIC_PROP_N(PROTECTED, file); - DCL_STATIC_PROP_N(PROTECTED, data); DCL_STATIC_PROP_N(PROTECTED, eTag); DCL_STATIC_PROP(PROTECTED, long, lastModified, 0); DCL_STATIC_PROP_N(PROTECTED, cacheControl); @@ -232,12 +239,39 @@ static inline void _http_response_object_declare_default_properties(TSRMLS_D) DCL_STATIC_PROP_N(PROTECTED, contentDisposition); DCL_STATIC_PROP(PROTECTED, long, bufferSize, HTTP_SENDBUF_SIZE); DCL_STATIC_PROP(PROTECTED, double, throttleDelay, 0.0); - DCL_STATIC_PROP_N(PROTECTED, headers); + +#ifndef WONKY + DCL_CONST(long, "REDIRECT", HTTP_REDIRECT); + DCL_CONST(long, "REDIRECT_PERM", HTTP_REDIRECT_PERM); + DCL_CONST(long, "REDIRECT_POST", HTTP_REDIRECT_POST); + DCL_CONST(long, "REDIRECT_TEMP", HTTP_REDIRECT_TEMP); + + DCL_CONST(long, "ETAG_MD5", HTTP_ETAG_MD5); + DCL_CONST(long, "ETAG_SHA1", HTTP_ETAG_SHA1); + DCL_CONST(long, "ETAG_CRC32", HTTP_ETAG_CRC32); + +# ifdef HTTP_HAVE_MHASH + { + int l, i, c = mhash_count(); + + for (i = 0; i <= c; ++i) { + char const_name[256] = {0}; + const char *hash_name = mhash_get_hash_name_static(i); + + if (hash_name) { + l = snprintf(const_name, 255, "ETAG_MHASH_%s", hash_name); + zend_declare_class_constant_long(ce, const_name, l, i TSRMLS_CC); + } + } + } +# endif /* HTTP_HAVE_MHASH */ +#endif /* WONKY */ } static void _http_grab_response_headers(void *data, void *arg TSRMLS_DC) { - phpstr_appendf(PHPSTR(arg), "%s\r\n", ((sapi_header_struct *)data)->header); + phpstr_appendl(PHPSTR(arg), ((sapi_header_struct *)data)->header); + phpstr_appends(PHPSTR(arg), HTTP_CRLF); } /* ### USERLAND ### */ @@ -474,10 +508,9 @@ PHP_METHOD(HttpResponse, getContentType) } /* }}} */ -/* {{{ proto static string HttpResponse::guessContentType(string magic_file[, long magic_mode]) +/* {{{ proto static string HttpResponse::guessContentType(string magic_file[, long magic_mode = MAGIC_MIME]) * * Attempts to guess the content type of supplied payload through libmagic. - * See docs/KnownIssues.txt! */ PHP_METHOD(HttpResponse, guessContentType) { @@ -487,6 +520,9 @@ PHP_METHOD(HttpResponse, guessContentType) RETVAL_NULL(); +#ifdef HTTP_HAVE_MAGIC + magic_mode = MAGIC_MIME; + SET_EH_THROW_HTTP(); if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &magic_file, &magic_file_len, &magic_mode)) { switch (Z_LVAL_P(GET_STATIC_PROP(mode))) { @@ -517,6 +553,9 @@ PHP_METHOD(HttpResponse, guessContentType) } } SET_EH_NORMAL(); +#else + http_error(HE_THROW, HTTP_E_RUNTIME, "Cannot guess Content-Type; libmagic not available"); +#endif } /* }}} */ @@ -858,7 +897,7 @@ PHP_METHOD(HttpResponse, getFile) */ PHP_METHOD(HttpResponse, send) { - zval *sent, *headers; + zval *sent; zend_bool clean_ob = 1; if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &clean_ob)) { @@ -905,13 +944,6 @@ PHP_METHOD(HttpResponse, send) php_end_ob_buffers(0 TSRMLS_CC); } - /* gzip */ - if (zval_is_true(GET_STATIC_PROP(gzip))) { - php_start_ob_buffer_named("ob_gzhandler", 0, 0 TSRMLS_CC); - } else { - php_start_ob_buffer(NULL, 0, 0 TSRMLS_CC); - } - /* caching */ if (zval_is_true(GET_STATIC_PROP(cache))) { zval *cctl, *etag, *lmod; @@ -955,29 +987,34 @@ PHP_METHOD(HttpResponse, send) HTTP_G(send).throttle_delay = Z_DVAL_P(convert_to_type_ex(IS_DOUBLE, GET_STATIC_PROP(throttleDelay))); } + /* gzip */ + if (zval_is_true(GET_STATIC_PROP(gzip))) { + php_start_ob_buffer_named("ob_gzhandler", HTTP_G(send).buffer_size, 0 TSRMLS_CC); + } else { + php_start_ob_buffer(NULL, HTTP_G(send).buffer_size, 0 TSRMLS_CC); + } + /* send */ + switch (Z_LVAL_P(GET_STATIC_PROP(mode))) { - switch (Z_LVAL_P(GET_STATIC_PROP(mode))) + case SEND_DATA: { - case SEND_DATA: - { - zval *zdata = convert_to_type_ex(IS_STRING, GET_STATIC_PROP(data)); - RETURN_SUCCESS(http_send_data_ex(Z_STRVAL_P(zdata), Z_STRLEN_P(zdata), 1)); - } + zval *zdata = convert_to_type_ex(IS_STRING, GET_STATIC_PROP(data)); + RETURN_SUCCESS(http_send_data_ex(Z_STRVAL_P(zdata), Z_STRLEN_P(zdata), 1)); + } - case SEND_RSRC: - { - php_stream *the_real_stream; - zval *the_stream = convert_to_type_ex(IS_LONG, GET_STATIC_PROP(stream)); - the_stream->type = IS_RESOURCE; - php_stream_from_zval(the_real_stream, &the_stream); - RETURN_SUCCESS(http_send_stream_ex(the_real_stream, 0, 1)); - } + case SEND_RSRC: + { + php_stream *the_real_stream; + zval *the_stream = convert_to_type_ex(IS_LONG, GET_STATIC_PROP(stream)); + the_stream->type = IS_RESOURCE; + php_stream_from_zval(the_real_stream, &the_stream); + RETURN_SUCCESS(http_send_stream_ex(the_real_stream, 0, 1)); + } - default: - { - RETURN_SUCCESS(http_send_file_ex(Z_STRVAL_P(convert_to_type_ex(IS_STRING, GET_STATIC_PROP(file))), 1)); - } + default: + { + RETURN_SUCCESS(http_send_file_ex(Z_STRVAL_P(convert_to_type_ex(IS_STRING, GET_STATIC_PROP(file))), 1)); } } } @@ -998,17 +1035,12 @@ PHP_METHOD(HttpResponse, send) */ PHP_METHOD(HttpResponse, capture) { - zval do_catch; - NO_ARGS; - INIT_PZVAL(&do_catch); - ZVAL_LONG(&do_catch, 1); - - SET_STATIC_PROP(catch, &do_catch); + UPD_STATIC_PROP(long, catch, 1); php_end_ob_buffers(0 TSRMLS_CC); - php_start_ob_buffer(NULL, 0, 0 TSRMLS_CC); + php_start_ob_buffer(NULL, 40960, 0 TSRMLS_CC); /* register shutdown function */ {