- fixed a gotcha in http_chunked_decode (-size_t is always > 0)
[m6w6/ext-http] / http_send_api.c
index ba6122bd08fdbe00556aed541a35cf4439baf1e0..3f6f2a6ef524c75e9b5071b9ba8e52cd55338eba 100644 (file)
@@ -263,33 +263,33 @@ PHP_HTTP_API STATUS _http_send_content_disposition(const char *filename, size_t
 /* {{{ STATUS http_send_ranges(HashTable *, void *, size_t, http_send_mode) */
 PHP_HTTP_API STATUS _http_send_ranges(HashTable *ranges, const void *data, size_t size, http_send_mode mode TSRMLS_DC)
 {
 /* {{{ STATUS http_send_ranges(HashTable *, void *, size_t, http_send_mode) */
 PHP_HTTP_API STATUS _http_send_ranges(HashTable *ranges, const void *data, size_t size, http_send_mode mode TSRMLS_DC)
 {
-       long **begin, **end;
-       zval **zrange;
+       zval **zbegin, **zend, **zrange;
 
        /* single range */
        if (zend_hash_num_elements(ranges) == 1) {
                char range_header[256] = {0};
 
                if (SUCCESS != zend_hash_index_find(ranges, 0, (void **) &zrange) ||
 
        /* single range */
        if (zend_hash_num_elements(ranges) == 1) {
                char range_header[256] = {0};
 
                if (SUCCESS != zend_hash_index_find(ranges, 0, (void **) &zrange) ||
-                       SUCCESS != zend_hash_index_find(Z_ARRVAL_PP(zrange), 0, (void **) &begin) ||
-                       SUCCESS != zend_hash_index_find(Z_ARRVAL_PP(zrange), 1, (void **) &end)) {
+                       SUCCESS != zend_hash_index_find(Z_ARRVAL_PP(zrange), 0, (void **) &zbegin) ||
+                       SUCCESS != zend_hash_index_find(Z_ARRVAL_PP(zrange), 1, (void **) &zend)) {
                        http_send_status(500);
                        return FAILURE;
                }
                        http_send_status(500);
                        return FAILURE;
                }
-
+               
                /* Send HTTP 206 Partial Content */
                http_send_status(206);
 
                /* send content range header */
                /* Send HTTP 206 Partial Content */
                http_send_status(206);
 
                /* send content range header */
-               snprintf(range_header, 255, "Content-Range: bytes %ld-%ld/%lu", **begin, **end, (ulong) size);
+               snprintf(range_header, 255, "Content-Range: bytes %ld-%ld/%lu", Z_LVAL_PP(zbegin), Z_LVAL_PP(zend), (ulong) size);
                http_send_header_string(range_header);
 
                /* send requested chunk */
                http_send_header_string(range_header);
 
                /* send requested chunk */
-               return http_send_chunk(data, **begin, **end + 1, mode);
+               return http_send_chunk(data, Z_LVAL_PP(zbegin), Z_LVAL_PP(zend) + 1, mode);
        }
 
        /* multi range */
        else {
        }
 
        /* multi range */
        else {
+               size_t preface_len;
                char bound[23] = {0}, preface[1024] = {0},
                        multi_header[68] = "Content-Type: multipart/byteranges; boundary=";
 
                char bound[23] = {0}, preface[1024] = {0},
                        multi_header[68] = "Content-Type: multipart/byteranges; boundary=";
 
@@ -303,12 +303,12 @@ PHP_HTTP_API STATUS _http_send_ranges(HashTable *ranges, const void *data, size_
 
                /* send each requested chunk */
                FOREACH_HASH_VAL(ranges, zrange) {
 
                /* send each requested chunk */
                FOREACH_HASH_VAL(ranges, zrange) {
-                       if (SUCCESS != zend_hash_index_find(Z_ARRVAL_PP(zrange), 0, (void **) &begin) ||
-                               SUCCESS != zend_hash_index_find(Z_ARRVAL_PP(zrange), 1, (void **) &end)) {
+                       if (SUCCESS != zend_hash_index_find(Z_ARRVAL_PP(zrange), 0, (void **) &zbegin) ||
+                               SUCCESS != zend_hash_index_find(Z_ARRVAL_PP(zrange), 1, (void **) &zend)) {
                                break;
                        }
 
                                break;
                        }
 
-                       snprintf(preface, 1023,
+                       preface_len = snprintf(preface, 1023,
                                HTTP_CRLF "%s"
                                HTTP_CRLF "Content-Type: %s"
                                HTTP_CRLF "Content-Range: bytes %ld-%ld/%lu"
                                HTTP_CRLF "%s"
                                HTTP_CRLF "Content-Type: %s"
                                HTTP_CRLF "Content-Range: bytes %ld-%ld/%lu"
@@ -317,13 +317,13 @@ PHP_HTTP_API STATUS _http_send_ranges(HashTable *ranges, const void *data, size_
 
                                bound,
                                HTTP_G(send).content_type ? HTTP_G(send).content_type : "application/x-octetstream",
 
                                bound,
                                HTTP_G(send).content_type ? HTTP_G(send).content_type : "application/x-octetstream",
-                               **begin,
-                               **end,
+                               Z_LVAL_PP(zbegin),
+                               Z_LVAL_PP(zend),
                                (ulong) size
                        );
 
                                (ulong) size
                        );
 
-                       PHPWRITE(preface, strlen(preface));
-                       http_send_chunk(data, **begin, **end + 1, mode);
+                       PHPWRITE(preface, preface_len);
+                       http_send_chunk(data, Z_LVAL_PP(zbegin), Z_LVAL_PP(zend) + 1, mode);
                }
 
                /* write boundary once more */
                }
 
                /* write boundary once more */
@@ -337,7 +337,7 @@ PHP_HTTP_API STATUS _http_send_ranges(HashTable *ranges, const void *data, size_
 /* }}} */
 
 /* {{{ STATUS http_send(void *, size_t, http_send_mode) */
 /* }}} */
 
 /* {{{ STATUS http_send(void *, size_t, http_send_mode) */
-PHP_HTTP_API STATUS _http_send(const void *data_ptr, size_t data_size, http_send_mode data_mode TSRMLS_DC)
+PHP_HTTP_API STATUS _http_send_ex(const void *data_ptr, size_t data_size, http_send_mode data_mode, zend_bool no_cache TSRMLS_DC)
 {
        HashTable ranges;
        http_range_status range_status;
 {
        HashTable ranges;
        http_range_status range_status;
@@ -381,7 +381,7 @@ PHP_HTTP_API STATUS _http_send(const void *data_ptr, size_t data_size, http_send
        zend_hash_destroy(&ranges);
 
        /* send 304 Not Modified if etag matches - DON'T return on ETag generation failure */
        zend_hash_destroy(&ranges);
 
        /* send 304 Not Modified if etag matches - DON'T return on ETag generation failure */
-       if (cache_etag) {
+       if (!no_cache && cache_etag) {
                char *etag = NULL;
 
                if (!(etag = http_etag(data_ptr, data_size, data_mode))) {
                char *etag = NULL;
 
                if (!(etag = http_etag(data_ptr, data_size, data_mode))) {
@@ -400,7 +400,7 @@ PHP_HTTP_API STATUS _http_send(const void *data_ptr, size_t data_size, http_send
        }
 
        /* send 304 Not Modified if last modified matches */
        }
 
        /* send 304 Not Modified if last modified matches */
-       if (http_match_last_modified("HTTP_IF_MODIFIED_SINCE", HTTP_G(send).last_modified)) {
+       if (!no_cache && http_match_last_modified("HTTP_IF_MODIFIED_SINCE", HTTP_G(send).last_modified)) {
                char *sent_header = NULL;
                http_send_last_modified_ex(HTTP_G(send).last_modified, &sent_header);
                return http_exit_ex(304, sent_header, NULL, 0);
                char *sent_header = NULL;
                http_send_last_modified_ex(HTTP_G(send).last_modified, &sent_header);
                return http_exit_ex(304, sent_header, NULL, 0);
@@ -419,7 +419,7 @@ PHP_HTTP_API STATUS _http_send(const void *data_ptr, size_t data_size, http_send
 /* }}} */
 
 /* {{{ STATUS http_send_stream(php_stream *) */
 /* }}} */
 
 /* {{{ STATUS http_send_stream(php_stream *) */
-PHP_HTTP_API STATUS _http_send_stream_ex(php_stream *file, zend_bool close_stream TSRMLS_DC)
+PHP_HTTP_API STATUS _http_send_stream_ex(php_stream *file, zend_bool close_stream, zend_bool no_cache TSRMLS_DC)
 {
        STATUS status;
        php_stream_statbuf ssb;
 {
        STATUS status;
        php_stream_statbuf ssb;
@@ -428,7 +428,7 @@ PHP_HTTP_API STATUS _http_send_stream_ex(php_stream *file, zend_bool close_strea
                return FAILURE;
        }
 
                return FAILURE;
        }
 
-       status = http_send(file, ssb.sb.st_size, SEND_RSRC);
+       status = http_send_ex(file, ssb.sb.st_size, SEND_RSRC, no_cache);
 
        if (close_stream) {
                php_stream_close(file);
 
        if (close_stream) {
                php_stream_close(file);