]> git.kaiwu.me - nginx.git/commitdiff
Entity tags: set for static respones.
authorMaxim Dounin <mdounin@mdounin.ru>
Mon, 9 Jul 2012 00:13:06 +0000 (00:13 +0000)
committerMaxim Dounin <mdounin@mdounin.ru>
Mon, 9 Jul 2012 00:13:06 +0000 (00:13 +0000)
src/http/modules/ngx_http_flv_module.c
src/http/modules/ngx_http_gzip_static_module.c
src/http/modules/ngx_http_mp4_module.c
src/http/modules/ngx_http_static_module.c
src/http/ngx_http_core_module.c
src/http/ngx_http_core_module.h

index 03a74680379ee42273ecdfb91927ef725f7e9924..cc2532027cc207901925c507e80daa3c1c7c311c 100644 (file)
@@ -194,6 +194,10 @@ ngx_http_flv_handler(ngx_http_request_t *r)
     r->headers_out.content_length_n = len;
     r->headers_out.last_modified_time = of.mtime;
 
+    if (ngx_http_set_etag(r) != NGX_OK) {
+        return NGX_HTTP_INTERNAL_SERVER_ERROR;
+    }
+
     if (ngx_http_set_content_type(r) != NGX_OK) {
         return NGX_HTTP_INTERNAL_SERVER_ERROR;
     }
index b0183e0aaa1dcf35d5eb0c3c9741f0a2e796039a..da359766dde8889f6c3dbb5f938d5c81d1808642 100644 (file)
@@ -207,6 +207,10 @@ ngx_http_gzip_static_handler(ngx_http_request_t *r)
     r->headers_out.content_length_n = of.size;
     r->headers_out.last_modified_time = of.mtime;
 
+    if (ngx_http_set_etag(r) != NGX_OK) {
+        return NGX_HTTP_INTERNAL_SERVER_ERROR;
+    }
+
     if (ngx_http_set_content_type(r) != NGX_OK) {
         return NGX_HTTP_INTERNAL_SERVER_ERROR;
     }
index d3be23420e662685e8506d5c40d6e02250a1a06a..a216c87efe5bc8f1181a1d6c31bc19c3c04ca19b 100644 (file)
@@ -586,6 +586,10 @@ ngx_http_mp4_handler(ngx_http_request_t *r)
     r->headers_out.status = NGX_HTTP_OK;
     r->headers_out.last_modified_time = of.mtime;
 
+    if (ngx_http_set_etag(r) != NGX_OK) {
+        return NGX_HTTP_INTERNAL_SERVER_ERROR;
+    }
+
     if (ngx_http_set_content_type(r) != NGX_OK) {
         return NGX_HTTP_INTERNAL_SERVER_ERROR;
     }
index 9d77e43b119582edb9ad4660c8447f339e38c8bd..631eb17b26757402c09759e43741015fcd4cf995 100644 (file)
@@ -220,6 +220,10 @@ ngx_http_static_handler(ngx_http_request_t *r)
     r->headers_out.content_length_n = of.size;
     r->headers_out.last_modified_time = of.mtime;
 
+    if (ngx_http_set_etag(r) != NGX_OK) {
+        return NGX_HTTP_INTERNAL_SERVER_ERROR;
+    }
+
     if (ngx_http_set_content_type(r) != NGX_OK) {
         return NGX_HTTP_INTERNAL_SERVER_ERROR;
     }
index 6d7dc0abed43e3c657a0f0395112ea8bda7b4c74..ebc9f7413465b97673049e0aa5edcfa2889714e8 100644 (file)
@@ -1808,6 +1808,35 @@ ngx_http_set_exten(ngx_http_request_t *r)
 }
 
 
+ngx_int_t
+ngx_http_set_etag(ngx_http_request_t *r)
+{
+    ngx_table_elt_t  *etag;
+
+    etag = ngx_list_push(&r->headers_out.headers);
+    if (etag == NULL) {
+        return NGX_ERROR;
+    }
+
+    etag->hash = 1;
+    ngx_str_set(&etag->key, "ETag");
+
+    etag->value.data = ngx_pnalloc(r->pool, NGX_OFF_T_LEN + NGX_TIME_T_LEN + 3);
+    if (etag->value.data == NULL) {
+        return NGX_ERROR;
+    }
+
+    etag->value.len = ngx_sprintf(etag->value.data, "\"%xT-%xO\"",
+                                  r->headers_out.last_modified_time,
+                                  r->headers_out.content_length_n)
+                      - etag->value.data;
+
+    r->headers_out.etag = etag;
+
+    return NGX_OK;
+}
+
+
 ngx_int_t
 ngx_http_send_response(ngx_http_request_t *r, ngx_uint_t status,
     ngx_str_t *ct, ngx_http_complex_value_t *cv)
index 2c96167a01642e78ada086af04d5beabba5ea3e1..52b3dde3cc5be3957db31d0d40bf8d9fb96cb667 100644 (file)
@@ -480,6 +480,7 @@ ngx_int_t ngx_http_core_content_phase(ngx_http_request_t *r,
 void *ngx_http_test_content_type(ngx_http_request_t *r, ngx_hash_t *types_hash);
 ngx_int_t ngx_http_set_content_type(ngx_http_request_t *r);
 void ngx_http_set_exten(ngx_http_request_t *r);
+ngx_int_t ngx_http_set_etag(ngx_http_request_t *r);
 ngx_int_t ngx_http_send_response(ngx_http_request_t *r, ngx_uint_t status,
     ngx_str_t *ct, ngx_http_complex_value_t *cv);
 u_char *ngx_http_map_uri_to_path(ngx_http_request_t *r, ngx_str_t *name,