diff src/http/modules/ngx_http_gzip_filter.c @ 315:39b6f2df45c0

nginx-0.0.3-2004-04-14-21:44:28 import
author Igor Sysoev <igor@sysoev.ru>
date Wed, 14 Apr 2004 17:44:28 +0000
parents d71c87d11b16
children 7a8ebba985a9
line wrap: on
line diff
--- a/src/http/modules/ngx_http_gzip_filter.c
+++ b/src/http/modules/ngx_http_gzip_filter.c
@@ -96,10 +96,8 @@ static ngx_conf_enum_t  ngx_http_gzip_ht
 
 static ngx_conf_enum_t  ngx_http_gzip_proxied[] = {
     { ngx_string("off"), NGX_HTTP_GZIP_PROXIED_OFF },
-#if 0
     { ngx_string("nocachable"), NGX_HTTP_GZIP_PROXIED_NOCACHABLE },
     { ngx_string("poor_cachable"), NGX_HTTP_GZIP_PROXIED_POOR_CACHABLE },
-#endif
     { ngx_string("on"), NGX_HTTP_GZIP_PROXIED_ON },
     { ngx_null_string, 0 }
 };
@@ -223,6 +221,7 @@ static ngx_http_output_body_filter_pt   
 
 static int ngx_http_gzip_header_filter(ngx_http_request_t *r)
 {
+    time_t                 date, expires;
     ngx_http_gzip_ctx_t   *ctx;
     ngx_http_gzip_conf_t  *conf;
 
@@ -250,9 +249,67 @@ static int ngx_http_gzip_header_filter(n
     }
 
 
-    /* TODO: proxied */
-    if (r->headers_in.via && conf->proxied == NGX_HTTP_GZIP_PROXIED_OFF) {
-        return ngx_http_next_header_filter(r);
+    if (r->headers_in.via && conf->proxied != NGX_HTTP_GZIP_PROXIED_ON) {
+
+        if (conf->proxied == NGX_HTTP_GZIP_PROXIED_OFF) {
+            return ngx_http_next_header_filter(r);
+        }
+
+        if (r->headers_out.expires) {
+            expires = ngx_http_parse_time(r->headers_out.expires->value.data,
+                                          r->headers_out.expires->value.len);
+            if (expires == NGX_ERROR) {
+                return ngx_http_next_header_filter(r);
+            }
+
+            if (r->headers_out.date) {
+                date = ngx_http_parse_time(r->headers_out.date->value.data,
+                                           r->headers_out.date->value.len);
+                if (date == NGX_ERROR) {
+                    return ngx_http_next_header_filter(r);
+                }
+
+            } else {
+                date = ngx_cached_time;
+            }
+
+            if (expires >= date) {
+                return ngx_http_next_header_filter(r);
+            }
+
+        } else if (r->headers_out.cache_control) {
+
+            if (conf->proxied == NGX_HTTP_GZIP_PROXIED_NOCACHABLE) {
+                if (ngx_strstr(r->headers_out.cache_control->value.data,
+                               "no-cache") == NULL)
+                {
+                    return ngx_http_next_header_filter(r);
+                }
+
+            } else {  /* NGX_HTTP_GZIP_PROXIED_POOR_CACHABLE */
+
+                /* STUB: should be one cycle for all values */
+
+                if (ngx_strstr(r->headers_out.cache_control->value.data,
+                               "no-cache") == NULL
+                    && ngx_strstr(r->headers_out.cache_control->value.data,
+                                  "private") == NULL
+                    && ngx_strstr(r->headers_out.cache_control->value.data,
+                                  "no-store") == NULL)
+                {
+                    return ngx_http_next_header_filter(r);
+                }
+            }
+
+        } else if (conf->proxied == NGX_HTTP_GZIP_PROXIED_NOCACHABLE) {
+            return ngx_http_next_header_filter(r);
+
+        } else {  /* NGX_HTTP_GZIP_PROXIED_POOR_CACHABLE */
+
+            if (r->headers_out.last_modified || r->headers_out.etag) {
+                return ngx_http_next_header_filter(r);
+            }
+        }
     }
 
 
@@ -533,7 +590,7 @@ static int ngx_http_gzip_body_filter(ngx
                     trailer->crc32 = ctx->crc32;
                     trailer->zlen = ctx->zin;
 #else
-                    /* STUB */
+                    /* STUB */ Oops !
 #endif
 
                     ctx->zstream.avail_in = 0;