#include "php_http_cache_api.h"
#include "php_http_headers_api.h"
+#ifdef HTTP_HAVE_MHASH
+# include <mhash.h>
+#endif
+#ifdef HTTP_HAVE_MAGIC
+# include <magic.h>
+#endif
+
ZEND_EXTERN_MODULE_GLOBALS(http);
#define GET_STATIC_PROP(n) *GET_STATIC_PROP_EX(http_response_object_ce, n)
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);
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 ### */
}
/* }}} */
-/* {{{ 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)
{
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))) {
}
}
SET_EH_NORMAL();
+#else
+ http_error(HE_THROW, HTTP_E_RUNTIME, "Cannot guess Content-Type; libmagic not available");
+#endif
}
/* }}} */
*/
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)) {
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;
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));
}
}
}
*/
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 */
{