- added INI setting http.force_exit which can be used to disable script termination
[m6w6/ext-http] / http_api.c
index 3e8ec02b187f350506a8cda243009795922508c5..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$ */
 
 ZEND_EXTERN_MODULE_GLOBALS(http);
 
-static zend_bool http_support_ssl;
-
 PHP_MINIT_FUNCTION(http_support)
 {
-       http_support_ssl = http_request_supports_ssl();
-       
        HTTP_LONG_CONSTANT("HTTP_SUPPORT", HTTP_SUPPORT);
        HTTP_LONG_CONSTANT("HTTP_SUPPORT_REQUESTS", HTTP_SUPPORT_REQUESTS);
        HTTP_LONG_CONSTANT("HTTP_SUPPORT_MAGICMIME", HTTP_SUPPORT_MAGICMIME);
@@ -69,9 +62,9 @@ PHP_HTTP_API long _http_support(long feature)
        
 #ifdef HTTP_HAVE_CURL
        support |= HTTP_SUPPORT_REQUESTS;
-       if (http_support_ssl) {
-               support |= HTTP_SUPPORT_SSLREQUESTS;
-       }
+#      ifdef HTTP_HAVE_SSL
+       support |= HTTP_SUPPORT_SSLREQUESTS;
+#      endif
 #endif
 #ifdef HTTP_HAVE_MHASH
        support |= HTTP_SUPPORT_MHASHETAGS;
@@ -253,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));
        }
@@ -283,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;
 }
 /* }}} */