annotate src/http/v3/ngx_http_v3_filter_module.c @ 9208:2ed3f57dca0a

QUIC: fixed unsent MTU probe acknowledgement. Previously if an MTU probe send failed early in ngx_quic_frame_sendto() due to allocation error or congestion control, the application level packet number was not increased, but was still saved as MTU probe packet number. Later when a packet with this number was acknowledged, the unsent MTU probe was acknowledged as well. This could result in discovering a bigger MTU than supported by the path, which could lead to EMSGSIZE (Message too long) errors while sending further packets. The problem existed since PMTUD was introduced in 58afcd72446f (1.25.2). Back then only the unlikely memory allocation error could trigger it. However in efcdaa66df2e congestion control was added to ngx_quic_frame_sendto() which can now trigger the issue with a higher probability.
author Roman Arutyunyan <arut@nginx.com>
date Wed, 14 Feb 2024 16:56:28 +0400
parents f91dc350be9f
children 23f109f0facc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8653
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_body_filter(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 *in);
8817
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
41 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: 8807
diff changeset
42 ngx_http_v3_filter_ctx_t *ctx);
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
43 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
44
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
45
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
46 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
47 NULL, /* preconfiguration */
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
48 ngx_http_v3_filter_init, /* postconfiguration */
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
49
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
50 NULL, /* create main configuration */
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
51 NULL, /* init main configuration */
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
52
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
53 NULL, /* create server configuration */
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
54 NULL, /* merge server configuration */
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 NULL, /* create location configuration */
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
57 NULL /* merge location configuration */
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
58 };
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
59
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 ngx_module_t ngx_http_v3_filter_module = {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
62 NGX_MODULE_V1,
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
63 &ngx_http_v3_filter_module_ctx, /* module context */
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
64 NULL, /* module directives */
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
65 NGX_HTTP_MODULE, /* module type */
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
66 NULL, /* init master */
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
67 NULL, /* init module */
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
68 NULL, /* init process */
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
69 NULL, /* init thread */
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
70 NULL, /* exit thread */
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
71 NULL, /* exit process */
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
72 NULL, /* exit master */
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
73 NGX_MODULE_V1_PADDING
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
74 };
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
75
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
76
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
77 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
78 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
79
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
80
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
81 static ngx_int_t
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
82 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
83 {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
84 u_char *p;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
85 size_t len, n;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
86 ngx_buf_t *b;
8851
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
87 ngx_str_t host, location;
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
88 ngx_uint_t i, port;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
89 ngx_chain_t *out, *hl, *cl, **ll;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
90 ngx_list_part_t *part;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
91 ngx_table_elt_t *header;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
92 ngx_connection_t *c;
8881
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
93 ngx_http_v3_session_t *h3c;
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
94 ngx_http_v3_filter_ctx_t *ctx;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
95 ngx_http_core_loc_conf_t *clcf;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
96 ngx_http_core_srv_conf_t *cscf;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
97 u_char addr[NGX_SOCKADDR_STRLEN];
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
98
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
99 if (r->http_version != NGX_HTTP_VERSION_30) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
100 return ngx_http_next_header_filter(r);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
101 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
102
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
103 if (r->header_sent) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
104 return NGX_OK;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
105 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
106
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
107 r->header_sent = 1;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
108
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
109 if (r != r->main) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
110 return NGX_OK;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
111 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
112
8881
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
113 h3c = ngx_http_v3_get_session(r->connection);
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
114
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
115 if (r->method == NGX_HTTP_HEAD) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
116 r->header_only = 1;
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
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
119 if (r->headers_out.last_modified_time != -1) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
120 if (r->headers_out.status != NGX_HTTP_OK
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
121 && r->headers_out.status != NGX_HTTP_PARTIAL_CONTENT
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
122 && r->headers_out.status != NGX_HTTP_NOT_MODIFIED)
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
123 {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
124 r->headers_out.last_modified_time = -1;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
125 r->headers_out.last_modified = NULL;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
126 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
127 }
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 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
130 r->header_only = 1;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
131 ngx_str_null(&r->headers_out.content_type);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
132 r->headers_out.last_modified_time = -1;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
133 r->headers_out.last_modified = NULL;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
134 r->headers_out.content_length = NULL;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
135 r->headers_out.content_length_n = -1;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
136 }
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 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
139 r->header_only = 1;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
140 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
141
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
142 c = r->connection;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
143
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
144 out = NULL;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
145 ll = &out;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
146
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
147 len = ngx_http_v3_encode_field_section_prefix(NULL, 0, 0, 0);
8653
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_OK) {
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
150 len += ngx_http_v3_encode_field_ri(NULL, 0,
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
151 NGX_HTTP_V3_HEADER_STATUS_200);
8653
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 } else {
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
154 len += ngx_http_v3_encode_field_lri(NULL, 0,
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
155 NGX_HTTP_V3_HEADER_STATUS_200,
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
156 NULL, 3);
8653
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
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
159 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
160
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
161 if (r->headers_out.server == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
162 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
163 n = sizeof(NGINX_VER) - 1;
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 } 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
166 n = sizeof(NGINX_VER_BUILD) - 1;
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 } else {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
169 n = sizeof("nginx") - 1;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
170 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
171
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
172 len += ngx_http_v3_encode_field_lri(NULL, 0,
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
173 NGX_HTTP_V3_HEADER_SERVER,
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
174 NULL, n);
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
175 }
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 if (r->headers_out.date == NULL) {
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
178 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: 8796
diff changeset
179 NULL, ngx_cached_http_time.len);
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
180 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
181
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
182 if (r->headers_out.content_type.len) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
183 n = r->headers_out.content_type.len;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
184
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
185 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
186 && r->headers_out.charset.len)
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
187 {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
188 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
189 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
190
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
191 len += ngx_http_v3_encode_field_lri(NULL, 0,
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
192 NGX_HTTP_V3_HEADER_CONTENT_TYPE_TEXT_PLAIN,
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
193 NULL, n);
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.content_length == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
197 if (r->headers_out.content_length_n > 0) {
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
198 len += ngx_http_v3_encode_field_lri(NULL, 0,
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
199 NGX_HTTP_V3_HEADER_CONTENT_LENGTH_ZERO,
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
200 NULL, NGX_OFF_T_LEN);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
201
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
202 } else if (r->headers_out.content_length_n == 0) {
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
203 len += ngx_http_v3_encode_field_ri(NULL, 0,
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
204 NGX_HTTP_V3_HEADER_CONTENT_LENGTH_ZERO);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
205 }
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
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
208 if (r->headers_out.last_modified == NULL
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
209 && r->headers_out.last_modified_time != -1)
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
210 {
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
211 len += ngx_http_v3_encode_field_lri(NULL, 0,
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
212 NGX_HTTP_V3_HEADER_LAST_MODIFIED, NULL,
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
213 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
214 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
215
8851
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
216 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: 8850
diff changeset
217
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
218 if (r->headers_out.location->value.data[0] == '/'
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
219 && clcf->absolute_redirect)
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
220 {
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
221 if (clcf->server_name_in_redirect) {
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
222 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: 8850
diff changeset
223 host = cscf->server_name;
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
224
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
225 } else if (r->headers_in.server.len) {
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
226 host = r->headers_in.server;
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
227
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
228 } else {
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
229 host.len = NGX_SOCKADDR_STRLEN;
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
230 host.data = addr;
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
231
8851
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
232 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: 8850
diff changeset
233 return NGX_ERROR;
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
234 }
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
235 }
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
236
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
237 port = ngx_inet_get_port(c->local_sockaddr);
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
238
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
239 location.len = sizeof("https://") - 1 + host.len
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
240 + r->headers_out.location->value.len;
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
241
8851
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
242 if (clcf->port_in_redirect) {
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
243 port = (port == 443) ? 0 : port;
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
244
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
245 } else {
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
246 port = 0;
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
247 }
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
248
8851
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
249 if (port) {
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
250 location.len += sizeof(":65535") - 1;
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
251 }
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
252
8851
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
253 location.data = ngx_pnalloc(r->pool, location.len);
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
254 if (location.data == NULL) {
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
255 return NGX_ERROR;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
256 }
8851
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
257
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
258 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: 8850
diff changeset
259 p = ngx_cpymem(p, host.data, host.len);
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
260
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
261 if (port) {
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
262 p = ngx_sprintf(p, ":%ui", port);
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
263 }
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
264
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
265 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: 8850
diff changeset
266 r->headers_out.location->value.len);
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
267
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
268 /* 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: 8850
diff changeset
269
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
270 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: 8850
diff changeset
271 r->headers_out.location->value.data = location.data;
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
272 ngx_str_set(&r->headers_out.location->key, "Location");
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
273 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
274
8851
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
275 r->headers_out.location->hash = 0;
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
276
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
277 len += ngx_http_v3_encode_field_lri(NULL, 0,
8851
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
278 NGX_HTTP_V3_HEADER_LOCATION, NULL,
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
279 r->headers_out.location->value.len);
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
280 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
281
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
282 #if (NGX_HTTP_GZIP)
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
283 if (r->gzip_vary) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
284 if (clcf->gzip_vary) {
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
285 len += ngx_http_v3_encode_field_ri(NULL, 0,
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
286 NGX_HTTP_V3_HEADER_VARY_ACCEPT_ENCODING);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
287
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
288 } else {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
289 r->gzip_vary = 0;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
290 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
291 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
292 #endif
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
293
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
294 part = &r->headers_out.headers.part;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
295 header = part->elts;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
296
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
297 for (i = 0; /* void */; i++) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
298
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
299 if (i >= part->nelts) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
300 if (part->next == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
301 break;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
302 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
303
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
304 part = part->next;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
305 header = part->elts;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
306 i = 0;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
307 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
308
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
309 if (header[i].hash == 0) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
310 continue;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
311 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
312
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
313 len += ngx_http_v3_encode_field_l(NULL, &header[i].key,
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
314 &header[i].value);
8653
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
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
317 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
318
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
319 b = ngx_create_temp_buf(r->pool, len);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
320 if (b == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
321 return NGX_ERROR;
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
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
324 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: 8796
diff changeset
325 0, 0, 0);
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
326
8852
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
327 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: 8851
diff changeset
328 "http3 output header: \":status: %03ui\"",
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
329 r->headers_out.status);
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
330
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
331 if (r->headers_out.status == NGX_HTTP_OK) {
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
332 b->last = (u_char *) ngx_http_v3_encode_field_ri(b->last, 0,
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
333 NGX_HTTP_V3_HEADER_STATUS_200);
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 } else {
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
336 b->last = (u_char *) ngx_http_v3_encode_field_lri(b->last, 0,
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
337 NGX_HTTP_V3_HEADER_STATUS_200,
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
338 NULL, 3);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
339 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
340 }
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 if (r->headers_out.server == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
343 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
344 p = (u_char *) NGINX_VER;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
345 n = sizeof(NGINX_VER) - 1;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
346
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
347 } 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
348 p = (u_char *) NGINX_VER_BUILD;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
349 n = sizeof(NGINX_VER_BUILD) - 1;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
350
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
351 } else {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
352 p = (u_char *) "nginx";
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
353 n = sizeof("nginx") - 1;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
354 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
355
8852
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
356 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: 8851
diff changeset
357 "http3 output header: \"server: %*s\"", n, p);
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
358
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
359 b->last = (u_char *) ngx_http_v3_encode_field_lri(b->last, 0,
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
360 NGX_HTTP_V3_HEADER_SERVER,
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
361 p, n);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
362 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
363
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
364 if (r->headers_out.date == NULL) {
8852
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
365 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: 8851
diff changeset
366 "http3 output header: \"date: %V\"",
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
367 &ngx_cached_http_time);
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
368
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
369 b->last = (u_char *) ngx_http_v3_encode_field_lri(b->last, 0,
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
370 NGX_HTTP_V3_HEADER_DATE,
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
371 ngx_cached_http_time.data,
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
372 ngx_cached_http_time.len);
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
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
375 if (r->headers_out.content_type.len) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
376 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
377 && r->headers_out.charset.len)
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
378 {
8849
2cb697e7d77f HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8818
diff changeset
379 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: 8818
diff changeset
380 + r->headers_out.charset.len;
2cb697e7d77f HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8818
diff changeset
381
2cb697e7d77f HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8818
diff changeset
382 p = ngx_pnalloc(r->pool, n);
2cb697e7d77f HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8818
diff changeset
383 if (p == NULL) {
2cb697e7d77f HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8818
diff changeset
384 return NGX_ERROR;
2cb697e7d77f HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8818
diff changeset
385 }
2cb697e7d77f HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8818
diff changeset
386
2cb697e7d77f HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8818
diff changeset
387 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: 8818
diff changeset
388 r->headers_out.content_type.len);
2cb697e7d77f HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8818
diff changeset
389
2cb697e7d77f HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8818
diff changeset
390 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: 8818
diff changeset
391
2cb697e7d77f HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8818
diff changeset
392 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: 8818
diff changeset
393 r->headers_out.charset.len);
2cb697e7d77f HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8818
diff changeset
394
2cb697e7d77f HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8818
diff changeset
395 /* 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: 8818
diff changeset
396
2cb697e7d77f HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8818
diff changeset
397 r->headers_out.content_type.len = n;
2cb697e7d77f HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8818
diff changeset
398 r->headers_out.content_type.data = p - n;
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
399 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
400
8852
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
401 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: 8851
diff changeset
402 "http3 output header: \"content-type: %V\"",
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
403 &r->headers_out.content_type);
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
404
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
405 b->last = (u_char *) ngx_http_v3_encode_field_lri(b->last, 0,
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
406 NGX_HTTP_V3_HEADER_CONTENT_TYPE_TEXT_PLAIN,
8849
2cb697e7d77f HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8818
diff changeset
407 r->headers_out.content_type.data,
2cb697e7d77f HTTP/3: Huffman encoding for the Content-Type response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8818
diff changeset
408 r->headers_out.content_type.len);
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
409 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
410
8852
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
411 if (r->headers_out.content_length == NULL
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
412 && r->headers_out.content_length_n >= 0)
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
413 {
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
414 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: 8851
diff changeset
415 "http3 output header: \"content-length: %O\"",
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
416 r->headers_out.content_length_n);
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
417
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
418 if (r->headers_out.content_length_n > 0) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
419 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
420 n = p - b->last;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
421
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
422 b->last = (u_char *) ngx_http_v3_encode_field_lri(b->last, 0,
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
423 NGX_HTTP_V3_HEADER_CONTENT_LENGTH_ZERO,
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
424 NULL, n);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
425
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
426 b->last = ngx_sprintf(b->last, "%O",
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
427 r->headers_out.content_length_n);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
428
8852
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
429 } else {
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
430 b->last = (u_char *) ngx_http_v3_encode_field_ri(b->last, 0,
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
431 NGX_HTTP_V3_HEADER_CONTENT_LENGTH_ZERO);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
432 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
433 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
434
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
435 if (r->headers_out.last_modified == NULL
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
436 && r->headers_out.last_modified_time != -1)
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
437 {
8850
355461f0cc3b HTTP/3: Huffman encoding for the Last-Modified response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8849
diff changeset
438 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: 8849
diff changeset
439
355461f0cc3b HTTP/3: Huffman encoding for the Last-Modified response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8849
diff changeset
440 p = ngx_pnalloc(r->pool, n);
355461f0cc3b HTTP/3: Huffman encoding for the Last-Modified response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8849
diff changeset
441 if (p == NULL) {
355461f0cc3b HTTP/3: Huffman encoding for the Last-Modified response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8849
diff changeset
442 return NGX_ERROR;
355461f0cc3b HTTP/3: Huffman encoding for the Last-Modified response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8849
diff changeset
443 }
355461f0cc3b HTTP/3: Huffman encoding for the Last-Modified response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8849
diff changeset
444
355461f0cc3b HTTP/3: Huffman encoding for the Last-Modified response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8849
diff changeset
445 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: 8849
diff changeset
446
8852
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
447 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: 8851
diff changeset
448 "http3 output header: \"last-modified: %*s\"", n, p);
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
449
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
450 b->last = (u_char *) ngx_http_v3_encode_field_lri(b->last, 0,
8850
355461f0cc3b HTTP/3: Huffman encoding for the Last-Modified response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8849
diff changeset
451 NGX_HTTP_V3_HEADER_LAST_MODIFIED,
355461f0cc3b HTTP/3: Huffman encoding for the Last-Modified response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8849
diff changeset
452 p, n);
8653
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
8851
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
455 if (r->headers_out.location && r->headers_out.location->value.len) {
8852
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
456 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: 8851
diff changeset
457 "http3 output header: \"location: %V\"",
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
458 &r->headers_out.location->value);
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
459
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
460 b->last = (u_char *) ngx_http_v3_encode_field_lri(b->last, 0,
8851
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
461 NGX_HTTP_V3_HEADER_LOCATION,
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
462 r->headers_out.location->value.data,
051968b73c59 HTTP/3: Huffman encoding for the Location response field.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8850
diff changeset
463 r->headers_out.location->value.len);
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
464 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
465
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
466 #if (NGX_HTTP_GZIP)
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
467 if (r->gzip_vary) {
8852
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
468 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: 8851
diff changeset
469 "http3 output header: \"vary: Accept-Encoding\"");
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
470
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
471 b->last = (u_char *) ngx_http_v3_encode_field_ri(b->last, 0,
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
472 NGX_HTTP_V3_HEADER_VARY_ACCEPT_ENCODING);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
473 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
474 #endif
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
475
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
476 part = &r->headers_out.headers.part;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
477 header = part->elts;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
478
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
479 for (i = 0; /* void */; i++) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
480
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
481 if (i >= part->nelts) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
482 if (part->next == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
483 break;
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
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
486 part = part->next;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
487 header = part->elts;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
488 i = 0;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
489 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
490
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
491 if (header[i].hash == 0) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
492 continue;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
493 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
494
8852
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
495 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: 8851
diff changeset
496 "http3 output header: \"%V: %V\"",
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
497 &header[i].key, &header[i].value);
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
498
8807
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
499 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: 8796
diff changeset
500 &header[i].key,
0ac25efb2da3 HTTP/3: quic-qpack term updates.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8796
diff changeset
501 &header[i].value);
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
502 }
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 if (r->header_only) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
505 b->last_buf = 1;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
506 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
507
8818
07f90cb79fec HTTP/3: use request pool instead of connection pool.
Roman Arutyunyan <arut@nginx.com>
parents: 8817
diff changeset
508 cl = ngx_alloc_chain_link(r->pool);
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
509 if (cl == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
510 return NGX_ERROR;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
511 }
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 cl->buf = b;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
514 cl->next = NULL;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
515
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
516 n = b->last - b->pos;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
517
8881
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
518 h3c->payload_bytes += n;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
519
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
520 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
521 + ngx_http_v3_encode_varlen_int(NULL, n);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
522
8818
07f90cb79fec HTTP/3: use request pool instead of connection pool.
Roman Arutyunyan <arut@nginx.com>
parents: 8817
diff changeset
523 b = ngx_create_temp_buf(r->pool, len);
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
524 if (b == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
525 return NGX_ERROR;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
526 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
527
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
528 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
529 NGX_HTTP_V3_FRAME_HEADERS);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
530 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
531
8818
07f90cb79fec HTTP/3: use request pool instead of connection pool.
Roman Arutyunyan <arut@nginx.com>
parents: 8817
diff changeset
532 hl = ngx_alloc_chain_link(r->pool);
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
533 if (hl == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
534 return NGX_ERROR;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
535 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
536
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
537 hl->buf = b;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
538 hl->next = cl;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
539
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
540 *ll = hl;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
541 ll = &cl->next;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
542
8817
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
543 if (r->headers_out.content_length_n >= 0
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
544 && !r->header_only && !r->expect_trailers)
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
545 {
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
546 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
547 + ngx_http_v3_encode_varlen_int(NULL,
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
548 r->headers_out.content_length_n);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
549
8818
07f90cb79fec HTTP/3: use request pool instead of connection pool.
Roman Arutyunyan <arut@nginx.com>
parents: 8817
diff changeset
550 b = ngx_create_temp_buf(r->pool, len);
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
551 if (b == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
552 return NGX_ERROR;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
553 }
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 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
556 NGX_HTTP_V3_FRAME_DATA);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
557 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
558 r->headers_out.content_length_n);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
559
8881
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
560 h3c->payload_bytes += r->headers_out.content_length_n;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
561 h3c->total_bytes += r->headers_out.content_length_n;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
562
8818
07f90cb79fec HTTP/3: use request pool instead of connection pool.
Roman Arutyunyan <arut@nginx.com>
parents: 8817
diff changeset
563 cl = ngx_alloc_chain_link(r->pool);
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
564 if (cl == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
565 return NGX_ERROR;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
566 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
567
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
568 cl->buf = b;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
569 cl->next = NULL;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
570
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
571 *ll = cl;
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 } else {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
574 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
575 if (ctx == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
576 return NGX_ERROR;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
577 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
578
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
579 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
580 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
581
8881
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
582 for (cl = out; cl; cl = cl->next) {
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
583 h3c->total_bytes += cl->buf->last - cl->buf->pos;
9133
f91dc350be9f HTTP/3: fixed $body_bytes_sent.
Sergey Kandaurov <pluknet@nginx.com>
parents: 9108
diff changeset
584 r->header_size += cl->buf->last - cl->buf->pos;
8881
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
585 }
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
586
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
587 return ngx_http_write_filter(r, out);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
588 }
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
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
591 static ngx_int_t
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
592 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
593 {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
594 u_char *chunk;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
595 off_t size;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
596 ngx_int_t rc;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
597 ngx_buf_t *b;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
598 ngx_chain_t *out, *cl, *tl, **ll;
8881
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
599 ngx_http_v3_session_t *h3c;
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
600 ngx_http_v3_filter_ctx_t *ctx;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
601
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
602 if (in == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
603 return ngx_http_next_body_filter(r, in);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
604 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
605
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
606 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
607 if (ctx == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
608 return ngx_http_next_body_filter(r, in);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
609 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
610
8881
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
611 h3c = ngx_http_v3_get_session(r->connection);
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
612
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
613 out = NULL;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
614 ll = &out;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
615
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
616 size = 0;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
617 cl = in;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
618
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
619 for ( ;; ) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
620 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
621 "http3 chunk: %O", ngx_buf_size(cl->buf));
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
622
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
623 size += ngx_buf_size(cl->buf);
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 if (cl->buf->flush
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
626 || cl->buf->sync
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
627 || ngx_buf_in_memory(cl->buf)
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
628 || cl->buf->in_file)
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 tl = ngx_alloc_chain_link(r->pool);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
631 if (tl == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
632 return NGX_ERROR;
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 tl->buf = cl->buf;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
636 *ll = tl;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
637 ll = &tl->next;
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
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
640 if (cl->next == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
641 break;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
642 }
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 cl = cl->next;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
645 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
646
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
647 if (size) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
648 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
649 if (tl == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
650 return NGX_ERROR;
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 b = tl->buf;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
654 chunk = b->start;
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 if (chunk == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
657 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
658 if (chunk == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
659 return NGX_ERROR;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
660 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
661
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
662 b->start = chunk;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
663 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
664 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
665
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
666 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
667 b->memory = 0;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
668 b->temporary = 1;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
669 b->pos = chunk;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
670
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
671 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
672 NGX_HTTP_V3_FRAME_DATA);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
673 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
674
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
675 tl->next = out;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
676 out = tl;
8881
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
677
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
678 h3c->payload_bytes += size;
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
679 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
680
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
681 if (cl->buf->last_buf) {
8817
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
682 tl = ngx_http_v3_create_trailers(r, ctx);
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
683 if (tl == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
684 return NGX_ERROR;
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
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
687 cl->buf->last_buf = 0;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
688
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
689 *ll = tl;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
690
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
691 } else {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
692 *ll = NULL;
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
8881
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
695 for (cl = out; cl; cl = cl->next) {
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
696 h3c->total_bytes += cl->buf->last - cl->buf->pos;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
697 }
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
698
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
699 rc = ngx_http_next_body_filter(r, out);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
700
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
701 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
702 (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
703
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
704 return rc;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
705 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
706
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 static ngx_chain_t *
8817
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
709 ngx_http_v3_create_trailers(ngx_http_request_t *r,
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
710 ngx_http_v3_filter_ctx_t *ctx)
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
711 {
8881
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
712 size_t len, n;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
713 u_char *p;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
714 ngx_buf_t *b;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
715 ngx_uint_t i;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
716 ngx_chain_t *cl, *hl;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
717 ngx_list_part_t *part;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
718 ngx_table_elt_t *header;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
719 ngx_http_v3_session_t *h3c;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
720
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
721 h3c = ngx_http_v3_get_session(r->connection);
8817
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
722
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
723 len = 0;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
724
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
725 part = &r->headers_out.trailers.part;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
726 header = part->elts;
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
727
8817
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
728 for (i = 0; /* void */; i++) {
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
729
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
730 if (i >= part->nelts) {
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
731 if (part->next == NULL) {
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
732 break;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
733 }
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
734
8817
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
735 part = part->next;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
736 header = part->elts;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
737 i = 0;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
738 }
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
739
8817
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
740 if (header[i].hash == 0) {
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
741 continue;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
742 }
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
743
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
744 len += ngx_http_v3_encode_field_l(NULL, &header[i].key,
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
745 &header[i].value);
8653
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
8817
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
748 cl = ngx_chain_get_free_buf(r->pool, &ctx->free);
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
749 if (cl == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
750 return NULL;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
751 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
752
8817
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
753 b = cl->buf;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
754
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
755 b->tag = (ngx_buf_tag_t) &ngx_http_v3_filter_module;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
756 b->memory = 0;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
757 b->last_buf = 1;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
758
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
759 if (len == 0) {
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
760 b->temporary = 0;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
761 b->pos = b->last = NULL;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
762 return cl;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
763 }
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
764
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
765 b->temporary = 1;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
766
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
767 len += ngx_http_v3_encode_field_section_prefix(NULL, 0, 0, 0);
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
768
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
769 b->pos = ngx_palloc(r->pool, len);
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
770 if (b->pos == NULL) {
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
771 return NULL;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
772 }
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
773
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
774 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: 8807
diff changeset
775 0, 0, 0);
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
776
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
777 part = &r->headers_out.trailers.part;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
778 header = part->elts;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
779
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
780 for (i = 0; /* void */; i++) {
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
781
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
782 if (i >= part->nelts) {
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
783 if (part->next == NULL) {
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
784 break;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
785 }
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
786
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
787 part = part->next;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
788 header = part->elts;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
789 i = 0;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
790 }
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
791
8817
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
792 if (header[i].hash == 0) {
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
793 continue;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
794 }
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
795
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
796 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
8852
8fc9c7f2c533 HTTP/3: added debug logging of response fields.
Sergey Kandaurov <pluknet@nginx.com>
parents: 8851
diff changeset
797 "http3 output trailer: \"%V: %V\"",
8817
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
798 &header[i].key, &header[i].value);
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
799
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
800 b->last = (u_char *) ngx_http_v3_encode_field_l(b->last,
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
801 &header[i].key,
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
802 &header[i].value);
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
803 }
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
804
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
805 n = b->last - b->pos;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
806
8881
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
807 h3c->payload_bytes += n;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
808
8817
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
809 hl = ngx_chain_get_free_buf(r->pool, &ctx->free);
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
810 if (hl == NULL) {
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
811 return NULL;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
812 }
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
813
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
814 b = hl->buf;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
815 p = b->start;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
816
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
817 if (p == NULL) {
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
818 p = ngx_palloc(r->pool, NGX_HTTP_V3_VARLEN_INT_LEN * 2);
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
819 if (p == NULL) {
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
820 return NULL;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
821 }
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
822
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
823 b->start = p;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
824 b->end = p + NGX_HTTP_V3_VARLEN_INT_LEN * 2;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
825 }
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
826
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
827 b->tag = (ngx_buf_tag_t) &ngx_http_v3_filter_module;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
828 b->memory = 0;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
829 b->temporary = 1;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
830 b->pos = p;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
831
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
832 b->last = (u_char *) ngx_http_v3_encode_varlen_int(p,
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
833 NGX_HTTP_V3_FRAME_HEADERS);
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
834 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: 8807
diff changeset
835
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
836 hl->next = cl;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
837
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
838 return hl;
8653
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
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
841
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
842 static ngx_int_t
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
843 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
844 {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
845 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
846 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
847
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
848 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
849 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
850
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
851 return NGX_OK;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
852 }