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

Reply via email to