X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_send_api.c;h=41ba3058e556d1089853ecf3e2d670ce10696531;hp=9318efd738dd354bf25cb15c69281bc6af328445;hb=bb6571e22d14c87114eb729145be2e7b87ebea42;hpb=cf9967800843ea01e77b374b4d78fad4bc18a3f6 diff --git a/http_send_api.c b/http_send_api.c index 9318efd..41ba305 100644 --- a/http_send_api.c +++ b/http_send_api.c @@ -27,6 +27,7 @@ #include "php_http.h" #include "php_http_std_defs.h" #include "php_http_api.h" +#include "php_http_date_api.h" #include "php_http_send_api.h" #include "php_http_headers_api.h" #include "php_http_date_api.h" @@ -125,7 +126,7 @@ static STATUS _http_send_chunk(const void *data, size_t begin, size_t end, http_ PHP_HTTP_API STATUS _http_send_status_header(int status, const char *header TSRMLS_DC) { STATUS ret; - sapi_header_line h = {(char *) header, strlen(header), status}; + sapi_header_line h = {(char *) header, header ? strlen(header) : 0, status}; if (SUCCESS != (ret = sapi_header_op(SAPI_HEADER_REPLACE, &h TSRMLS_CC))) { http_error_ex(E_WARNING, HTTP_E_HEADER, "Could not send header: %s (%d)", header, status); } @@ -325,12 +326,13 @@ PHP_HTTP_API STATUS _http_send(const void *data_ptr, size_t data_size, http_send /* stop on-the-fly etag generation */ if (cache_etag = HTTP_G(etag_started)) { - /* interrupt */ + /* interrupt ob_etaghandler */ HTTP_G(etag_started) = 0; - /* never ever use the output to compute the ETag if http_send() is used */ - php_end_ob_buffers(0 TSRMLS_CC); } + /* enable partial dl and resume */ + http_send_header("Accept-Ranges: bytes"); + zend_hash_init(&ranges, 0, NULL, ZVAL_PTR_DTOR, 0); range_status = http_get_request_ranges(&ranges, data_size); @@ -342,8 +344,8 @@ PHP_HTTP_API STATUS _http_send(const void *data_ptr, size_t data_size, http_send /* Range Request - only send ranges if entity hasn't changed */ if ( range_status == RANGE_OK && - http_etag_match_ex("HTTP_IF_MATCH", HTTP_G(etag), 0) && - http_modified_match_ex("HTTP_IF_UNMODIFIED_SINCE", HTTP_G(lmod), 0)) { + http_match_etag_ex("HTTP_IF_MATCH", HTTP_G(etag), 0) && + http_match_last_modified_ex("HTTP_IF_UNMODIFIED_SINCE", HTTP_G(lmod), 0)) { STATUS result = http_send_ranges(&ranges, data_ptr, data_size, data_mode); zend_hash_destroy(&ranges); return result; @@ -354,24 +356,23 @@ PHP_HTTP_API STATUS _http_send(const void *data_ptr, size_t data_size, http_send /* send 304 Not Modified if etag matches */ if (cache_etag) { char *etag = NULL; - int etag_match = 0; if (!(etag = http_etag(data_ptr, data_size, data_mode))) { return FAILURE; } - - http_send_etag(etag, 32); - etag_match = http_etag_match("HTTP_IF_NONE_MATCH", etag); - efree(etag); - - if (etag_match) { - return http_send_status(304); + if (SUCCESS != http_send_etag(etag, 32)) { + efree(etag); + return FAILURE; } + if (http_match_etag("HTTP_IF_NONE_MATCH", etag)) { + return http_cache_exit_ex(etag, 1, 1); + } + efree(etag); } /* send 304 Not Modified if last modified matches */ - if (http_modified_match("HTTP_IF_MODIFIED_SINCE", HTTP_G(lmod))) { - return http_send_status(304); + if (http_match_last_modified("HTTP_IF_MODIFIED_SINCE", HTTP_G(lmod))) { + return http_cache_exit_ex(http_date(HTTP_G(lmod)), 0, 1); } /* send full entity */