- ditch some warnings
[m6w6/ext-http] / http_response_object.c
index 915297ef86db87231419032765120263d178d687..e5b0d00da8c4366a72be0614973e4604879053d8 100644 (file)
@@ -293,7 +293,7 @@ PHP_METHOD(HttpResponse, setHeader)
        zend_bool replace = 1;
        char *name;
        int name_len = 0;
-       zval *value = NULL;
+       zval *value = NULL, *orig = NULL;
 
        if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz/!|b", &name, &name_len, &value, &replace)) {
                RETURN_FALSE;
@@ -314,20 +314,31 @@ PHP_METHOD(HttpResponse, setHeader)
        /* send multiple header if replace is false and value is an array */
        if (!replace && Z_TYPE_P(value) == IS_ARRAY) {
                zval **data;
+               HashPosition pos;
                
-               FOREACH_VAL(value, data) {
+               FOREACH_VAL(pos, value, data) {
+                       zval *orig = *data;
+                       
                        convert_to_string_ex(data);
                        if (SUCCESS != http_send_header_ex(name, name_len, Z_STRVAL_PP(data), Z_STRLEN_PP(data), 0, NULL)) {
+                               if (orig != *data) {
+                                       zval_ptr_dtor(data);
+                               }
                                RETURN_FALSE;
                        }
+                       if (orig != *data) {
+                               zval_ptr_dtor(data);
+                       }
                }
                RETURN_TRUE;
        }
        /* send standard header */
-       if (Z_TYPE_P(value) != IS_STRING) {
-               convert_to_string_ex(&value);
+       orig = value;
+       convert_to_string_ex(&value);
+       RETVAL_SUCCESS(http_send_header_ex(name, name_len, Z_STRVAL_P(value), Z_STRLEN_P(value), replace, NULL));
+       if (orig != value) {
+               zval_ptr_dtor(&value);
        }
-       RETURN_SUCCESS(http_send_header_ex(name, name_len, Z_STRVAL_P(value), Z_STRLEN_P(value), replace, NULL));
 }
 /* }}} */
 
@@ -494,7 +505,7 @@ PHP_METHOD(HttpResponse, setCacheControl)
                http_error_ex(HE_WARNING, HTTP_E_INVALID_PARAM, "Cache-Control '%s' doesn't match public, private or no-cache", ccontrol);
                RETURN_FALSE;
        } else {
-               size_t cctl_len = spprintf(&cctl, 0, "%s, must-revalidate, max_age=%ld", ccontrol, max_age);
+               size_t cctl_len = spprintf(&cctl, 0, "%s, must-revalidate, max-age=%ld", ccontrol, max_age);
                RETVAL_SUCCESS(UPD_STATIC_STRL(cacheControl, cctl, cctl_len));
                efree(cctl);
        }
@@ -889,7 +900,7 @@ PHP_METHOD(HttpResponse, setData)
        }
        
        UPD_STATIC_PROP(long, lastModified, http_last_modified(the_data, SEND_DATA));
-       if (etag = http_etag(Z_STRVAL_P(the_data), Z_STRLEN_P(the_data), SEND_DATA)) {
+       if ((etag = http_etag(Z_STRVAL_P(the_data), Z_STRLEN_P(the_data), SEND_DATA))) {
                UPD_STATIC_PROP(string, eTag, etag);
                efree(etag);
        }
@@ -948,7 +959,7 @@ PHP_METHOD(HttpResponse, setStream)
        zend_list_addref(Z_LVAL_P(the_stream));
        
        UPD_STATIC_PROP(long, lastModified, http_last_modified(the_real_stream, SEND_RSRC));
-       if (etag = http_etag(the_real_stream, 0, SEND_RSRC)) {
+       if ((etag = http_etag(the_real_stream, 0, SEND_RSRC))) {
                UPD_STATIC_PROP(string, eTag, etag);
                efree(etag);
        }
@@ -1007,7 +1018,7 @@ PHP_METHOD(HttpResponse, setFile)
        }
 
        UPD_STATIC_PROP(long, lastModified, http_last_modified(the_file, -1));
-       if (etag = http_etag(the_file, 0, -1)) {
+       if ((etag = http_etag(the_file, 0, -1))) {
                UPD_STATIC_PROP(string, eTag, etag);
                efree(etag);
        }
@@ -1070,13 +1081,11 @@ PHP_METHOD(HttpResponse, send)
        if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &clean_ob)) {
                RETURN_FALSE;
        }
-       if (SG(headers_sent)) {
-               http_error(HE_WARNING, HTTP_E_RESPONSE, "Cannot send HttpResponse, headers have already been sent");
-               RETURN_FALSE;
-       }
+       
+       HTTP_CHECK_HEADERS_SENT(RETURN_FALSE);
 
        sent = GET_STATIC_PROP(sent);
-       if (zval_is_true(sent)) {
+       if (Z_LVAL_P(sent)) {
                http_error(HE_WARNING, HTTP_E_RESPONSE, "Cannot send HttpResponse, response has already been sent");
                RETURN_FALSE;
        } else {
@@ -1129,6 +1138,10 @@ PHP_METHOD(HttpResponse, send)
                if (etag_p) zval_ptr_dtor(&etag_p);
                if (lmod_p) zval_ptr_dtor(&lmod_p);
                if (cctl_p) zval_ptr_dtor(&cctl_p);
+       
+               if (php_ob_handler_used("blackhole" TSRMLS_CC)) {
+                       RETURN_TRUE;
+               }
        }
 
        /* content type */
@@ -1227,6 +1240,8 @@ PHP_METHOD(HttpResponse, send)
 PHP_METHOD(HttpResponse, capture)
 {
        NO_ARGS;
+       
+       HTTP_CHECK_HEADERS_SENT(RETURN_FALSE);
 
        UPD_STATIC_PROP(long, catch, 1);