|
|
|
@ -187,7 +187,7 @@ int http_response_handle_cachable(request_st * const r, const buffer * const lmo
|
|
|
|
|
return HANDLER_GO_ON;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const buffer *vb;
|
|
|
|
|
const buffer *vb, *etag;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 14.26 If-None-Match
|
|
|
|
@ -200,10 +200,12 @@ int http_response_handle_cachable(request_st * const r, const buffer * const lmo
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
if ((vb = http_header_request_get(r, HTTP_HEADER_IF_NONE_MATCH,
|
|
|
|
|
CONST_STR_LEN("If-None-Match")))) {
|
|
|
|
|
CONST_STR_LEN("If-None-Match")))
|
|
|
|
|
&& (etag = http_header_response_get(r, HTTP_HEADER_ETAG,
|
|
|
|
|
CONST_STR_LEN("ETag")))) {
|
|
|
|
|
/*(weak etag comparison must not be used for ranged requests)*/
|
|
|
|
|
int range_request = (0 != light_btst(r->rqst_htags, HTTP_HEADER_RANGE));
|
|
|
|
|
if (http_etag_matches(&r->physical.etag, vb->ptr, !range_request)) {
|
|
|
|
|
if (http_etag_matches(etag, vb->ptr, !range_request)) {
|
|
|
|
|
if (http_method_get_or_head(r->http_method)) {
|
|
|
|
|
r->http_status = 304;
|
|
|
|
|
return HANDLER_FINISHED;
|
|
|
|
@ -382,10 +384,9 @@ void http_response_send_file (request_st * const r, const buffer * const path, s
|
|
|
|
|
const buffer *etag =
|
|
|
|
|
stat_cache_etag_get(sce, r->conf.etag_flags);
|
|
|
|
|
if (etag && !buffer_is_blank(etag)) {
|
|
|
|
|
buffer_copy_buffer(&r->physical.etag, etag);
|
|
|
|
|
http_header_response_set(r, HTTP_HEADER_ETAG,
|
|
|
|
|
CONST_STR_LEN("ETag"),
|
|
|
|
|
BUF_PTR_LEN(&r->physical.etag));
|
|
|
|
|
BUF_PTR_LEN(etag));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|