comparison src/http/modules/ngx_http_proxy_module.c @ 7715:5c7917292b29

Proxy: changed interface of some internal functions. This is in preparation for the next change. Also, moved optimization from ngx_http_proxy_rewrite_regex_handler() to ngx_http_proxy_rewrite().
author Ruslan Ermilov <ru@nginx.com>
date Sun, 27 Sep 2020 23:21:10 +0300
parents 8dbc9ee97998
children d6a5e14aa3e4
comparison
equal deleted inserted replaced
7714:8dbc9ee97998 7715:5c7917292b29
16 16
17 17
18 typedef struct ngx_http_proxy_rewrite_s ngx_http_proxy_rewrite_t; 18 typedef struct ngx_http_proxy_rewrite_s ngx_http_proxy_rewrite_t;
19 19
20 typedef ngx_int_t (*ngx_http_proxy_rewrite_pt)(ngx_http_request_t *r, 20 typedef ngx_int_t (*ngx_http_proxy_rewrite_pt)(ngx_http_request_t *r,
21 ngx_table_elt_t *h, size_t prefix, size_t len, 21 ngx_str_t *value, size_t prefix, size_t len,
22 ngx_http_proxy_rewrite_t *pr); 22 ngx_http_proxy_rewrite_t *pr);
23 23
24 struct ngx_http_proxy_rewrite_s { 24 struct ngx_http_proxy_rewrite_s {
25 ngx_http_proxy_rewrite_pt handler; 25 ngx_http_proxy_rewrite_pt handler;
26 26
159 static ngx_int_t ngx_http_proxy_rewrite_cookie(ngx_http_request_t *r, 159 static ngx_int_t ngx_http_proxy_rewrite_cookie(ngx_http_request_t *r,
160 ngx_table_elt_t *h); 160 ngx_table_elt_t *h);
161 static ngx_int_t ngx_http_proxy_rewrite_cookie_value(ngx_http_request_t *r, 161 static ngx_int_t ngx_http_proxy_rewrite_cookie_value(ngx_http_request_t *r,
162 ngx_table_elt_t *h, u_char *value, ngx_array_t *rewrites); 162 ngx_table_elt_t *h, u_char *value, ngx_array_t *rewrites);
163 static ngx_int_t ngx_http_proxy_rewrite(ngx_http_request_t *r, 163 static ngx_int_t ngx_http_proxy_rewrite(ngx_http_request_t *r,
164 ngx_table_elt_t *h, size_t prefix, size_t len, ngx_str_t *replacement); 164 ngx_str_t *value, size_t prefix, size_t len, ngx_str_t *replacement);
165 165
166 static ngx_int_t ngx_http_proxy_add_variables(ngx_conf_t *cf); 166 static ngx_int_t ngx_http_proxy_add_variables(ngx_conf_t *cf);
167 static void *ngx_http_proxy_create_main_conf(ngx_conf_t *cf); 167 static void *ngx_http_proxy_create_main_conf(ngx_conf_t *cf);
168 static void *ngx_http_proxy_create_loc_conf(ngx_conf_t *cf); 168 static void *ngx_http_proxy_create_loc_conf(ngx_conf_t *cf);
169 static char *ngx_http_proxy_merge_loc_conf(ngx_conf_t *cf, 169 static char *ngx_http_proxy_merge_loc_conf(ngx_conf_t *cf,
2582 } 2582 }
2583 2583
2584 len = h->value.len - prefix; 2584 len = h->value.len - prefix;
2585 2585
2586 for (i = 0; i < plcf->redirects->nelts; i++) { 2586 for (i = 0; i < plcf->redirects->nelts; i++) {
2587 rc = pr[i].handler(r, h, prefix, len, &pr[i]); 2587 rc = pr[i].handler(r, &h->value, prefix, len, &pr[i]);
2588 2588
2589 if (rc != NGX_DECLINED) { 2589 if (rc != NGX_DECLINED) {
2590 return rc; 2590 return rc;
2591 } 2591 }
2592 } 2592 }
2667 len = p ? (size_t) (p - value) : (h->value.len - prefix); 2667 len = p ? (size_t) (p - value) : (h->value.len - prefix);
2668 2668
2669 pr = rewrites->elts; 2669 pr = rewrites->elts;
2670 2670
2671 for (i = 0; i < rewrites->nelts; i++) { 2671 for (i = 0; i < rewrites->nelts; i++) {
2672 rc = pr[i].handler(r, h, prefix, len, &pr[i]); 2672 rc = pr[i].handler(r, &h->value, prefix, len, &pr[i]);
2673 2673
2674 if (rc != NGX_DECLINED) { 2674 if (rc != NGX_DECLINED) {
2675 return rc; 2675 return rc;
2676 } 2676 }
2677 } 2677 }
2679 return NGX_DECLINED; 2679 return NGX_DECLINED;
2680 } 2680 }
2681 2681
2682 2682
2683 static ngx_int_t 2683 static ngx_int_t
2684 ngx_http_proxy_rewrite_complex_handler(ngx_http_request_t *r, 2684 ngx_http_proxy_rewrite_complex_handler(ngx_http_request_t *r, ngx_str_t *value,
2685 ngx_table_elt_t *h, size_t prefix, size_t len, ngx_http_proxy_rewrite_t *pr)
2686 {
2687 ngx_str_t pattern, replacement;
2688
2689 if (ngx_http_complex_value(r, &pr->pattern.complex, &pattern) != NGX_OK) {
2690 return NGX_ERROR;
2691 }
2692
2693 if (pattern.len > len
2694 || ngx_rstrncmp(h->value.data + prefix, pattern.data,
2695 pattern.len) != 0)
2696 {
2697 return NGX_DECLINED;
2698 }
2699
2700 if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) {
2701 return NGX_ERROR;
2702 }
2703
2704 return ngx_http_proxy_rewrite(r, h, prefix, pattern.len, &replacement);
2705 }
2706
2707
2708 #if (NGX_PCRE)
2709
2710 static ngx_int_t
2711 ngx_http_proxy_rewrite_regex_handler(ngx_http_request_t *r, ngx_table_elt_t *h,
2712 size_t prefix, size_t len, ngx_http_proxy_rewrite_t *pr) 2685 size_t prefix, size_t len, ngx_http_proxy_rewrite_t *pr)
2713 { 2686 {
2714 ngx_str_t pattern, replacement; 2687 ngx_str_t pattern, replacement;
2715 2688
2689 if (ngx_http_complex_value(r, &pr->pattern.complex, &pattern) != NGX_OK) {
2690 return NGX_ERROR;
2691 }
2692
2693 if (pattern.len > len
2694 || ngx_rstrncmp(value->data + prefix, pattern.data, pattern.len) != 0)
2695 {
2696 return NGX_DECLINED;
2697 }
2698
2699 if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) {
2700 return NGX_ERROR;
2701 }
2702
2703 return ngx_http_proxy_rewrite(r, value, prefix, pattern.len, &replacement);
2704 }
2705
2706
2707 #if (NGX_PCRE)
2708
2709 static ngx_int_t
2710 ngx_http_proxy_rewrite_regex_handler(ngx_http_request_t *r, ngx_str_t *value,
2711 size_t prefix, size_t len, ngx_http_proxy_rewrite_t *pr)
2712 {
2713 ngx_str_t pattern, replacement;
2714
2716 pattern.len = len; 2715 pattern.len = len;
2717 pattern.data = h->value.data + prefix; 2716 pattern.data = value->data + prefix;
2718 2717
2719 if (ngx_http_regex_exec(r, pr->pattern.regex, &pattern) != NGX_OK) { 2718 if (ngx_http_regex_exec(r, pr->pattern.regex, &pattern) != NGX_OK) {
2720 return NGX_DECLINED; 2719 return NGX_DECLINED;
2721 } 2720 }
2722 2721
2723 if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) { 2722 if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) {
2724 return NGX_ERROR; 2723 return NGX_ERROR;
2725 } 2724 }
2726 2725
2727 if (prefix == 0 && h->value.len == len) { 2726 return ngx_http_proxy_rewrite(r, value, prefix, len, &replacement);
2728 h->value = replacement;
2729 return NGX_OK;
2730 }
2731
2732 return ngx_http_proxy_rewrite(r, h, prefix, len, &replacement);
2733 } 2727 }
2734 2728
2735 #endif 2729 #endif
2736 2730
2737 2731
2738 static ngx_int_t 2732 static ngx_int_t
2739 ngx_http_proxy_rewrite_domain_handler(ngx_http_request_t *r, 2733 ngx_http_proxy_rewrite_domain_handler(ngx_http_request_t *r, ngx_str_t *value,
2740 ngx_table_elt_t *h, size_t prefix, size_t len, ngx_http_proxy_rewrite_t *pr) 2734 size_t prefix, size_t len, ngx_http_proxy_rewrite_t *pr)
2741 { 2735 {
2742 u_char *p; 2736 u_char *p;
2743 ngx_str_t pattern, replacement; 2737 ngx_str_t pattern, replacement;
2744 2738
2745 if (ngx_http_complex_value(r, &pr->pattern.complex, &pattern) != NGX_OK) { 2739 if (ngx_http_complex_value(r, &pr->pattern.complex, &pattern) != NGX_OK) {
2746 return NGX_ERROR; 2740 return NGX_ERROR;
2747 } 2741 }
2748 2742
2749 p = h->value.data + prefix; 2743 p = value->data + prefix;
2750 2744
2751 if (p[0] == '.') { 2745 if (p[0] == '.') {
2752 p++; 2746 p++;
2753 prefix++; 2747 prefix++;
2754 len--; 2748 len--;
2760 2754
2761 if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) { 2755 if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) {
2762 return NGX_ERROR; 2756 return NGX_ERROR;
2763 } 2757 }
2764 2758
2765 return ngx_http_proxy_rewrite(r, h, prefix, len, &replacement); 2759 return ngx_http_proxy_rewrite(r, value, prefix, len, &replacement);
2766 } 2760 }
2767 2761
2768 2762
2769 static ngx_int_t 2763 static ngx_int_t
2770 ngx_http_proxy_rewrite(ngx_http_request_t *r, ngx_table_elt_t *h, size_t prefix, 2764 ngx_http_proxy_rewrite(ngx_http_request_t *r, ngx_str_t *value, size_t prefix,
2771 size_t len, ngx_str_t *replacement) 2765 size_t len, ngx_str_t *replacement)
2772 { 2766 {
2773 u_char *p, *data; 2767 u_char *p, *data;
2774 size_t new_len; 2768 size_t new_len;
2775 2769
2776 new_len = replacement->len + h->value.len - len; 2770 if (len == value->len) {
2771 *value = *replacement;
2772 return NGX_OK;
2773 }
2774
2775 new_len = replacement->len + value->len - len;
2777 2776
2778 if (replacement->len > len) { 2777 if (replacement->len > len) {
2779 2778
2780 data = ngx_pnalloc(r->pool, new_len + 1); 2779 data = ngx_pnalloc(r->pool, new_len + 1);
2781 if (data == NULL) { 2780 if (data == NULL) {
2782 return NGX_ERROR; 2781 return NGX_ERROR;
2783 } 2782 }
2784 2783
2785 p = ngx_copy(data, h->value.data, prefix); 2784 p = ngx_copy(data, value->data, prefix);
2786 p = ngx_copy(p, replacement->data, replacement->len); 2785 p = ngx_copy(p, replacement->data, replacement->len);
2787 2786
2788 ngx_memcpy(p, h->value.data + prefix + len, 2787 ngx_memcpy(p, value->data + prefix + len,
2789 h->value.len - len - prefix + 1); 2788 value->len - len - prefix + 1);
2790 2789
2791 h->value.data = data; 2790 value->data = data;
2792 2791
2793 } else { 2792 } else {
2794 p = ngx_copy(h->value.data + prefix, replacement->data, 2793 p = ngx_copy(value->data + prefix, replacement->data, replacement->len);
2795 replacement->len); 2794
2796 2795 ngx_memmove(p, value->data + prefix + len,
2797 ngx_memmove(p, h->value.data + prefix + len, 2796 value->len - len - prefix + 1);
2798 h->value.len - len - prefix + 1); 2797 }
2799 } 2798
2800 2799 value->len = new_len;
2801 h->value.len = new_len;
2802 2800
2803 return NGX_OK; 2801 return NGX_OK;
2804 } 2802 }
2805 2803
2806 2804