- added INI setting http.force_exit which can be used to disable script termination
[m6w6/ext-http] / http_api.c
index 57f9709bcc7c1854785c2349d63161df99acefea..a78416a0bcb5bc73ff0c384cfac3530ae3d1e19c 100644 (file)
@@ -1,16 +1,13 @@
 /*
-   +----------------------------------------------------------------------+
-   | PECL :: http                                                         |
-   +----------------------------------------------------------------------+
-   | This source file is subject to version 3.0 of the PHP license, that  |
-   | is bundled with this package in the file LICENSE, and is available   |
-   | through the world-wide-web at http://www.php.net/license/3_0.txt.    |
-   | If you did not receive a copy of the PHP license and are unable to   |
-   | obtain it through the world-wide-web, please send a note to          |
-   | license@php.net so we can mail you a copy immediately.               |
-   +----------------------------------------------------------------------+
-   | Copyright (c) 2004-2005 Michael Wallner <mike@php.net>               |
-   +----------------------------------------------------------------------+
+    +--------------------------------------------------------------------+
+    | PECL :: http                                                       |
+    +--------------------------------------------------------------------+
+    | Redistribution and use in source and binary forms, with or without |
+    | modification, are permitted provided that the conditions mentioned |
+    | in the accompanying LICENSE file are met.                          |
+    +--------------------------------------------------------------------+
+    | Copyright (c) 2004-2005, Michael Wallner <mike@php.net>            |
+    +--------------------------------------------------------------------+
 */
 
 /* $Id$ */
@@ -249,18 +246,24 @@ void _http_log_ex(char *file, const char *ident, const char *message TSRMLS_DC)
 }
 /* }}} */
 
+static void http_ob_blackhole(char *output, uint output_len, char **handled_output, uint *handled_output_len, int mode TSRMLS_DC)
+{
+       *handled_output = ecalloc(1,1);
+       *handled_output_len = 0;
+}
+
 /* {{{ STATUS http_exit(int, char*, char*) */
 STATUS _http_exit_ex(int status, char *header, char *body, zend_bool send_header TSRMLS_DC)
 {
-       if (status || send_header) {
-               if (SUCCESS != http_send_status_header(status, send_header ? header : NULL)) {
-                       http_error_ex(HE_WARNING, HTTP_E_HEADER, "Failed to exit with status/header: %d - %s", status, header ? header : "");
-                       STR_FREE(header);
-                       STR_FREE(body);
-                       return FAILURE;
-               }
+       if (    (send_header && (SUCCESS != http_send_status_header(status, header))) ||
+                       (!send_header && status && (SUCCESS != http_send_status(status)))) {
+               http_error_ex(HE_WARNING, HTTP_E_HEADER, "Failed to exit with status/header: %d - %s", status, header ? header : "");
+               STR_FREE(header);
+               STR_FREE(body);
+               return FAILURE;
        }
        
+       php_end_ob_buffers(0 TSRMLS_CC);
        if (php_header(TSRMLS_C) && body) {
                PHPWRITE(body, strlen(body));
        }
@@ -279,8 +282,12 @@ STATUS _http_exit_ex(int status, char *header, char *body, zend_bool send_header
        STR_FREE(header);
        STR_FREE(body);
        
-       zend_bailout();
-       /* fake */
+       if (HTTP_G(force_exit)) {
+               zend_bailout();
+       } else {
+               php_ob_set_internal_handler(http_ob_blackhole, 4096, "blackhole", 0 TSRMLS_CC);
+       }
+       
        return SUCCESS;
 }
 /* }}} */