- better inline docs, part #4
[m6w6/ext-http] / http_response_object.c
index e60b555b78818a20489507c8fb828d5a633897f2..366cf9dddff0de8c0455707a062186bdd516145c 100644 (file)
 #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)
@@ -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 */
        {