comparison src/http/ngx_http_core_module.c @ 9021:8d0753760546 quic

Merged with the default branch.
author Sergey Kandaurov <pluknet@nginx.com>
date Wed, 22 Jun 2022 18:34:58 +0400
parents eaf356a35f5d 711737177b77
children 6cf8ed15fd00
comparison
equal deleted inserted replaced
9020:efbcdb9b37dc 9021:8d0753760546
1005 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); 1005 ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
1006 return NGX_OK; 1006 return NGX_OK;
1007 } 1007 }
1008 1008
1009 r->headers_out.location->hash = 1; 1009 r->headers_out.location->hash = 1;
1010 r->headers_out.location->next = NULL;
1010 ngx_str_set(&r->headers_out.location->key, "Location"); 1011 ngx_str_set(&r->headers_out.location->key, "Location");
1011 1012
1012 if (r->args.len == 0) { 1013 if (r->args.len == 0) {
1013 r->headers_out.location->value = clcf->escaped_name; 1014 r->headers_out.location->value = clcf->escaped_name;
1014 1015
1085 1086
1086 ngx_int_t 1087 ngx_int_t
1087 ngx_http_core_access_phase(ngx_http_request_t *r, ngx_http_phase_handler_t *ph) 1088 ngx_http_core_access_phase(ngx_http_request_t *r, ngx_http_phase_handler_t *ph)
1088 { 1089 {
1089 ngx_int_t rc; 1090 ngx_int_t rc;
1091 ngx_table_elt_t *h;
1090 ngx_http_core_loc_conf_t *clcf; 1092 ngx_http_core_loc_conf_t *clcf;
1091 1093
1092 if (r != r->main) { 1094 if (r != r->main) {
1093 r->phase_handler = ph->next; 1095 r->phase_handler = ph->next;
1094 return NGX_AGAIN; 1096 return NGX_AGAIN;
1119 1121
1120 } else { 1122 } else {
1121 if (rc == NGX_OK) { 1123 if (rc == NGX_OK) {
1122 r->access_code = 0; 1124 r->access_code = 0;
1123 1125
1124 if (r->headers_out.www_authenticate) { 1126 for (h = r->headers_out.www_authenticate; h; h = h->next) {
1125 r->headers_out.www_authenticate->hash = 0; 1127 h->hash = 0;
1126 } 1128 }
1127 1129
1128 r->phase_handler = ph->next; 1130 r->phase_handler = ph->next;
1129 return NGX_AGAIN; 1131 return NGX_AGAIN;
1130 } 1132 }
1685 if (etag == NULL) { 1687 if (etag == NULL) {
1686 return NGX_ERROR; 1688 return NGX_ERROR;
1687 } 1689 }
1688 1690
1689 etag->hash = 1; 1691 etag->hash = 1;
1692 etag->next = NULL;
1690 ngx_str_set(&etag->key, "ETag"); 1693 ngx_str_set(&etag->key, "ETag");
1691 1694
1692 etag->value.data = ngx_pnalloc(r->pool, NGX_OFF_T_LEN + NGX_TIME_T_LEN + 3); 1695 etag->value.data = ngx_pnalloc(r->pool, NGX_OFF_T_LEN + NGX_TIME_T_LEN + 3);
1693 if (etag->value.data == NULL) { 1696 if (etag->value.data == NULL) {
1694 etag->hash = 0; 1697 etag->hash = 0;
1779 if (r->headers_out.location == NULL) { 1782 if (r->headers_out.location == NULL) {
1780 return NGX_HTTP_INTERNAL_SERVER_ERROR; 1783 return NGX_HTTP_INTERNAL_SERVER_ERROR;
1781 } 1784 }
1782 1785
1783 r->headers_out.location->hash = 1; 1786 r->headers_out.location->hash = 1;
1787 r->headers_out.location->next = NULL;
1784 ngx_str_set(&r->headers_out.location->key, "Location"); 1788 ngx_str_set(&r->headers_out.location->key, "Location");
1785 r->headers_out.location->value = val; 1789 r->headers_out.location->value = val;
1786 1790
1787 return status; 1791 return status;
1788 } 1792 }
2022 ngx_int_t 2026 ngx_int_t
2023 ngx_http_gzip_ok(ngx_http_request_t *r) 2027 ngx_http_gzip_ok(ngx_http_request_t *r)
2024 { 2028 {
2025 time_t date, expires; 2029 time_t date, expires;
2026 ngx_uint_t p; 2030 ngx_uint_t p;
2027 ngx_array_t *cc; 2031 ngx_table_elt_t *e, *d, *ae, *cc;
2028 ngx_table_elt_t *e, *d, *ae;
2029 ngx_http_core_loc_conf_t *clcf; 2032 ngx_http_core_loc_conf_t *clcf;
2030 2033
2031 r->gzip_tested = 1; 2034 r->gzip_tested = 1;
2032 2035
2033 if (r != r->main) { 2036 if (r != r->main) {
2116 } 2119 }
2117 2120
2118 return NGX_DECLINED; 2121 return NGX_DECLINED;
2119 } 2122 }
2120 2123
2121 cc = &r->headers_out.cache_control; 2124 cc = r->headers_out.cache_control;
2122 2125
2123 if (cc->elts) { 2126 if (cc) {
2124 2127
2125 if ((p & NGX_HTTP_GZIP_PROXIED_NO_CACHE) 2128 if ((p & NGX_HTTP_GZIP_PROXIED_NO_CACHE)
2126 && ngx_http_parse_multi_header_lines(cc, &ngx_http_gzip_no_cache, 2129 && ngx_http_parse_multi_header_lines(r, cc, &ngx_http_gzip_no_cache,
2127 NULL) 2130 NULL)
2128 >= 0) 2131 != NULL)
2129 { 2132 {
2130 goto ok; 2133 goto ok;
2131 } 2134 }
2132 2135
2133 if ((p & NGX_HTTP_GZIP_PROXIED_NO_STORE) 2136 if ((p & NGX_HTTP_GZIP_PROXIED_NO_STORE)
2134 && ngx_http_parse_multi_header_lines(cc, &ngx_http_gzip_no_store, 2137 && ngx_http_parse_multi_header_lines(r, cc, &ngx_http_gzip_no_store,
2135 NULL) 2138 NULL)
2136 >= 0) 2139 != NULL)
2137 { 2140 {
2138 goto ok; 2141 goto ok;
2139 } 2142 }
2140 2143
2141 if ((p & NGX_HTTP_GZIP_PROXIED_PRIVATE) 2144 if ((p & NGX_HTTP_GZIP_PROXIED_PRIVATE)
2142 && ngx_http_parse_multi_header_lines(cc, &ngx_http_gzip_private, 2145 && ngx_http_parse_multi_header_lines(r, cc, &ngx_http_gzip_private,
2143 NULL) 2146 NULL)
2144 >= 0) 2147 != NULL)
2145 { 2148 {
2146 goto ok; 2149 goto ok;
2147 } 2150 }
2148 2151
2149 return NGX_DECLINED; 2152 return NGX_DECLINED;
2710 } 2713 }
2711 2714
2712 2715
2713 ngx_int_t 2716 ngx_int_t
2714 ngx_http_get_forwarded_addr(ngx_http_request_t *r, ngx_addr_t *addr, 2717 ngx_http_get_forwarded_addr(ngx_http_request_t *r, ngx_addr_t *addr,
2715 ngx_array_t *headers, ngx_str_t *value, ngx_array_t *proxies, 2718 ngx_table_elt_t *headers, ngx_str_t *value, ngx_array_t *proxies,
2716 int recursive) 2719 int recursive)
2717 { 2720 {
2718 ngx_int_t rc; 2721 ngx_int_t rc;
2719 ngx_uint_t i, found; 2722 ngx_uint_t found;
2720 ngx_table_elt_t **h; 2723 ngx_table_elt_t *h, *next;
2721 2724
2722 if (headers == NULL) { 2725 if (headers == NULL) {
2723 return ngx_http_get_forwarded_addr_internal(r, addr, value->data, 2726 return ngx_http_get_forwarded_addr_internal(r, addr, value->data,
2724 value->len, proxies, 2727 value->len, proxies,
2725 recursive); 2728 recursive);
2726 } 2729 }
2727 2730
2728 i = headers->nelts; 2731 /* revert headers order */
2729 h = headers->elts; 2732
2733 for (h = headers, headers = NULL; h; h = next) {
2734 next = h->next;
2735 h->next = headers;
2736 headers = h;
2737 }
2738
2739 /* iterate over all headers in reverse order */
2730 2740
2731 rc = NGX_DECLINED; 2741 rc = NGX_DECLINED;
2732 2742
2733 found = 0; 2743 found = 0;
2734 2744
2735 while (i-- > 0) { 2745 for (h = headers; h; h = h->next) {
2736 rc = ngx_http_get_forwarded_addr_internal(r, addr, h[i]->value.data, 2746 rc = ngx_http_get_forwarded_addr_internal(r, addr, h->value.data,
2737 h[i]->value.len, proxies, 2747 h->value.len, proxies,
2738 recursive); 2748 recursive);
2739 2749
2740 if (!recursive) { 2750 if (!recursive) {
2741 break; 2751 break;
2742 } 2752 }
2749 if (rc != NGX_OK) { 2759 if (rc != NGX_OK) {
2750 break; 2760 break;
2751 } 2761 }
2752 2762
2753 found = 1; 2763 found = 1;
2764 }
2765
2766 /* restore headers order */
2767
2768 for (h = headers, headers = NULL; h; h = next) {
2769 next = h->next;
2770 h->next = headers;
2771 headers = h;
2754 } 2772 }
2755 2773
2756 return rc; 2774 return rc;
2757 } 2775 }
2758 2776
2795 *addr = paddr; 2813 *addr = paddr;
2796 found = 1; 2814 found = 1;
2797 xfflen = p - 1 - xff; 2815 xfflen = p - 1 - xff;
2798 2816
2799 } while (recursive && p > xff); 2817 } while (recursive && p > xff);
2818
2819 return NGX_OK;
2820 }
2821
2822
2823 ngx_int_t
2824 ngx_http_link_multi_headers(ngx_http_request_t *r)
2825 {
2826 ngx_uint_t i, j;
2827 ngx_list_part_t *part, *ppart;
2828 ngx_table_elt_t *header, *pheader, **ph;
2829
2830 if (r->headers_in.multi_linked) {
2831 return NGX_OK;
2832 }
2833
2834 r->headers_in.multi_linked = 1;
2835
2836 part = &r->headers_in.headers.part;
2837 header = part->elts;
2838
2839 for (i = 0; /* void */; i++) {
2840
2841 if (i >= part->nelts) {
2842 if (part->next == NULL) {
2843 break;
2844 }
2845
2846 part = part->next;
2847 header = part->elts;
2848 i = 0;
2849 }
2850
2851 header[i].next = NULL;
2852
2853 /*
2854 * search for previous headers with the same name;
2855 * if there are any, link to them
2856 */
2857
2858 ppart = &r->headers_in.headers.part;
2859 pheader = ppart->elts;
2860
2861 for (j = 0; /* void */; j++) {
2862
2863 if (j >= ppart->nelts) {
2864 if (ppart->next == NULL) {
2865 break;
2866 }
2867
2868 ppart = ppart->next;
2869 pheader = ppart->elts;
2870 j = 0;
2871 }
2872
2873 if (part == ppart && i == j) {
2874 break;
2875 }
2876
2877 if (header[i].key.len == pheader[j].key.len
2878 && ngx_strncasecmp(header[i].key.data, pheader[j].key.data,
2879 header[i].key.len)
2880 == 0)
2881 {
2882 ph = &pheader[j].next;
2883 while (*ph) { ph = &(*ph)->next; }
2884 *ph = &header[i];
2885
2886 r->headers_in.multi = 1;
2887
2888 break;
2889 }
2890 }
2891 }
2800 2892
2801 return NGX_OK; 2893 return NGX_OK;
2802 } 2894 }
2803 2895
2804 2896