Mercurial > hg > nginx
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 |