- example
[m6w6/ext-http] / http_response_object.c
index e345cfe1c39ec1b76487b1d6d0f0c2977ca21eb2..28d662ae6cc9d925a2bfb4179d9ff66ac3c5d7ac 100644 (file)
@@ -179,6 +179,8 @@ 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(PUBLIC, string, dummy, "EMPTY");
 }
 
 /* ### USERLAND ### */
@@ -476,6 +478,10 @@ PHP_METHOD(HttpResponse, setData)
        SET_STATIC_PROP(data, the_data);
        ZVAL_LONG(GET_STATIC_PROP(lastModified), http_last_modified(the_data, SEND_DATA));
        ZVAL_LONG(GET_STATIC_PROP(mode), SEND_DATA);
+       if (!Z_STRLEN_P(GET_STATIC_PROP(eTag))) {
+               SET_STATIC_PROP_STRING(eTag, http_etag(Z_STRVAL_P(the_data), Z_STRLEN_P(the_data), SEND_DATA), 0);
+       }
+
        RETURN_TRUE;
 }
 /* }}} */
@@ -507,12 +513,17 @@ PHP_METHOD(HttpResponse, setStream)
        if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &the_stream)) {
                RETURN_FALSE;
        }
+       zend_list_addref(Z_LVAL_P(the_stream));
+       php_stream_from_zval(the_real_stream, &the_stream);
 
        USE_STATIC_PROP();
-       php_stream_from_zval(the_real_stream, &the_stream);
        ZVAL_LONG(GET_STATIC_PROP(stream), Z_LVAL_P(the_stream));
        ZVAL_LONG(GET_STATIC_PROP(lastModified), http_last_modified(the_real_stream, SEND_RSRC));
        ZVAL_LONG(GET_STATIC_PROP(mode), SEND_RSRC);
+       if (!Z_STRLEN_P(GET_STATIC_PROP(eTag))) {
+               SET_STATIC_PROP_STRING(eTag, http_etag(the_real_stream, 0, SEND_RSRC), 0);
+       }
+
        RETURN_TRUE;
 }
 /* }}} */
@@ -548,6 +559,9 @@ PHP_METHOD(HttpResponse, setFile)
        SET_STATIC_PROP(file, the_file);
        ZVAL_LONG(GET_STATIC_PROP(lastModified), http_last_modified(the_file, -1));
        ZVAL_LONG(GET_STATIC_PROP(mode), -1);
+       if (!Z_STRLEN_P(GET_STATIC_PROP(eTag))) {
+               SET_STATIC_PROP_STRING(eTag, http_etag(the_file, 0, -1), 0);
+       }
 
        RETURN_TRUE;
 }
@@ -571,6 +585,17 @@ PHP_METHOD(HttpResponse, getFile)
 /* {{{ proto bool HttpResponse::send([bool clean_ob = true])
  *
  * Finally send the entity.
+ *
+ * Example:
+ * <pre>
+ * <?php
+ * HttpResponse::setCache(true);
+ * HttpResponse::setContentType('application/pdf');
+ * HttpResponse::setContentDisposition("$user.pdf", false);
+ * HttpResponse::setFile('sheet.pdf');
+ * HttpResponse::send();
+ * ?>
+ * </pre>
  */
 PHP_METHOD(HttpResponse, send)
 {
@@ -580,6 +605,10 @@ 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(E_WARNING, HTTP_E_HEADER, "Cannot send HttpResponse, headers have already been sent");
+               RETURN_FALSE;
+       }
 
        if (clean_ob) {
                /* interrupt on-the-fly etag generation */
@@ -590,7 +619,7 @@ PHP_METHOD(HttpResponse, send)
 
        /* gzip */
        if (Z_LVAL_P(GET_STATIC_PROP(gzip))) {
-               php_start_ob_buffer_named("ob_gzhandler", 0, 1 TSRMLS_CC);
+               php_start_ob_buffer_named("ob_gzhandler", 0, 0 TSRMLS_CC);
        } else {
                php_start_ob_buffer(NULL, 0, 0 TSRMLS_CC);
        }
@@ -617,7 +646,7 @@ PHP_METHOD(HttpResponse, send)
                } else {
                        char *ctypes = INI_STR("default_mimetype");
                        size_t ctlen = ctypes ? strlen(ctypes) : 0;
-                       
+
                        if (ctlen) {
                                http_send_content_type(ctypes, ctlen);
                        } else {
@@ -658,6 +687,7 @@ PHP_METHOD(HttpResponse, send)
                        {
                                php_stream *the_real_stream;
                                zval *the_stream = GET_STATIC_PROP(stream);
+                               the_stream->type = IS_RESOURCE;
                                php_stream_from_zval(the_real_stream, &the_stream);
                                RETURN_SUCCESS(http_send_stream(the_real_stream));
                        }