Mercurial > hg > nginx-quic
annotate src/http/v3/ngx_http_v3_filter_module.c @ 9090:7d67fe09bcad quic tip
QUIC: style.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Thu, 11 May 2023 18:48:01 +0300 |
parents | 8d0753760546 |
children |
rev | line source |
---|---|
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
2 /* |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
3 * Copyright (C) Roman Arutyunyan |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
4 * Copyright (C) Nginx, Inc. |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
5 */ |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
6 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
7 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
8 #include <ngx_config.h> |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
9 #include <ngx_core.h> |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
10 #include <ngx_http.h> |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
11 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
12 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
13 /* static table indices */ |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
14 #define NGX_HTTP_V3_HEADER_AUTHORITY 0 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
15 #define NGX_HTTP_V3_HEADER_PATH_ROOT 1 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
16 #define NGX_HTTP_V3_HEADER_CONTENT_LENGTH_ZERO 4 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
17 #define NGX_HTTP_V3_HEADER_DATE 6 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
18 #define NGX_HTTP_V3_HEADER_LAST_MODIFIED 10 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
19 #define NGX_HTTP_V3_HEADER_LOCATION 12 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
20 #define NGX_HTTP_V3_HEADER_METHOD_GET 17 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
21 #define NGX_HTTP_V3_HEADER_SCHEME_HTTP 22 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
22 #define NGX_HTTP_V3_HEADER_SCHEME_HTTPS 23 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
23 #define NGX_HTTP_V3_HEADER_STATUS_200 25 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
24 #define NGX_HTTP_V3_HEADER_ACCEPT_ENCODING 31 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
25 #define NGX_HTTP_V3_HEADER_CONTENT_TYPE_TEXT_PLAIN 53 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
26 #define NGX_HTTP_V3_HEADER_VARY_ACCEPT_ENCODING 59 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
27 #define NGX_HTTP_V3_HEADER_ACCEPT_LANGUAGE 72 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
28 #define NGX_HTTP_V3_HEADER_SERVER 92 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
29 #define NGX_HTTP_V3_HEADER_USER_AGENT 95 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
30 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
31 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
32 typedef struct { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
33 ngx_chain_t *free; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
34 ngx_chain_t *busy; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
35 } ngx_http_v3_filter_ctx_t; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
36 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
37 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
38 static ngx_int_t ngx_http_v3_header_filter(ngx_http_request_t *r); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
39 static ngx_int_t ngx_http_v3_push_resources(ngx_http_request_t *r, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
40 ngx_chain_t ***out); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
41 static ngx_int_t ngx_http_v3_push_resource(ngx_http_request_t *r, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
42 ngx_str_t *path, ngx_chain_t ***out); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
43 static ngx_int_t ngx_http_v3_create_push_request( |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
44 ngx_http_request_t *pr, ngx_str_t *path, uint64_t push_id); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
45 static ngx_int_t ngx_http_v3_set_push_header(ngx_http_request_t *r, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
46 const char *name, ngx_str_t *value); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
47 static void ngx_http_v3_push_request_handler(ngx_event_t *ev); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
48 static ngx_chain_t *ngx_http_v3_create_push_promise(ngx_http_request_t *r, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
49 ngx_str_t *path, uint64_t push_id); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
50 static ngx_int_t ngx_http_v3_body_filter(ngx_http_request_t *r, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
51 ngx_chain_t *in); |
8542
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
52 static ngx_chain_t *ngx_http_v3_create_trailers(ngx_http_request_t *r, |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
53 ngx_http_v3_filter_ctx_t *ctx); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
54 static ngx_int_t ngx_http_v3_filter_init(ngx_conf_t *cf); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
55 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
56 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
57 static ngx_http_module_t ngx_http_v3_filter_module_ctx = { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
58 NULL, /* preconfiguration */ |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
59 ngx_http_v3_filter_init, /* postconfiguration */ |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
60 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
61 NULL, /* create main configuration */ |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
62 NULL, /* init main configuration */ |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
63 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
64 NULL, /* create server configuration */ |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
65 NULL, /* merge server configuration */ |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
66 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
67 NULL, /* create location configuration */ |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
68 NULL /* merge location configuration */ |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
69 }; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
70 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
71 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
72 ngx_module_t ngx_http_v3_filter_module = { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
73 NGX_MODULE_V1, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
74 &ngx_http_v3_filter_module_ctx, /* module context */ |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
75 NULL, /* module directives */ |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
76 NGX_HTTP_MODULE, /* module type */ |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
77 NULL, /* init master */ |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
78 NULL, /* init module */ |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
79 NULL, /* init process */ |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
80 NULL, /* init thread */ |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
81 NULL, /* exit thread */ |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
82 NULL, /* exit process */ |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
83 NULL, /* exit master */ |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
84 NGX_MODULE_V1_PADDING |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
85 }; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
86 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
87 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
88 static ngx_http_output_header_filter_pt ngx_http_next_header_filter; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
89 static ngx_http_output_body_filter_pt ngx_http_next_body_filter; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
90 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
91 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
92 static ngx_int_t |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
93 ngx_http_v3_header_filter(ngx_http_request_t *r) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
94 { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
95 u_char *p; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
96 size_t len, n; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
97 ngx_buf_t *b; |
8613
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
98 ngx_str_t host, location; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
99 ngx_uint_t i, port; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
100 ngx_chain_t *out, *hl, *cl, **ll; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
101 ngx_list_part_t *part; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
102 ngx_table_elt_t *header; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
103 ngx_connection_t *c; |
8643
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
104 ngx_http_v3_session_t *h3c; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
105 ngx_http_v3_filter_ctx_t *ctx; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
106 ngx_http_core_loc_conf_t *clcf; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
107 ngx_http_core_srv_conf_t *cscf; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
108 u_char addr[NGX_SOCKADDR_STRLEN]; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
109 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
110 if (r->http_version != NGX_HTTP_VERSION_30) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
111 return ngx_http_next_header_filter(r); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
112 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
113 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
114 if (r->header_sent) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
115 return NGX_OK; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
116 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
117 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
118 r->header_sent = 1; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
119 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
120 if (r != r->main) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
121 return NGX_OK; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
122 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
123 |
8643
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
124 h3c = ngx_http_v3_get_session(r->connection); |
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
125 |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
126 if (r->method == NGX_HTTP_HEAD) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
127 r->header_only = 1; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
128 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
129 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
130 if (r->headers_out.last_modified_time != -1) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
131 if (r->headers_out.status != NGX_HTTP_OK |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
132 && r->headers_out.status != NGX_HTTP_PARTIAL_CONTENT |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
133 && r->headers_out.status != NGX_HTTP_NOT_MODIFIED) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
134 { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
135 r->headers_out.last_modified_time = -1; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
136 r->headers_out.last_modified = NULL; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
137 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
138 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
139 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
140 if (r->headers_out.status == NGX_HTTP_NO_CONTENT) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
141 r->header_only = 1; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
142 ngx_str_null(&r->headers_out.content_type); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
143 r->headers_out.last_modified_time = -1; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
144 r->headers_out.last_modified = NULL; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
145 r->headers_out.content_length = NULL; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
146 r->headers_out.content_length_n = -1; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
147 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
148 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
149 if (r->headers_out.status == NGX_HTTP_NOT_MODIFIED) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
150 r->header_only = 1; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
151 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
152 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
153 c = r->connection; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
154 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
155 out = NULL; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
156 ll = &out; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
157 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
158 if ((c->quic->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) == 0 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
159 && r->method != NGX_HTTP_HEAD) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
160 { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
161 if (ngx_http_v3_push_resources(r, &ll) != NGX_OK) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
162 return NGX_ERROR; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
163 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
164 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
165 |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
166 len = ngx_http_v3_encode_field_section_prefix(NULL, 0, 0, 0); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
167 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
168 if (r->headers_out.status == NGX_HTTP_OK) { |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
169 len += ngx_http_v3_encode_field_ri(NULL, 0, |
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
170 NGX_HTTP_V3_HEADER_STATUS_200); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
171 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
172 } else { |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
173 len += ngx_http_v3_encode_field_lri(NULL, 0, |
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
174 NGX_HTTP_V3_HEADER_STATUS_200, |
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
175 NULL, 3); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
176 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
177 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
178 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
179 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
180 if (r->headers_out.server == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
181 if (clcf->server_tokens == NGX_HTTP_SERVER_TOKENS_ON) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
182 n = sizeof(NGINX_VER) - 1; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
183 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
184 } else if (clcf->server_tokens == NGX_HTTP_SERVER_TOKENS_BUILD) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
185 n = sizeof(NGINX_VER_BUILD) - 1; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
186 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
187 } else { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
188 n = sizeof("nginx") - 1; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
189 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
190 |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
191 len += ngx_http_v3_encode_field_lri(NULL, 0, |
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
192 NGX_HTTP_V3_HEADER_SERVER, |
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
193 NULL, n); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
194 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
195 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
196 if (r->headers_out.date == NULL) { |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
197 len += ngx_http_v3_encode_field_lri(NULL, 0, NGX_HTTP_V3_HEADER_DATE, |
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
198 NULL, ngx_cached_http_time.len); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
199 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
200 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
201 if (r->headers_out.content_type.len) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
202 n = r->headers_out.content_type.len; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
203 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
204 if (r->headers_out.content_type_len == r->headers_out.content_type.len |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
205 && r->headers_out.charset.len) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
206 { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
207 n += sizeof("; charset=") - 1 + r->headers_out.charset.len; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
208 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
209 |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
210 len += ngx_http_v3_encode_field_lri(NULL, 0, |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
211 NGX_HTTP_V3_HEADER_CONTENT_TYPE_TEXT_PLAIN, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
212 NULL, n); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
213 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
214 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
215 if (r->headers_out.content_length == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
216 if (r->headers_out.content_length_n > 0) { |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
217 len += ngx_http_v3_encode_field_lri(NULL, 0, |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
218 NGX_HTTP_V3_HEADER_CONTENT_LENGTH_ZERO, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
219 NULL, NGX_OFF_T_LEN); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
220 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
221 } else if (r->headers_out.content_length_n == 0) { |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
222 len += ngx_http_v3_encode_field_ri(NULL, 0, |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
223 NGX_HTTP_V3_HEADER_CONTENT_LENGTH_ZERO); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
224 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
225 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
226 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
227 if (r->headers_out.last_modified == NULL |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
228 && r->headers_out.last_modified_time != -1) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
229 { |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
230 len += ngx_http_v3_encode_field_lri(NULL, 0, |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
231 NGX_HTTP_V3_HEADER_LAST_MODIFIED, NULL, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
232 sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
233 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
234 |
8613
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
235 if (r->headers_out.location && r->headers_out.location->value.len) { |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
236 |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
237 if (r->headers_out.location->value.data[0] == '/' |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
238 && clcf->absolute_redirect) |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
239 { |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
240 if (clcf->server_name_in_redirect) { |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
241 cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
242 host = cscf->server_name; |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
243 |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
244 } else if (r->headers_in.server.len) { |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
245 host = r->headers_in.server; |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
246 |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
247 } else { |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
248 host.len = NGX_SOCKADDR_STRLEN; |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
249 host.data = addr; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
250 |
8613
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
251 if (ngx_connection_local_sockaddr(c, &host, 0) != NGX_OK) { |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
252 return NGX_ERROR; |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
253 } |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
254 } |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
255 |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
256 port = ngx_inet_get_port(c->local_sockaddr); |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
257 |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
258 location.len = sizeof("https://") - 1 + host.len |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
259 + r->headers_out.location->value.len; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
260 |
8613
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
261 if (clcf->port_in_redirect) { |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
262 port = (port == 443) ? 0 : port; |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
263 |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
264 } else { |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
265 port = 0; |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
266 } |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
267 |
8613
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
268 if (port) { |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
269 location.len += sizeof(":65535") - 1; |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
270 } |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
271 |
8613
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
272 location.data = ngx_pnalloc(r->pool, location.len); |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
273 if (location.data == NULL) { |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
274 return NGX_ERROR; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
275 } |
8613
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
276 |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
277 p = ngx_cpymem(location.data, "https://", sizeof("https://") - 1); |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
278 p = ngx_cpymem(p, host.data, host.len); |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
279 |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
280 if (port) { |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
281 p = ngx_sprintf(p, ":%ui", port); |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
282 } |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
283 |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
284 p = ngx_cpymem(p, r->headers_out.location->value.data, |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
285 r->headers_out.location->value.len); |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
286 |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
287 /* update r->headers_out.location->value for possible logging */ |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
288 |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
289 r->headers_out.location->value.len = p - location.data; |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
290 r->headers_out.location->value.data = location.data; |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
291 ngx_str_set(&r->headers_out.location->key, "Location"); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
292 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
293 |
8613
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
294 r->headers_out.location->hash = 0; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
295 |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
296 len += ngx_http_v3_encode_field_lri(NULL, 0, |
8613
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
297 NGX_HTTP_V3_HEADER_LOCATION, NULL, |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
298 r->headers_out.location->value.len); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
299 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
300 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
301 #if (NGX_HTTP_GZIP) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
302 if (r->gzip_vary) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
303 if (clcf->gzip_vary) { |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
304 len += ngx_http_v3_encode_field_ri(NULL, 0, |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
305 NGX_HTTP_V3_HEADER_VARY_ACCEPT_ENCODING); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
306 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
307 } else { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
308 r->gzip_vary = 0; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
309 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
310 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
311 #endif |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
312 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
313 part = &r->headers_out.headers.part; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
314 header = part->elts; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
315 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
316 for (i = 0; /* void */; i++) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
317 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
318 if (i >= part->nelts) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
319 if (part->next == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
320 break; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
321 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
322 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
323 part = part->next; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
324 header = part->elts; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
325 i = 0; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
326 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
327 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
328 if (header[i].hash == 0) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
329 continue; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
330 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
331 |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
332 len += ngx_http_v3_encode_field_l(NULL, &header[i].key, |
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
333 &header[i].value); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
334 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
335 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
336 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 header len:%uz", len); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
337 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
338 b = ngx_create_temp_buf(r->pool, len); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
339 if (b == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
340 return NGX_ERROR; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
341 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
342 |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
343 b->last = (u_char *) ngx_http_v3_encode_field_section_prefix(b->last, |
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
344 0, 0, 0); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
345 |
8614
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
346 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, |
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
347 "http3 output header: \":status: %03ui\"", |
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
348 r->headers_out.status); |
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
349 |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
350 if (r->headers_out.status == NGX_HTTP_OK) { |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
351 b->last = (u_char *) ngx_http_v3_encode_field_ri(b->last, 0, |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
352 NGX_HTTP_V3_HEADER_STATUS_200); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
353 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
354 } else { |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
355 b->last = (u_char *) ngx_http_v3_encode_field_lri(b->last, 0, |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
356 NGX_HTTP_V3_HEADER_STATUS_200, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
357 NULL, 3); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
358 b->last = ngx_sprintf(b->last, "%03ui", r->headers_out.status); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
359 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
360 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
361 if (r->headers_out.server == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
362 if (clcf->server_tokens == NGX_HTTP_SERVER_TOKENS_ON) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
363 p = (u_char *) NGINX_VER; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
364 n = sizeof(NGINX_VER) - 1; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
365 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
366 } else if (clcf->server_tokens == NGX_HTTP_SERVER_TOKENS_BUILD) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
367 p = (u_char *) NGINX_VER_BUILD; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
368 n = sizeof(NGINX_VER_BUILD) - 1; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
369 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
370 } else { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
371 p = (u_char *) "nginx"; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
372 n = sizeof("nginx") - 1; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
373 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
374 |
8614
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
375 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, |
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
376 "http3 output header: \"server: %*s\"", n, p); |
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
377 |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
378 b->last = (u_char *) ngx_http_v3_encode_field_lri(b->last, 0, |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
379 NGX_HTTP_V3_HEADER_SERVER, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
380 p, n); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
381 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
382 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
383 if (r->headers_out.date == NULL) { |
8614
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
384 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, |
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
385 "http3 output header: \"date: %V\"", |
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
386 &ngx_cached_http_time); |
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
387 |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
388 b->last = (u_char *) ngx_http_v3_encode_field_lri(b->last, 0, |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
389 NGX_HTTP_V3_HEADER_DATE, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
390 ngx_cached_http_time.data, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
391 ngx_cached_http_time.len); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
392 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
393 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
394 if (r->headers_out.content_type.len) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
395 if (r->headers_out.content_type_len == r->headers_out.content_type.len |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
396 && r->headers_out.charset.len) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
397 { |
8611
2cb697e7d77f
HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8543
diff
changeset
|
398 n = r->headers_out.content_type.len + sizeof("; charset=") - 1 |
2cb697e7d77f
HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8543
diff
changeset
|
399 + r->headers_out.charset.len; |
2cb697e7d77f
HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8543
diff
changeset
|
400 |
2cb697e7d77f
HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8543
diff
changeset
|
401 p = ngx_pnalloc(r->pool, n); |
2cb697e7d77f
HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8543
diff
changeset
|
402 if (p == NULL) { |
2cb697e7d77f
HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8543
diff
changeset
|
403 return NGX_ERROR; |
2cb697e7d77f
HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8543
diff
changeset
|
404 } |
2cb697e7d77f
HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8543
diff
changeset
|
405 |
2cb697e7d77f
HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8543
diff
changeset
|
406 p = ngx_cpymem(p, r->headers_out.content_type.data, |
2cb697e7d77f
HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8543
diff
changeset
|
407 r->headers_out.content_type.len); |
2cb697e7d77f
HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8543
diff
changeset
|
408 |
2cb697e7d77f
HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8543
diff
changeset
|
409 p = ngx_cpymem(p, "; charset=", sizeof("; charset=") - 1); |
2cb697e7d77f
HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8543
diff
changeset
|
410 |
2cb697e7d77f
HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8543
diff
changeset
|
411 p = ngx_cpymem(p, r->headers_out.charset.data, |
2cb697e7d77f
HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8543
diff
changeset
|
412 r->headers_out.charset.len); |
2cb697e7d77f
HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8543
diff
changeset
|
413 |
2cb697e7d77f
HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8543
diff
changeset
|
414 /* updated r->headers_out.content_type is also needed for logging */ |
2cb697e7d77f
HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8543
diff
changeset
|
415 |
2cb697e7d77f
HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8543
diff
changeset
|
416 r->headers_out.content_type.len = n; |
2cb697e7d77f
HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8543
diff
changeset
|
417 r->headers_out.content_type.data = p - n; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
418 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
419 |
8614
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
420 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, |
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
421 "http3 output header: \"content-type: %V\"", |
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
422 &r->headers_out.content_type); |
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
423 |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
424 b->last = (u_char *) ngx_http_v3_encode_field_lri(b->last, 0, |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
425 NGX_HTTP_V3_HEADER_CONTENT_TYPE_TEXT_PLAIN, |
8611
2cb697e7d77f
HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8543
diff
changeset
|
426 r->headers_out.content_type.data, |
2cb697e7d77f
HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8543
diff
changeset
|
427 r->headers_out.content_type.len); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
428 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
429 |
8614
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
430 if (r->headers_out.content_length == NULL |
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
431 && r->headers_out.content_length_n >= 0) |
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
432 { |
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
433 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, |
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
434 "http3 output header: \"content-length: %O\"", |
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
435 r->headers_out.content_length_n); |
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
436 |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
437 if (r->headers_out.content_length_n > 0) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
438 p = ngx_sprintf(b->last, "%O", r->headers_out.content_length_n); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
439 n = p - b->last; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
440 |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
441 b->last = (u_char *) ngx_http_v3_encode_field_lri(b->last, 0, |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
442 NGX_HTTP_V3_HEADER_CONTENT_LENGTH_ZERO, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
443 NULL, n); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
444 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
445 b->last = ngx_sprintf(b->last, "%O", |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
446 r->headers_out.content_length_n); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
447 |
8614
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
448 } else { |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
449 b->last = (u_char *) ngx_http_v3_encode_field_ri(b->last, 0, |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
450 NGX_HTTP_V3_HEADER_CONTENT_LENGTH_ZERO); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
451 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
452 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
453 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
454 if (r->headers_out.last_modified == NULL |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
455 && r->headers_out.last_modified_time != -1) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
456 { |
8612
355461f0cc3b
HTTP/3: Huffman encoding for the Last-Modified response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8611
diff
changeset
|
457 n = sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1; |
355461f0cc3b
HTTP/3: Huffman encoding for the Last-Modified response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8611
diff
changeset
|
458 |
355461f0cc3b
HTTP/3: Huffman encoding for the Last-Modified response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8611
diff
changeset
|
459 p = ngx_pnalloc(r->pool, n); |
355461f0cc3b
HTTP/3: Huffman encoding for the Last-Modified response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8611
diff
changeset
|
460 if (p == NULL) { |
355461f0cc3b
HTTP/3: Huffman encoding for the Last-Modified response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8611
diff
changeset
|
461 return NGX_ERROR; |
355461f0cc3b
HTTP/3: Huffman encoding for the Last-Modified response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8611
diff
changeset
|
462 } |
355461f0cc3b
HTTP/3: Huffman encoding for the Last-Modified response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8611
diff
changeset
|
463 |
355461f0cc3b
HTTP/3: Huffman encoding for the Last-Modified response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8611
diff
changeset
|
464 ngx_http_time(p, r->headers_out.last_modified_time); |
355461f0cc3b
HTTP/3: Huffman encoding for the Last-Modified response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8611
diff
changeset
|
465 |
8614
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
466 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, |
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
467 "http3 output header: \"last-modified: %*s\"", n, p); |
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
468 |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
469 b->last = (u_char *) ngx_http_v3_encode_field_lri(b->last, 0, |
8612
355461f0cc3b
HTTP/3: Huffman encoding for the Last-Modified response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8611
diff
changeset
|
470 NGX_HTTP_V3_HEADER_LAST_MODIFIED, |
355461f0cc3b
HTTP/3: Huffman encoding for the Last-Modified response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8611
diff
changeset
|
471 p, n); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
472 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
473 |
8613
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
474 if (r->headers_out.location && r->headers_out.location->value.len) { |
8614
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
475 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, |
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
476 "http3 output header: \"location: %V\"", |
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
477 &r->headers_out.location->value); |
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
478 |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
479 b->last = (u_char *) ngx_http_v3_encode_field_lri(b->last, 0, |
8613
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
480 NGX_HTTP_V3_HEADER_LOCATION, |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
481 r->headers_out.location->value.data, |
051968b73c59
HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8612
diff
changeset
|
482 r->headers_out.location->value.len); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
483 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
484 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
485 #if (NGX_HTTP_GZIP) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
486 if (r->gzip_vary) { |
8614
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
487 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, |
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
488 "http3 output header: \"vary: Accept-Encoding\""); |
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
489 |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
490 b->last = (u_char *) ngx_http_v3_encode_field_ri(b->last, 0, |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
491 NGX_HTTP_V3_HEADER_VARY_ACCEPT_ENCODING); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
492 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
493 #endif |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
494 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
495 part = &r->headers_out.headers.part; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
496 header = part->elts; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
497 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
498 for (i = 0; /* void */; i++) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
499 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
500 if (i >= part->nelts) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
501 if (part->next == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
502 break; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
503 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
504 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
505 part = part->next; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
506 header = part->elts; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
507 i = 0; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
508 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
509 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
510 if (header[i].hash == 0) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
511 continue; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
512 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
513 |
8614
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
514 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, |
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
515 "http3 output header: \"%V: %V\"", |
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
516 &header[i].key, &header[i].value); |
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
517 |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
518 b->last = (u_char *) ngx_http_v3_encode_field_l(b->last, |
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
519 &header[i].key, |
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
520 &header[i].value); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
521 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
522 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
523 if (r->header_only) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
524 b->last_buf = 1; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
525 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
526 |
8543
07f90cb79fec
HTTP/3: use request pool instead of connection pool.
Roman Arutyunyan <arut@nginx.com>
parents:
8542
diff
changeset
|
527 cl = ngx_alloc_chain_link(r->pool); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
528 if (cl == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
529 return NGX_ERROR; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
530 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
531 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
532 cl->buf = b; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
533 cl->next = NULL; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
534 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
535 n = b->last - b->pos; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
536 |
8643
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
537 h3c->payload_bytes += n; |
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
538 |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
539 len = ngx_http_v3_encode_varlen_int(NULL, NGX_HTTP_V3_FRAME_HEADERS) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
540 + ngx_http_v3_encode_varlen_int(NULL, n); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
541 |
8543
07f90cb79fec
HTTP/3: use request pool instead of connection pool.
Roman Arutyunyan <arut@nginx.com>
parents:
8542
diff
changeset
|
542 b = ngx_create_temp_buf(r->pool, len); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
543 if (b == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
544 return NGX_ERROR; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
545 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
546 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
547 b->last = (u_char *) ngx_http_v3_encode_varlen_int(b->last, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
548 NGX_HTTP_V3_FRAME_HEADERS); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
549 b->last = (u_char *) ngx_http_v3_encode_varlen_int(b->last, n); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
550 |
8543
07f90cb79fec
HTTP/3: use request pool instead of connection pool.
Roman Arutyunyan <arut@nginx.com>
parents:
8542
diff
changeset
|
551 hl = ngx_alloc_chain_link(r->pool); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
552 if (hl == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
553 return NGX_ERROR; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
554 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
555 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
556 hl->buf = b; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
557 hl->next = cl; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
558 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
559 *ll = hl; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
560 ll = &cl->next; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
561 |
8542
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
562 if (r->headers_out.content_length_n >= 0 |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
563 && !r->header_only && !r->expect_trailers) |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
564 { |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
565 len = ngx_http_v3_encode_varlen_int(NULL, NGX_HTTP_V3_FRAME_DATA) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
566 + ngx_http_v3_encode_varlen_int(NULL, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
567 r->headers_out.content_length_n); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
568 |
8543
07f90cb79fec
HTTP/3: use request pool instead of connection pool.
Roman Arutyunyan <arut@nginx.com>
parents:
8542
diff
changeset
|
569 b = ngx_create_temp_buf(r->pool, len); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
570 if (b == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
571 return NGX_ERROR; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
572 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
573 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
574 b->last = (u_char *) ngx_http_v3_encode_varlen_int(b->last, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
575 NGX_HTTP_V3_FRAME_DATA); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
576 b->last = (u_char *) ngx_http_v3_encode_varlen_int(b->last, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
577 r->headers_out.content_length_n); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
578 |
8643
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
579 h3c->payload_bytes += r->headers_out.content_length_n; |
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
580 h3c->total_bytes += r->headers_out.content_length_n; |
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
581 |
8543
07f90cb79fec
HTTP/3: use request pool instead of connection pool.
Roman Arutyunyan <arut@nginx.com>
parents:
8542
diff
changeset
|
582 cl = ngx_alloc_chain_link(r->pool); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
583 if (cl == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
584 return NGX_ERROR; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
585 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
586 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
587 cl->buf = b; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
588 cl->next = NULL; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
589 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
590 *ll = cl; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
591 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
592 } else { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
593 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_v3_filter_ctx_t)); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
594 if (ctx == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
595 return NGX_ERROR; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
596 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
597 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
598 ngx_http_set_ctx(r, ctx, ngx_http_v3_filter_module); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
599 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
600 |
8643
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
601 for (cl = out; cl; cl = cl->next) { |
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
602 h3c->total_bytes += cl->buf->last - cl->buf->pos; |
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
603 } |
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
604 |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
605 return ngx_http_write_filter(r, out); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
606 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
607 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
608 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
609 static ngx_int_t |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
610 ngx_http_v3_push_resources(ngx_http_request_t *r, ngx_chain_t ***out) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
611 { |
8903
8d0753760546
Merged with the default branch.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8643
diff
changeset
|
612 u_char *start, *end, *last; |
8d0753760546
Merged with the default branch.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8643
diff
changeset
|
613 ngx_str_t path; |
8d0753760546
Merged with the default branch.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8643
diff
changeset
|
614 ngx_int_t rc; |
8d0753760546
Merged with the default branch.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8643
diff
changeset
|
615 ngx_uint_t i, push; |
8d0753760546
Merged with the default branch.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8643
diff
changeset
|
616 ngx_table_elt_t *h; |
8d0753760546
Merged with the default branch.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8643
diff
changeset
|
617 ngx_http_v3_loc_conf_t *h3lcf; |
8d0753760546
Merged with the default branch.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8643
diff
changeset
|
618 ngx_http_complex_value_t *pushes; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
619 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
620 h3lcf = ngx_http_get_module_loc_conf(r, ngx_http_v3_module); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
621 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
622 if (h3lcf->pushes) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
623 pushes = h3lcf->pushes->elts; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
624 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
625 for (i = 0; i < h3lcf->pushes->nelts; i++) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
626 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
627 if (ngx_http_complex_value(r, &pushes[i], &path) != NGX_OK) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
628 return NGX_ERROR; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
629 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
630 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
631 if (path.len == 0) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
632 continue; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
633 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
634 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
635 if (path.len == 3 && ngx_strncmp(path.data, "off", 3) == 0) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
636 continue; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
637 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
638 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
639 rc = ngx_http_v3_push_resource(r, &path, out); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
640 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
641 if (rc == NGX_ERROR) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
642 return NGX_ERROR; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
643 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
644 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
645 if (rc == NGX_ABORT) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
646 return NGX_OK; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
647 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
648 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
649 /* NGX_OK, NGX_DECLINED */ |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
650 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
651 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
652 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
653 if (!h3lcf->push_preload) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
654 return NGX_OK; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
655 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
656 |
8903
8d0753760546
Merged with the default branch.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8643
diff
changeset
|
657 for (h = r->headers_out.link; h; h = h->next) { |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
658 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
659 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
8903
8d0753760546
Merged with the default branch.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8643
diff
changeset
|
660 "http3 parse link: \"%V\"", &h->value); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
661 |
8903
8d0753760546
Merged with the default branch.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8643
diff
changeset
|
662 start = h->value.data; |
8d0753760546
Merged with the default branch.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8643
diff
changeset
|
663 end = h->value.data + h->value.len; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
664 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
665 next_link: |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
666 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
667 while (start < end && *start == ' ') { start++; } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
668 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
669 if (start == end || *start++ != '<') { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
670 continue; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
671 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
672 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
673 while (start < end && *start == ' ') { start++; } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
674 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
675 for (last = start; last < end && *last != '>'; last++) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
676 /* void */ |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
677 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
678 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
679 if (last == start || last == end) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
680 continue; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
681 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
682 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
683 path.len = last - start; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
684 path.data = start; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
685 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
686 start = last + 1; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
687 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
688 while (start < end && *start == ' ') { start++; } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
689 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
690 if (start == end) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
691 continue; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
692 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
693 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
694 if (*start == ',') { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
695 start++; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
696 goto next_link; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
697 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
698 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
699 if (*start++ != ';') { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
700 continue; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
701 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
702 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
703 last = ngx_strlchr(start, end, ','); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
704 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
705 if (last == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
706 last = end; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
707 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
708 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
709 push = 0; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
710 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
711 for ( ;; ) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
712 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
713 while (start < last && *start == ' ') { start++; } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
714 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
715 if (last - start >= 6 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
716 && ngx_strncasecmp(start, (u_char *) "nopush", 6) == 0) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
717 { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
718 start += 6; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
719 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
720 if (start == last || *start == ' ' || *start == ';') { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
721 push = 0; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
722 break; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
723 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
724 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
725 goto next_param; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
726 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
727 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
728 if (last - start >= 11 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
729 && ngx_strncasecmp(start, (u_char *) "rel=preload", 11) == 0) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
730 { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
731 start += 11; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
732 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
733 if (start == last || *start == ' ' || *start == ';') { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
734 push = 1; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
735 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
736 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
737 goto next_param; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
738 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
739 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
740 if (last - start >= 4 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
741 && ngx_strncasecmp(start, (u_char *) "rel=", 4) == 0) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
742 { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
743 start += 4; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
744 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
745 while (start < last && *start == ' ') { start++; } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
746 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
747 if (start == last || *start++ != '"') { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
748 goto next_param; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
749 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
750 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
751 for ( ;; ) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
752 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
753 while (start < last && *start == ' ') { start++; } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
754 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
755 if (last - start >= 7 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
756 && ngx_strncasecmp(start, (u_char *) "preload", 7) == 0) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
757 { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
758 start += 7; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
759 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
760 if (start < last && (*start == ' ' || *start == '"')) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
761 push = 1; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
762 break; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
763 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
764 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
765 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
766 while (start < last && *start != ' ' && *start != '"') { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
767 start++; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
768 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
769 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
770 if (start == last) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
771 break; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
772 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
773 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
774 if (*start == '"') { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
775 break; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
776 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
777 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
778 start++; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
779 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
780 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
781 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
782 next_param: |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
783 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
784 start = ngx_strlchr(start, last, ';'); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
785 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
786 if (start == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
787 break; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
788 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
789 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
790 start++; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
791 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
792 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
793 if (push) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
794 while (path.len && path.data[path.len - 1] == ' ') { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
795 path.len--; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
796 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
797 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
798 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
799 if (push && path.len |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
800 && !(path.len > 1 && path.data[0] == '/' && path.data[1] == '/')) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
801 { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
802 rc = ngx_http_v3_push_resource(r, &path, out); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
803 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
804 if (rc == NGX_ERROR) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
805 return NGX_ERROR; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
806 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
807 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
808 if (rc == NGX_ABORT) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
809 return NGX_OK; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
810 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
811 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
812 /* NGX_OK, NGX_DECLINED */ |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
813 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
814 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
815 if (last < end) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
816 start = last + 1; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
817 goto next_link; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
818 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
819 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
820 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
821 return NGX_OK; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
822 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
823 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
824 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
825 static ngx_int_t |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
826 ngx_http_v3_push_resource(ngx_http_request_t *r, ngx_str_t *path, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
827 ngx_chain_t ***ll) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
828 { |
8430
67f0eb150047
HTTP/3: renamed ngx_http_v3_connection_t to ngx_http_v3_session_t.
Roman Arutyunyan <arut@nginx.com>
parents:
8428
diff
changeset
|
829 uint64_t push_id; |
67f0eb150047
HTTP/3: renamed ngx_http_v3_connection_t to ngx_http_v3_session_t.
Roman Arutyunyan <arut@nginx.com>
parents:
8428
diff
changeset
|
830 ngx_int_t rc; |
67f0eb150047
HTTP/3: renamed ngx_http_v3_connection_t to ngx_http_v3_session_t.
Roman Arutyunyan <arut@nginx.com>
parents:
8428
diff
changeset
|
831 ngx_chain_t *cl; |
67f0eb150047
HTTP/3: renamed ngx_http_v3_connection_t to ngx_http_v3_session_t.
Roman Arutyunyan <arut@nginx.com>
parents:
8428
diff
changeset
|
832 ngx_connection_t *c; |
67f0eb150047
HTTP/3: renamed ngx_http_v3_connection_t to ngx_http_v3_session_t.
Roman Arutyunyan <arut@nginx.com>
parents:
8428
diff
changeset
|
833 ngx_http_v3_session_t *h3c; |
67f0eb150047
HTTP/3: renamed ngx_http_v3_connection_t to ngx_http_v3_session_t.
Roman Arutyunyan <arut@nginx.com>
parents:
8428
diff
changeset
|
834 ngx_http_v3_srv_conf_t *h3scf; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
835 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
836 c = r->connection; |
8428
40d710a66aef
HTTP/3: ngx_http_v3_get_session() macro.
Roman Arutyunyan <arut@nginx.com>
parents:
8354
diff
changeset
|
837 h3c = ngx_http_v3_get_session(c); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
838 h3scf = ngx_http_get_module_srv_conf(r, ngx_http_v3_module); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
839 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
840 ngx_log_debug5(NGX_LOG_DEBUG_HTTP, c->log, 0, |
8354
5cb5b568282b
HTTP/3: do not push until a MAX_PUSH_ID frame is received.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8350
diff
changeset
|
841 "http3 push \"%V\" pushing:%ui/%ui id:%uL/%L", |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
842 path, h3c->npushing, h3scf->max_concurrent_pushes, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
843 h3c->next_push_id, h3c->max_push_id); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
844 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
845 if (!ngx_path_separator(path->data[0])) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
846 ngx_log_error(NGX_LOG_WARN, c->log, 0, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
847 "non-absolute path \"%V\" not pushed", path); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
848 return NGX_DECLINED; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
849 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
850 |
8354
5cb5b568282b
HTTP/3: do not push until a MAX_PUSH_ID frame is received.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8350
diff
changeset
|
851 if (h3c->max_push_id == (uint64_t) -1 |
5cb5b568282b
HTTP/3: do not push until a MAX_PUSH_ID frame is received.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8350
diff
changeset
|
852 || h3c->next_push_id > h3c->max_push_id) |
5cb5b568282b
HTTP/3: do not push until a MAX_PUSH_ID frame is received.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8350
diff
changeset
|
853 { |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
854 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
855 "http3 abort pushes due to max_push_id"); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
856 return NGX_ABORT; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
857 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
858 |
8497
1fec68e322d0
HTTP/3: client GOAWAY support.
Roman Arutyunyan <arut@nginx.com>
parents:
8440
diff
changeset
|
859 if (h3c->goaway_push_id != (uint64_t) -1) { |
1fec68e322d0
HTTP/3: client GOAWAY support.
Roman Arutyunyan <arut@nginx.com>
parents:
8440
diff
changeset
|
860 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, |
1fec68e322d0
HTTP/3: client GOAWAY support.
Roman Arutyunyan <arut@nginx.com>
parents:
8440
diff
changeset
|
861 "http3 abort pushes due to goaway"); |
1fec68e322d0
HTTP/3: client GOAWAY support.
Roman Arutyunyan <arut@nginx.com>
parents:
8440
diff
changeset
|
862 return NGX_ABORT; |
1fec68e322d0
HTTP/3: client GOAWAY support.
Roman Arutyunyan <arut@nginx.com>
parents:
8440
diff
changeset
|
863 } |
1fec68e322d0
HTTP/3: client GOAWAY support.
Roman Arutyunyan <arut@nginx.com>
parents:
8440
diff
changeset
|
864 |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
865 if (h3c->npushing >= h3scf->max_concurrent_pushes) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
866 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
867 "http3 abort pushes due to max_concurrent_pushes"); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
868 return NGX_ABORT; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
869 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
870 |
8630
5a2080d48da8
HTTP/3: fixed server push after ea9b645472b5.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8626
diff
changeset
|
871 if (r->headers_in.server.len == 0) { |
8626
ea9b645472b5
HTTP/3: fixed null pointer dereference with server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8625
diff
changeset
|
872 return NGX_ABORT; |
ea9b645472b5
HTTP/3: fixed null pointer dereference with server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8625
diff
changeset
|
873 } |
ea9b645472b5
HTTP/3: fixed null pointer dereference with server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8625
diff
changeset
|
874 |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
875 push_id = h3c->next_push_id++; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
876 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
877 rc = ngx_http_v3_create_push_request(r, path, push_id); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
878 if (rc != NGX_OK) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
879 return rc; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
880 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
881 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
882 cl = ngx_http_v3_create_push_promise(r, path, push_id); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
883 if (cl == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
884 return NGX_ERROR; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
885 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
886 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
887 for (**ll = cl; **ll; *ll = &(**ll)->next); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
888 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
889 return NGX_OK; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
890 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
891 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
892 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
893 static ngx_int_t |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
894 ngx_http_v3_create_push_request(ngx_http_request_t *pr, ngx_str_t *path, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
895 uint64_t push_id) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
896 { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
897 ngx_connection_t *c, *pc; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
898 ngx_http_request_t *r; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
899 ngx_http_log_ctx_t *ctx; |
8440
557dc6a06ba6
HTTP/3: fixed server push after 9ec3e71f8a61.
Roman Arutyunyan <arut@nginx.com>
parents:
8430
diff
changeset
|
900 ngx_http_connection_t *hc, *phc; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
901 ngx_http_core_srv_conf_t *cscf; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
902 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
903 pc = pr->connection; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
904 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
905 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
906 "http3 create push request id:%uL", push_id); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
907 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
908 c = ngx_http_v3_create_push_stream(pc, push_id); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
909 if (c == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
910 return NGX_ABORT; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
911 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
912 |
8625
33578b8d453d
HTTP/3: fixed ngx_stat_active counter.
Roman Arutyunyan <arut@nginx.com>
parents:
8624
diff
changeset
|
913 #if (NGX_STAT_STUB) |
33578b8d453d
HTTP/3: fixed ngx_stat_active counter.
Roman Arutyunyan <arut@nginx.com>
parents:
8624
diff
changeset
|
914 (void) ngx_atomic_fetch_add(ngx_stat_active, 1); |
33578b8d453d
HTTP/3: fixed ngx_stat_active counter.
Roman Arutyunyan <arut@nginx.com>
parents:
8624
diff
changeset
|
915 #endif |
33578b8d453d
HTTP/3: fixed ngx_stat_active counter.
Roman Arutyunyan <arut@nginx.com>
parents:
8624
diff
changeset
|
916 |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
917 hc = ngx_palloc(c->pool, sizeof(ngx_http_connection_t)); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
918 if (hc == NULL) { |
8624
3fdf0afd5d45
HTTP/3: fixed pushed request finalization in case of error.
Roman Arutyunyan <arut@nginx.com>
parents:
8618
diff
changeset
|
919 ngx_http_close_connection(c); |
3fdf0afd5d45
HTTP/3: fixed pushed request finalization in case of error.
Roman Arutyunyan <arut@nginx.com>
parents:
8618
diff
changeset
|
920 return NGX_ERROR; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
921 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
922 |
8440
557dc6a06ba6
HTTP/3: fixed server push after 9ec3e71f8a61.
Roman Arutyunyan <arut@nginx.com>
parents:
8430
diff
changeset
|
923 phc = ngx_http_quic_get_connection(pc); |
557dc6a06ba6
HTTP/3: fixed server push after 9ec3e71f8a61.
Roman Arutyunyan <arut@nginx.com>
parents:
8430
diff
changeset
|
924 ngx_memcpy(hc, phc, sizeof(ngx_http_connection_t)); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
925 c->data = hc; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
926 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
927 ctx = ngx_palloc(c->pool, sizeof(ngx_http_log_ctx_t)); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
928 if (ctx == NULL) { |
8624
3fdf0afd5d45
HTTP/3: fixed pushed request finalization in case of error.
Roman Arutyunyan <arut@nginx.com>
parents:
8618
diff
changeset
|
929 ngx_http_close_connection(c); |
3fdf0afd5d45
HTTP/3: fixed pushed request finalization in case of error.
Roman Arutyunyan <arut@nginx.com>
parents:
8618
diff
changeset
|
930 return NGX_ERROR; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
931 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
932 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
933 ctx->connection = c; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
934 ctx->request = NULL; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
935 ctx->current_request = NULL; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
936 |
8618
6a383020d61e
HTTP/3: make ngx_http_log_error() static again.
Roman Arutyunyan <arut@nginx.com>
parents:
8614
diff
changeset
|
937 c->log->handler = pc->log->handler; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
938 c->log->data = ctx; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
939 c->log->action = "processing pushed request headers"; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
940 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
941 c->log_error = NGX_ERROR_INFO; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
942 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
943 r = ngx_http_create_request(c); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
944 if (r == NULL) { |
8624
3fdf0afd5d45
HTTP/3: fixed pushed request finalization in case of error.
Roman Arutyunyan <arut@nginx.com>
parents:
8618
diff
changeset
|
945 ngx_http_close_connection(c); |
3fdf0afd5d45
HTTP/3: fixed pushed request finalization in case of error.
Roman Arutyunyan <arut@nginx.com>
parents:
8618
diff
changeset
|
946 return NGX_ERROR; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
947 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
948 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
949 c->data = r; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
950 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
951 ngx_str_set(&r->http_protocol, "HTTP/3.0"); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
952 |
8350
6bb924b00e30
HTTP/3: fixed server push.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8237
diff
changeset
|
953 r->http_version = NGX_HTTP_VERSION_30; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
954 r->method_name = ngx_http_core_get_method; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
955 r->method = NGX_HTTP_GET; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
956 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
957 cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
958 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
959 r->header_in = ngx_create_temp_buf(r->pool, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
960 cscf->client_header_buffer_size); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
961 if (r->header_in == NULL) { |
8624
3fdf0afd5d45
HTTP/3: fixed pushed request finalization in case of error.
Roman Arutyunyan <arut@nginx.com>
parents:
8618
diff
changeset
|
962 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); |
3fdf0afd5d45
HTTP/3: fixed pushed request finalization in case of error.
Roman Arutyunyan <arut@nginx.com>
parents:
8618
diff
changeset
|
963 return NGX_ERROR; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
964 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
965 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
966 if (ngx_list_init(&r->headers_in.headers, r->pool, 4, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
967 sizeof(ngx_table_elt_t)) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
968 != NGX_OK) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
969 { |
8624
3fdf0afd5d45
HTTP/3: fixed pushed request finalization in case of error.
Roman Arutyunyan <arut@nginx.com>
parents:
8618
diff
changeset
|
970 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); |
3fdf0afd5d45
HTTP/3: fixed pushed request finalization in case of error.
Roman Arutyunyan <arut@nginx.com>
parents:
8618
diff
changeset
|
971 return NGX_ERROR; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
972 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
973 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
974 r->headers_in.connection_type = NGX_HTTP_CONNECTION_CLOSE; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
975 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
976 r->schema.data = ngx_pstrdup(r->pool, &pr->schema); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
977 if (r->schema.data == NULL) { |
8624
3fdf0afd5d45
HTTP/3: fixed pushed request finalization in case of error.
Roman Arutyunyan <arut@nginx.com>
parents:
8618
diff
changeset
|
978 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); |
3fdf0afd5d45
HTTP/3: fixed pushed request finalization in case of error.
Roman Arutyunyan <arut@nginx.com>
parents:
8618
diff
changeset
|
979 return NGX_ERROR; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
980 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
981 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
982 r->schema.len = pr->schema.len; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
983 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
984 r->uri_start = ngx_pstrdup(r->pool, path); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
985 if (r->uri_start == NULL) { |
8624
3fdf0afd5d45
HTTP/3: fixed pushed request finalization in case of error.
Roman Arutyunyan <arut@nginx.com>
parents:
8618
diff
changeset
|
986 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); |
3fdf0afd5d45
HTTP/3: fixed pushed request finalization in case of error.
Roman Arutyunyan <arut@nginx.com>
parents:
8618
diff
changeset
|
987 return NGX_ERROR; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
988 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
989 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
990 r->uri_end = r->uri_start + path->len; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
991 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
992 if (ngx_http_parse_uri(r) != NGX_OK) { |
8624
3fdf0afd5d45
HTTP/3: fixed pushed request finalization in case of error.
Roman Arutyunyan <arut@nginx.com>
parents:
8618
diff
changeset
|
993 ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); |
3fdf0afd5d45
HTTP/3: fixed pushed request finalization in case of error.
Roman Arutyunyan <arut@nginx.com>
parents:
8618
diff
changeset
|
994 return NGX_ERROR; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
995 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
996 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
997 if (ngx_http_process_request_uri(r) != NGX_OK) { |
8624
3fdf0afd5d45
HTTP/3: fixed pushed request finalization in case of error.
Roman Arutyunyan <arut@nginx.com>
parents:
8618
diff
changeset
|
998 return NGX_ERROR; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
999 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1000 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1001 if (ngx_http_v3_set_push_header(r, "host", &pr->headers_in.server) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1002 != NGX_OK) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1003 { |
8624
3fdf0afd5d45
HTTP/3: fixed pushed request finalization in case of error.
Roman Arutyunyan <arut@nginx.com>
parents:
8618
diff
changeset
|
1004 return NGX_ERROR; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1005 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1006 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1007 if (pr->headers_in.accept_encoding) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1008 if (ngx_http_v3_set_push_header(r, "accept-encoding", |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1009 &pr->headers_in.accept_encoding->value) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1010 != NGX_OK) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1011 { |
8624
3fdf0afd5d45
HTTP/3: fixed pushed request finalization in case of error.
Roman Arutyunyan <arut@nginx.com>
parents:
8618
diff
changeset
|
1012 return NGX_ERROR; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1013 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1014 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1015 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1016 if (pr->headers_in.accept_language) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1017 if (ngx_http_v3_set_push_header(r, "accept-language", |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1018 &pr->headers_in.accept_language->value) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1019 != NGX_OK) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1020 { |
8624
3fdf0afd5d45
HTTP/3: fixed pushed request finalization in case of error.
Roman Arutyunyan <arut@nginx.com>
parents:
8618
diff
changeset
|
1021 return NGX_ERROR; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1022 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1023 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1024 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1025 if (pr->headers_in.user_agent) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1026 if (ngx_http_v3_set_push_header(r, "user-agent", |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1027 &pr->headers_in.user_agent->value) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1028 != NGX_OK) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1029 { |
8624
3fdf0afd5d45
HTTP/3: fixed pushed request finalization in case of error.
Roman Arutyunyan <arut@nginx.com>
parents:
8618
diff
changeset
|
1030 return NGX_ERROR; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1031 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1032 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1033 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1034 c->read->handler = ngx_http_v3_push_request_handler; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1035 c->read->handler = ngx_http_v3_push_request_handler; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1036 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1037 ngx_post_event(c->read, &ngx_posted_events); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1038 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1039 return NGX_OK; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1040 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1041 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1042 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1043 static ngx_int_t |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1044 ngx_http_v3_set_push_header(ngx_http_request_t *r, const char *name, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1045 ngx_str_t *value) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1046 { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1047 u_char *p; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1048 ngx_table_elt_t *h; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1049 ngx_http_header_t *hh; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1050 ngx_http_core_main_conf_t *cmcf; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1051 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1052 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1053 "http3 push header \"%s\": \"%V\"", name, value); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1054 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1055 cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1056 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1057 p = ngx_pnalloc(r->pool, value->len + 1); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1058 if (p == NULL) { |
8624
3fdf0afd5d45
HTTP/3: fixed pushed request finalization in case of error.
Roman Arutyunyan <arut@nginx.com>
parents:
8618
diff
changeset
|
1059 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1060 return NGX_ERROR; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1061 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1062 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1063 ngx_memcpy(p, value->data, value->len); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1064 p[value->len] = '\0'; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1065 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1066 h = ngx_list_push(&r->headers_in.headers); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1067 if (h == NULL) { |
8624
3fdf0afd5d45
HTTP/3: fixed pushed request finalization in case of error.
Roman Arutyunyan <arut@nginx.com>
parents:
8618
diff
changeset
|
1068 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1069 return NGX_ERROR; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1070 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1071 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1072 h->key.data = (u_char *) name; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1073 h->key.len = ngx_strlen(name); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1074 h->hash = ngx_hash_key(h->key.data, h->key.len); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1075 h->lowcase_key = (u_char *) name; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1076 h->value.data = p; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1077 h->value.len = value->len; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1078 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1079 hh = ngx_hash_find(&cmcf->headers_in_hash, h->hash, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1080 h->lowcase_key, h->key.len); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1081 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1082 if (hh && hh->handler(r, h, hh->offset) != NGX_OK) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1083 return NGX_ERROR; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1084 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1085 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1086 return NGX_OK; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1087 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1088 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1089 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1090 static void |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1091 ngx_http_v3_push_request_handler(ngx_event_t *ev) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1092 { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1093 ngx_connection_t *c; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1094 ngx_http_request_t *r; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1095 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1096 c = ev->data; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1097 r = c->data; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1098 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1099 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 push request handler"); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1100 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1101 ngx_http_process_request(r); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1102 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1103 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1104 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1105 static ngx_chain_t * |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1106 ngx_http_v3_create_push_promise(ngx_http_request_t *r, ngx_str_t *path, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1107 uint64_t push_id) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1108 { |
8643
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1109 size_t n, len; |
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1110 ngx_buf_t *b; |
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1111 ngx_chain_t *hl, *cl; |
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1112 ngx_http_v3_session_t *h3c; |
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1113 |
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1114 h3c = ngx_http_v3_get_session(r->connection); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1115 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1116 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1117 "http3 create push promise id:%uL", push_id); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1118 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1119 len = ngx_http_v3_encode_varlen_int(NULL, push_id); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1120 |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1121 len += ngx_http_v3_encode_field_section_prefix(NULL, 0, 0, 0); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1122 |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1123 len += ngx_http_v3_encode_field_ri(NULL, 0, |
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1124 NGX_HTTP_V3_HEADER_METHOD_GET); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1125 |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1126 len += ngx_http_v3_encode_field_lri(NULL, 0, |
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1127 NGX_HTTP_V3_HEADER_AUTHORITY, |
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1128 NULL, r->headers_in.server.len); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1129 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1130 if (path->len == 1 && path->data[0] == '/') { |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1131 len += ngx_http_v3_encode_field_ri(NULL, 0, |
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1132 NGX_HTTP_V3_HEADER_PATH_ROOT); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1133 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1134 } else { |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1135 len += ngx_http_v3_encode_field_lri(NULL, 0, |
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1136 NGX_HTTP_V3_HEADER_PATH_ROOT, |
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1137 NULL, path->len); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1138 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1139 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1140 if (r->schema.len == 5 && ngx_strncmp(r->schema.data, "https", 5) == 0) { |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1141 len += ngx_http_v3_encode_field_ri(NULL, 0, |
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1142 NGX_HTTP_V3_HEADER_SCHEME_HTTPS); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1143 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1144 } else if (r->schema.len == 4 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1145 && ngx_strncmp(r->schema.data, "http", 4) == 0) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1146 { |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1147 len += ngx_http_v3_encode_field_ri(NULL, 0, |
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1148 NGX_HTTP_V3_HEADER_SCHEME_HTTP); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1149 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1150 } else { |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1151 len += ngx_http_v3_encode_field_lri(NULL, 0, |
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1152 NGX_HTTP_V3_HEADER_SCHEME_HTTP, |
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1153 NULL, r->schema.len); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1154 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1155 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1156 if (r->headers_in.accept_encoding) { |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1157 len += ngx_http_v3_encode_field_lri(NULL, 0, |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1158 NGX_HTTP_V3_HEADER_ACCEPT_ENCODING, NULL, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1159 r->headers_in.accept_encoding->value.len); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1160 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1161 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1162 if (r->headers_in.accept_language) { |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1163 len += ngx_http_v3_encode_field_lri(NULL, 0, |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1164 NGX_HTTP_V3_HEADER_ACCEPT_LANGUAGE, NULL, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1165 r->headers_in.accept_language->value.len); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1166 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1167 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1168 if (r->headers_in.user_agent) { |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1169 len += ngx_http_v3_encode_field_lri(NULL, 0, |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1170 NGX_HTTP_V3_HEADER_USER_AGENT, NULL, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1171 r->headers_in.user_agent->value.len); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1172 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1173 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1174 b = ngx_create_temp_buf(r->pool, len); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1175 if (b == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1176 return NULL; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1177 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1178 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1179 b->last = (u_char *) ngx_http_v3_encode_varlen_int(b->last, push_id); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1180 |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1181 b->last = (u_char *) ngx_http_v3_encode_field_section_prefix(b->last, |
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1182 0, 0, 0); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1183 |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1184 b->last = (u_char *) ngx_http_v3_encode_field_ri(b->last, 0, |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1185 NGX_HTTP_V3_HEADER_METHOD_GET); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1186 |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1187 b->last = (u_char *) ngx_http_v3_encode_field_lri(b->last, 0, |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1188 NGX_HTTP_V3_HEADER_AUTHORITY, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1189 r->headers_in.server.data, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1190 r->headers_in.server.len); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1191 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1192 if (path->len == 1 && path->data[0] == '/') { |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1193 b->last = (u_char *) ngx_http_v3_encode_field_ri(b->last, 0, |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1194 NGX_HTTP_V3_HEADER_PATH_ROOT); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1195 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1196 } else { |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1197 b->last = (u_char *) ngx_http_v3_encode_field_lri(b->last, 0, |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1198 NGX_HTTP_V3_HEADER_PATH_ROOT, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1199 path->data, path->len); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1200 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1201 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1202 if (r->schema.len == 5 && ngx_strncmp(r->schema.data, "https", 5) == 0) { |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1203 b->last = (u_char *) ngx_http_v3_encode_field_ri(b->last, 0, |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1204 NGX_HTTP_V3_HEADER_SCHEME_HTTPS); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1205 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1206 } else if (r->schema.len == 4 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1207 && ngx_strncmp(r->schema.data, "http", 4) == 0) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1208 { |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1209 b->last = (u_char *) ngx_http_v3_encode_field_ri(b->last, 0, |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1210 NGX_HTTP_V3_HEADER_SCHEME_HTTP); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1211 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1212 } else { |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1213 b->last = (u_char *) ngx_http_v3_encode_field_lri(b->last, 0, |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1214 NGX_HTTP_V3_HEADER_SCHEME_HTTP, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1215 r->schema.data, r->schema.len); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1216 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1217 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1218 if (r->headers_in.accept_encoding) { |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1219 b->last = (u_char *) ngx_http_v3_encode_field_lri(b->last, 0, |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1220 NGX_HTTP_V3_HEADER_ACCEPT_ENCODING, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1221 r->headers_in.accept_encoding->value.data, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1222 r->headers_in.accept_encoding->value.len); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1223 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1224 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1225 if (r->headers_in.accept_language) { |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1226 b->last = (u_char *) ngx_http_v3_encode_field_lri(b->last, 0, |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1227 NGX_HTTP_V3_HEADER_ACCEPT_LANGUAGE, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1228 r->headers_in.accept_language->value.data, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1229 r->headers_in.accept_language->value.len); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1230 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1231 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1232 if (r->headers_in.user_agent) { |
8508
0ac25efb2da3
HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8497
diff
changeset
|
1233 b->last = (u_char *) ngx_http_v3_encode_field_lri(b->last, 0, |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1234 NGX_HTTP_V3_HEADER_USER_AGENT, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1235 r->headers_in.user_agent->value.data, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1236 r->headers_in.user_agent->value.len); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1237 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1238 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1239 cl = ngx_alloc_chain_link(r->pool); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1240 if (cl == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1241 return NULL; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1242 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1243 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1244 cl->buf = b; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1245 cl->next = NULL; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1246 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1247 n = b->last - b->pos; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1248 |
8643
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1249 h3c->payload_bytes += n; |
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1250 |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1251 len = ngx_http_v3_encode_varlen_int(NULL, NGX_HTTP_V3_FRAME_PUSH_PROMISE) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1252 + ngx_http_v3_encode_varlen_int(NULL, n); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1253 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1254 b = ngx_create_temp_buf(r->pool, len); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1255 if (b == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1256 return NULL; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1257 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1258 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1259 b->last = (u_char *) ngx_http_v3_encode_varlen_int(b->last, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1260 NGX_HTTP_V3_FRAME_PUSH_PROMISE); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1261 b->last = (u_char *) ngx_http_v3_encode_varlen_int(b->last, n); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1262 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1263 hl = ngx_alloc_chain_link(r->pool); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1264 if (hl == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1265 return NULL; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1266 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1267 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1268 hl->buf = b; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1269 hl->next = cl; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1270 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1271 return hl; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1272 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1273 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1274 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1275 static ngx_int_t |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1276 ngx_http_v3_body_filter(ngx_http_request_t *r, ngx_chain_t *in) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1277 { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1278 u_char *chunk; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1279 off_t size; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1280 ngx_int_t rc; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1281 ngx_buf_t *b; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1282 ngx_chain_t *out, *cl, *tl, **ll; |
8643
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1283 ngx_http_v3_session_t *h3c; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1284 ngx_http_v3_filter_ctx_t *ctx; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1285 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1286 if (in == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1287 return ngx_http_next_body_filter(r, in); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1288 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1289 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1290 ctx = ngx_http_get_module_ctx(r, ngx_http_v3_filter_module); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1291 if (ctx == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1292 return ngx_http_next_body_filter(r, in); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1293 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1294 |
8643
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1295 h3c = ngx_http_v3_get_session(r->connection); |
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1296 |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1297 out = NULL; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1298 ll = &out; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1299 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1300 size = 0; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1301 cl = in; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1302 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1303 for ( ;; ) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1304 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1305 "http3 chunk: %O", ngx_buf_size(cl->buf)); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1306 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1307 size += ngx_buf_size(cl->buf); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1308 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1309 if (cl->buf->flush |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1310 || cl->buf->sync |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1311 || ngx_buf_in_memory(cl->buf) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1312 || cl->buf->in_file) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1313 { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1314 tl = ngx_alloc_chain_link(r->pool); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1315 if (tl == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1316 return NGX_ERROR; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1317 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1318 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1319 tl->buf = cl->buf; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1320 *ll = tl; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1321 ll = &tl->next; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1322 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1323 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1324 if (cl->next == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1325 break; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1326 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1327 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1328 cl = cl->next; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1329 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1330 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1331 if (size) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1332 tl = ngx_chain_get_free_buf(r->pool, &ctx->free); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1333 if (tl == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1334 return NGX_ERROR; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1335 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1336 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1337 b = tl->buf; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1338 chunk = b->start; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1339 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1340 if (chunk == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1341 chunk = ngx_palloc(r->pool, NGX_HTTP_V3_VARLEN_INT_LEN * 2); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1342 if (chunk == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1343 return NGX_ERROR; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1344 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1345 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1346 b->start = chunk; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1347 b->end = chunk + NGX_HTTP_V3_VARLEN_INT_LEN * 2; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1348 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1349 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1350 b->tag = (ngx_buf_tag_t) &ngx_http_v3_filter_module; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1351 b->memory = 0; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1352 b->temporary = 1; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1353 b->pos = chunk; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1354 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1355 b->last = (u_char *) ngx_http_v3_encode_varlen_int(chunk, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1356 NGX_HTTP_V3_FRAME_DATA); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1357 b->last = (u_char *) ngx_http_v3_encode_varlen_int(b->last, size); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1358 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1359 tl->next = out; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1360 out = tl; |
8643
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1361 |
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1362 h3c->payload_bytes += size; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1363 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1364 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1365 if (cl->buf->last_buf) { |
8542
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1366 tl = ngx_http_v3_create_trailers(r, ctx); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1367 if (tl == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1368 return NGX_ERROR; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1369 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1370 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1371 cl->buf->last_buf = 0; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1372 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1373 *ll = tl; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1374 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1375 } else { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1376 *ll = NULL; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1377 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1378 |
8643
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1379 for (cl = out; cl; cl = cl->next) { |
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1380 h3c->total_bytes += cl->buf->last - cl->buf->pos; |
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1381 } |
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1382 |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1383 rc = ngx_http_next_body_filter(r, out); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1384 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1385 ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &out, |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1386 (ngx_buf_tag_t) &ngx_http_v3_filter_module); |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1387 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1388 return rc; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1389 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1390 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1391 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1392 static ngx_chain_t * |
8542
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1393 ngx_http_v3_create_trailers(ngx_http_request_t *r, |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1394 ngx_http_v3_filter_ctx_t *ctx) |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1395 { |
8643
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1396 size_t len, n; |
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1397 u_char *p; |
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1398 ngx_buf_t *b; |
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1399 ngx_uint_t i; |
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1400 ngx_chain_t *cl, *hl; |
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1401 ngx_list_part_t *part; |
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1402 ngx_table_elt_t *header; |
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1403 ngx_http_v3_session_t *h3c; |
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1404 |
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1405 h3c = ngx_http_v3_get_session(r->connection); |
8542
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1406 |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1407 len = 0; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1408 |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1409 part = &r->headers_out.trailers.part; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1410 header = part->elts; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1411 |
8542
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1412 for (i = 0; /* void */; i++) { |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1413 |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1414 if (i >= part->nelts) { |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1415 if (part->next == NULL) { |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1416 break; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1417 } |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1418 |
8542
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1419 part = part->next; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1420 header = part->elts; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1421 i = 0; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1422 } |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1423 |
8542
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1424 if (header[i].hash == 0) { |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1425 continue; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1426 } |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1427 |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1428 len += ngx_http_v3_encode_field_l(NULL, &header[i].key, |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1429 &header[i].value); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1430 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1431 |
8542
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1432 cl = ngx_chain_get_free_buf(r->pool, &ctx->free); |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1433 if (cl == NULL) { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1434 return NULL; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1435 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1436 |
8542
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1437 b = cl->buf; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1438 |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1439 b->tag = (ngx_buf_tag_t) &ngx_http_v3_filter_module; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1440 b->memory = 0; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1441 b->last_buf = 1; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1442 |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1443 if (len == 0) { |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1444 b->temporary = 0; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1445 b->pos = b->last = NULL; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1446 return cl; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1447 } |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1448 |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1449 b->temporary = 1; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1450 |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1451 len += ngx_http_v3_encode_field_section_prefix(NULL, 0, 0, 0); |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1452 |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1453 b->pos = ngx_palloc(r->pool, len); |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1454 if (b->pos == NULL) { |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1455 return NULL; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1456 } |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1457 |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1458 b->last = (u_char *) ngx_http_v3_encode_field_section_prefix(b->pos, |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1459 0, 0, 0); |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1460 |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1461 part = &r->headers_out.trailers.part; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1462 header = part->elts; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1463 |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1464 for (i = 0; /* void */; i++) { |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1465 |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1466 if (i >= part->nelts) { |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1467 if (part->next == NULL) { |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1468 break; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1469 } |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1470 |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1471 part = part->next; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1472 header = part->elts; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1473 i = 0; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1474 } |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1475 |
8542
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1476 if (header[i].hash == 0) { |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1477 continue; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1478 } |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1479 |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1480 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
8614
8fc9c7f2c533
HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents:
8613
diff
changeset
|
1481 "http3 output trailer: \"%V: %V\"", |
8542
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1482 &header[i].key, &header[i].value); |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1483 |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1484 b->last = (u_char *) ngx_http_v3_encode_field_l(b->last, |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1485 &header[i].key, |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1486 &header[i].value); |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1487 } |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1488 |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1489 n = b->last - b->pos; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1490 |
8643
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1491 h3c->payload_bytes += n; |
72b304f6207c
HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents:
8630
diff
changeset
|
1492 |
8542
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1493 hl = ngx_chain_get_free_buf(r->pool, &ctx->free); |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1494 if (hl == NULL) { |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1495 return NULL; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1496 } |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1497 |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1498 b = hl->buf; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1499 p = b->start; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1500 |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1501 if (p == NULL) { |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1502 p = ngx_palloc(r->pool, NGX_HTTP_V3_VARLEN_INT_LEN * 2); |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1503 if (p == NULL) { |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1504 return NULL; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1505 } |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1506 |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1507 b->start = p; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1508 b->end = p + NGX_HTTP_V3_VARLEN_INT_LEN * 2; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1509 } |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1510 |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1511 b->tag = (ngx_buf_tag_t) &ngx_http_v3_filter_module; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1512 b->memory = 0; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1513 b->temporary = 1; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1514 b->pos = p; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1515 |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1516 b->last = (u_char *) ngx_http_v3_encode_varlen_int(p, |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1517 NGX_HTTP_V3_FRAME_HEADERS); |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1518 b->last = (u_char *) ngx_http_v3_encode_varlen_int(b->last, n); |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1519 |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1520 hl->next = cl; |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1521 |
8e8cdb7bfb17
HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents:
8508
diff
changeset
|
1522 return hl; |
8237
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1523 } |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1524 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1525 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1526 static ngx_int_t |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1527 ngx_http_v3_filter_init(ngx_conf_t *cf) |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1528 { |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1529 ngx_http_next_header_filter = ngx_http_top_header_filter; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1530 ngx_http_top_header_filter = ngx_http_v3_header_filter; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1531 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1532 ngx_http_next_body_filter = ngx_http_top_body_filter; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1533 ngx_http_top_body_filter = ngx_http_v3_body_filter; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1534 |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1535 return NGX_OK; |
1efee5e4194c
HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff
changeset
|
1536 } |