It doesn't make sense to check If-Modified-Since if If-None-Match has a value but wasn't matched. https://tools.ietf.org/html/rfc7232#section-3.3
Signed-off-by: Sergey Ponomarev <stok...@gmail.com> --- networking/httpd.c | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/networking/httpd.c b/networking/httpd.c index 6cd40c13b..93db24f25 100644 --- a/networking/httpd.c +++ b/networking/httpd.c @@ -1791,19 +1791,26 @@ static NOINLINE void send_file_and_exit(const char *url, int what) } #endif #if ENABLE_FEATURE_HTTPD_LAST_MODIFIED - if (G.if_modified_since) { - if (DEBUG) - bb_perror_msg("If-Modified-Since and file's Last-Modified are: '%s' '%s'\n", G.if_modified_since, G.last_mod_date); - /* Simple match If-Modified-Since and Last-Modified as plain string. - * In most cases client will send If-Modified-Since exactly the same as it retrieved on previous GET. - * If a resource wasn't updated then they will be just the same and return 304. - * If resource was updated then client's If-Modified-Since will be outdated and not the same and return 200. - * If the If-Modified-Since is a custom date and not from cached resource then this match will always fail and return 200. - * But such cases normally are not expected. */ - if (strcmp(G.if_modified_since, G.last_mod_date) == 0) { - send_headers_and_exit(HTTP_NOT_MODIFIED); + #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) { + #endif + if (G.if_modified_since) { + if (DEBUG) + bb_perror_msg("If-Modified-Since and file's Last-Modified are: '%s' '%s'\n", G.if_modified_since, G.last_mod_date); + /* Simple match If-Modified-Since and Last-Modified as plain string. + * In most cases client will send If-Modified-Since exactly the same as it retrieved on previous GET. + * If a resource wasn't updated then they will be just the same and return 304. + * If resource was updated then client's If-Modified-Since will be outdated and not the same and return 200. + * If the If-Modified-Since is a custom date and not from cached resource then this match will always fail and return 200. + * But such cases normally are not expected. */ + if (strcmp(G.if_modified_since, G.last_mod_date) == 0) { + send_headers_and_exit(HTTP_NOT_MODIFIED); + } } + #if ENABLE_FEATURE_HTTPD_ETAG } + #endif #endif /* If you want to know about EPIPE below * (happens if you abort downloads from local httpd): */ -- 2.27.0 _______________________________________________ busybox mailing list busybox@busybox.net http://lists.busybox.net/mailman/listinfo/busybox