[nginx] Sub filter: introduced the ngx_http_sub_match() function.

Maxim Dounin mdounin at mdounin.ru
Tue Oct 18 14:48:08 UTC 2016


details:   http://hg.nginx.org/nginx/rev/521f5aa6e8fb
branches:  stable-1.10
changeset: 6756:521f5aa6e8fb
user:      Roman Arutyunyan <arut at nginx.com>
date:      Sat Jul 02 15:59:52 2016 +0300
description:
Sub filter: introduced the ngx_http_sub_match() function.

No functional changes.

diffstat:

 src/http/modules/ngx_http_sub_filter_module.c |  83 ++++++++++++++++----------
 1 files changed, 52 insertions(+), 31 deletions(-)

diffs (119 lines):

diff --git a/src/http/modules/ngx_http_sub_filter_module.c b/src/http/modules/ngx_http_sub_filter_module.c
--- a/src/http/modules/ngx_http_sub_filter_module.c
+++ b/src/http/modules/ngx_http_sub_filter_module.c
@@ -84,6 +84,8 @@ static ngx_int_t ngx_http_sub_output(ngx
     ngx_http_sub_ctx_t *ctx);
 static ngx_int_t ngx_http_sub_parse(ngx_http_request_t *r,
     ngx_http_sub_ctx_t *ctx);
+static ngx_int_t ngx_http_sub_match(ngx_http_sub_ctx_t *ctx, ngx_int_t start,
+    ngx_str_t *m);
 
 static char * ngx_http_sub_filter(ngx_conf_t *cf, ngx_command_t *cmd,
     void *conf);
@@ -592,7 +594,7 @@ ngx_http_sub_output(ngx_http_request_t *
 static ngx_int_t
 ngx_http_sub_parse(ngx_http_request_t *r, ngx_http_sub_ctx_t *ctx)
 {
-    u_char                   *p, *last, *pat, *pat_end, c;
+    u_char                   *p, c;
     ngx_str_t                *m;
     ngx_int_t                 offset, start, next, end, len, rc;
     ngx_uint_t                shift, i, j;
@@ -641,41 +643,15 @@ ngx_http_sub_parse(ngx_http_request_t *r
 
             m = &match[i].match;
 
-            pat = m->data;
-            pat_end = m->data + m->len;
-
-            if (start >= 0) {
-                p = ctx->pos + start;
-
-            } else {
-                last = ctx->looked.data + ctx->looked.len;
-                p = last + start;
+            rc = ngx_http_sub_match(ctx, start, m);
 
-                while (p < last && pat < pat_end) {
-                    if (ngx_tolower(*p) != *pat) {
-                        goto next;
-                    }
-
-                    p++;
-                    pat++;
-                }
-
-                p = ctx->pos;
-            }
-
-            while (p < ctx->buf->last && pat < pat_end) {
-                if (ngx_tolower(*p) != *pat) {
-                    goto next;
-                }
-
-                p++;
-                pat++;
+            if (rc == NGX_DECLINED) {
+                goto next;
             }
 
             ctx->index = i;
 
-            if (pat != pat_end) {
-                /* partial match */
+            if (rc == NGX_AGAIN) {
                 goto again;
             }
 
@@ -731,6 +707,51 @@ done:
 }
 
 
+static ngx_int_t
+ngx_http_sub_match(ngx_http_sub_ctx_t *ctx, ngx_int_t start, ngx_str_t *m)
+{
+    u_char  *p, *last, *pat, *pat_end;
+
+    pat = m->data;
+    pat_end = m->data + m->len;
+
+    if (start >= 0) {
+        p = ctx->pos + start;
+
+    } else {
+        last = ctx->looked.data + ctx->looked.len;
+        p = last + start;
+
+        while (p < last && pat < pat_end) {
+            if (ngx_tolower(*p) != *pat) {
+                return NGX_DECLINED;
+            }
+
+            p++;
+            pat++;
+        }
+
+        p = ctx->pos;
+    }
+
+    while (p < ctx->buf->last && pat < pat_end) {
+        if (ngx_tolower(*p) != *pat) {
+            return NGX_DECLINED;
+        }
+
+        p++;
+        pat++;
+    }
+
+    if (pat != pat_end) {
+        /* partial match */
+        return NGX_AGAIN;
+    }
+
+    return NGX_OK;
+}
+
+
 static char *
 ngx_http_sub_filter(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 {



More information about the nginx-devel mailing list