When matched by ETag then we anyway should send 304 with ETag. This is because If-None-Match may have few ETags and client needs to know which one exactly matched. But we don't have to send Last-Modified on 304 because it will be always the same as client have cached.
On 304 skip to send headers: * Content-Type * Accept-Ranges: bytes * Last-Modified * ETag All those headers will be stored by client and in browsers JavaScript will anyway return correct document.lastModified and document.contentType Signed-off-by: Sergey Ponomarev <[email protected]> --- networking/httpd.c | 60 ++++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/networking/httpd.c b/networking/httpd.c index 93db24f25..72c1ce937 100644 --- a/networking/httpd.c +++ b/networking/httpd.c @@ -1132,7 +1132,7 @@ static void send_headers(unsigned responseNum) ); } - if (responseNum != HTTP_OK || found_mime_type) { + if ((responseNum != HTTP_NOT_MODIFIED) && (responseNum != HTTP_OK || found_mime_type)) { len += sprintf(iobuf + len, "Content-type: %s\r\n", /* if it's error message, then it's HTML */ @@ -1222,32 +1222,38 @@ static void send_headers(unsigned responseNum) // (NB: standards do not define "Transfer-Length:" _header_, // transfer-length above is just a concept). - len += sprintf(iobuf + len, -#if ENABLE_FEATURE_HTTPD_RANGES - "Accept-Ranges: bytes\r\n" -#endif -#if ENABLE_FEATURE_HTTPD_LAST_MODIFIED - "Last-Modified: %s\r\n" -#endif -#if ENABLE_FEATURE_HTTPD_ETAG - "ETag: %s\r\n" -#endif - - /* Because of 4.4 (5), we can forgo sending of "Content-Length" - * since we close connection afterwards, but it helps clients - * to e.g. estimate download times, show progress bars etc. - * Theoretically we should not send it if page is compressed, - * but de-facto standard is to send it (see comment below). - */ - "Content-Length: %"OFF_FMT"u\r\n", -#if ENABLE_FEATURE_HTTPD_LAST_MODIFIED + if (responseNum == HTTP_NOT_MODIFIED) { + #if ENABLE_FEATURE_HTTPD_ETAG + len += sprintf(iobuf + len, "ETag: %s\r\n", G.etag); + #endif + } else { + len += sprintf(iobuf + len, + #if ENABLE_FEATURE_HTTPD_RANGES + "Accept-Ranges: bytes\r\n" + #endif + #if ENABLE_FEATURE_HTTPD_LAST_MODIFIED + "Last-Modified: %s\r\n" + #endif + #if ENABLE_FEATURE_HTTPD_ETAG + "ETag: %s\r\n" + #endif + + /* Because of 4.4 (5), we can forgot sending of "Content-Length" + * since we close connection afterwards, but it helps clients + * to e.g. estimate download times, show progress bars etc. + * Theoretically we should not send it if page is compressed, + * but de-facto standard is to send it (see comment below). + */ + "Content-Length: %"OFF_FMT"u\r\n", + #if ENABLE_FEATURE_HTTPD_LAST_MODIFIED G.last_mod_date, -#endif -#if ENABLE_FEATURE_HTTPD_ETAG + #endif + #if ENABLE_FEATURE_HTTPD_ETAG G.etag, -#endif + #endif file_size - ); + ); + } } /* This should be "Transfer-Encoding", not "Content-Encoding": @@ -1773,10 +1779,6 @@ static NOINLINE void send_file_and_exit(const char *url, int what) send_headers_and_exit(HTTP_NOT_FOUND); log_and_exit(); } -#if ENABLE_FEATURE_HTTPD_LAST_MODIFIED - /* Generate Last-Modified header */ - strftime(G.last_mod_date, sizeof(G.last_mod_date), RFC1123FMT, gmtime_r(&last_mod, &tm)); -#endif #if ENABLE_FEATURE_HTTPD_ETAG /* ETag is "hex(last_mod)-hex(file_size)" e.g. "5e132e20-417" */ sprintf(G.etag, "\"%llx-%llx\"", (unsigned long long)last_mod, (unsigned long long)file_size); @@ -1791,6 +1793,8 @@ static NOINLINE void send_file_and_exit(const char *url, int what) } #endif #if ENABLE_FEATURE_HTTPD_LAST_MODIFIED + /* Generate Last-Modified header */ + strftime(G.last_mod_date, sizeof(G.last_mod_date), RFC1123FMT, gmtime_r(&last_mod, &tm)); #if ENABLE_FEATURE_HTTPD_ETAG /* if ETag present but wasn't matched then no sense to match by If-Modified-Since */ if (!G.if_none_match) { -- 2.27.0 _______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
