diff src/http/modules/ngx_http_ssi_filter_module.c @ 78:9db7e0b5b27f NGINX_0_1_39

nginx 0.1.39 *) The changes in the ngx_http_charset_module: the "default_charset" directive was canceled; the "charset" directive sets the response charset; the "source_charset" directive sets the source charset only. *) Bugfix: the backend "WWW-Authenticate" header line did not transferred while the 401 response code redirecting. *) Bugfix: the ngx_http_proxy_module and ngx_http_fastcgi_module may close a connection before anything was transferred to a client; bug appeared in 0.1.38. *) Workaround: the Linux glibc crypt_r() initialization bug. *) Bugfix: the ngx_http_ssi_module did not support the relative URI in the "include virtual" command. *) Bugfix: if the backend response had the "Location" header line and nginx should not rewrite this line, then the 500 code response body was transferred; bug appeared in 0.1.29. *) Bugfix: some directives of the ngx_http_proxy_module and ngx_http_fastcgi_module were not inherited from the server to the location level; bug appeared in 0.1.29. *) Bugfix: the ngx_http_ssl_module did not support the certificate chain. *) Bugfix: the ngx_http_autoindex_module did not show correctly the long file names; bug appeared in 0.1.38. *) Bugfixes in IMAP/POP3 proxy in interaction with a backend at the login state.
author Igor Sysoev <http://sysoev.ru>
date Thu, 14 Jul 2005 00:00:00 +0400
parents da9a3b14312d
children 2aa14f638cf0
line wrap: on
line diff
--- a/src/http/modules/ngx_http_ssi_filter_module.c
+++ b/src/http/modules/ngx_http_ssi_filter_module.c
@@ -1373,8 +1373,8 @@ static ngx_int_t
 ngx_http_ssi_include(ngx_http_request_t *r, ngx_http_ssi_ctx_t *ctx,
     ngx_str_t **params)
 {
-    u_char                      ch, *p, **value;
-    size_t                     *size, len;
+    u_char                      ch, *p, **value, *data;
+    size_t                     *size, len, prefix;
     ngx_uint_t                  i, j, n, bracket;
     ngx_str_t                   uri, args, name;
     ngx_array_t                 lengths, values;
@@ -1385,6 +1385,7 @@ ngx_http_ssi_include(ngx_http_request_t 
     uri = *params[NGX_HTTP_SSI_INCLUDE_VIRTUAL];
     args.len = 0;
     args.data = NULL;
+    prefix = 0;
 
     n = ngx_http_script_variables_count(&uri);
 
@@ -1497,6 +1498,24 @@ ngx_http_ssi_include(ngx_http_request_t 
             *value = name.data;
         }
 
+        size = lengths.elts;
+        value = values.elts;
+
+        for (i = 0; i < values.nelts; i++) {
+            if (size[i] != 0) {
+                if (*value[i] != '/') {
+                    for (prefix = r->uri.len; prefix; prefix--) {
+                        if (r->uri.data[prefix - 1] == '/') {
+                            len += prefix;
+                            break;
+                        }
+                    }
+                }
+
+                break;
+            }
+        }
+
         p = ngx_palloc(r->pool, len);
         if (p == NULL) {
             return NGX_HTTP_SSI_ERROR;
@@ -1505,12 +1524,37 @@ ngx_http_ssi_include(ngx_http_request_t 
         uri.len = len;
         uri.data = p;
 
-        size = lengths.elts;
-        value = values.elts;
+        if (prefix) {
+            p = ngx_cpymem(p, r->uri.data, prefix);
+        }
 
         for (i = 0; i < values.nelts; i++) {
             p = ngx_cpymem(p, value[i], size[i]);
         }
+
+    } else {
+        if (uri.data[0] != '/') {
+            for (prefix = r->uri.len; prefix; prefix--) {
+                if (r->uri.data[prefix - 1] == '/') {
+                    break;
+                }
+            }
+
+            if (prefix) {
+                len = prefix + uri.len;
+
+                data = ngx_palloc(r->pool, len);
+                if (data == NULL) {
+                    return NGX_HTTP_SSI_ERROR;
+                }
+
+                p = ngx_cpymem(data, r->uri.data, prefix);
+                ngx_memcpy(p, uri.data, uri.len);
+
+                uri.len = len;
+                uri.data = data;
+            }
+        }
     }
 
     for (i = 0; i < uri.len; i++) {