annotate src/http/v3/ngx_http_v3_filter_module.c @ 9108:f742b1b46901 quic

HTTP/3: removed server push support.
author Roman Arutyunyan <arut@nginx.com>
date Fri, 12 May 2023 10:02:10 +0400
parents 8d0753760546
children f91dc350be9f
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;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
584 }
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
585
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
586 return ngx_http_write_filter(r, out);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
587 }
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 static ngx_int_t
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
591 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
592 {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
593 u_char *chunk;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
594 off_t size;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
595 ngx_int_t rc;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
596 ngx_buf_t *b;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
597 ngx_chain_t *out, *cl, *tl, **ll;
8881
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
598 ngx_http_v3_session_t *h3c;
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
599 ngx_http_v3_filter_ctx_t *ctx;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
600
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
601 if (in == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
602 return ngx_http_next_body_filter(r, in);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
603 }
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 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
606 if (ctx == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
607 return ngx_http_next_body_filter(r, in);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
608 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
609
8881
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
610 h3c = ngx_http_v3_get_session(r->connection);
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
611
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
612 out = NULL;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
613 ll = &out;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
614
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
615 size = 0;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
616 cl = in;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
617
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
618 for ( ;; ) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
619 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
620 "http3 chunk: %O", ngx_buf_size(cl->buf));
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
621
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
622 size += ngx_buf_size(cl->buf);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
623
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
624 if (cl->buf->flush
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
625 || cl->buf->sync
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
626 || ngx_buf_in_memory(cl->buf)
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
627 || cl->buf->in_file)
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
628 {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
629 tl = ngx_alloc_chain_link(r->pool);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
630 if (tl == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
631 return NGX_ERROR;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
632 }
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 tl->buf = cl->buf;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
635 *ll = tl;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
636 ll = &tl->next;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
637 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
638
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
639 if (cl->next == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
640 break;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
641 }
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 cl = cl->next;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
644 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
645
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
646 if (size) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
647 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
648 if (tl == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
649 return NGX_ERROR;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
650 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
651
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
652 b = tl->buf;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
653 chunk = b->start;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
654
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
655 if (chunk == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
656 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
657 if (chunk == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
658 return NGX_ERROR;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
659 }
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 b->start = chunk;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
662 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
663 }
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 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
666 b->memory = 0;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
667 b->temporary = 1;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
668 b->pos = chunk;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
669
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
670 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
671 NGX_HTTP_V3_FRAME_DATA);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
672 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
673
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
674 tl->next = out;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
675 out = tl;
8881
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
676
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
677 h3c->payload_bytes += size;
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
678 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
679
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
680 if (cl->buf->last_buf) {
8817
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
681 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
682 if (tl == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
683 return NGX_ERROR;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
684 }
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 cl->buf->last_buf = 0;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
687
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
688 *ll = tl;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
689
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
690 } else {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
691 *ll = NULL;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
692 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
693
8881
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
694 for (cl = out; cl; cl = cl->next) {
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
695 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
696 }
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
697
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
698 rc = ngx_http_next_body_filter(r, out);
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
699
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
700 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
701 (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
702
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
703 return rc;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
704 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
705
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 static ngx_chain_t *
8817
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
708 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
709 ngx_http_v3_filter_ctx_t *ctx)
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
710 {
8881
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
711 size_t len, n;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
712 u_char *p;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
713 ngx_buf_t *b;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
714 ngx_uint_t i;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
715 ngx_chain_t *cl, *hl;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
716 ngx_list_part_t *part;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
717 ngx_table_elt_t *header;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
718 ngx_http_v3_session_t *h3c;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
719
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
720 h3c = ngx_http_v3_get_session(r->connection);
8817
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
721
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
722 len = 0;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
723
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
724 part = &r->headers_out.trailers.part;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
725 header = part->elts;
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
726
8817
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
727 for (i = 0; /* void */; i++) {
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
728
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
729 if (i >= part->nelts) {
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
730 if (part->next == NULL) {
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
731 break;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
732 }
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
733
8817
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
734 part = part->next;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
735 header = part->elts;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
736 i = 0;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
737 }
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
738
8817
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
739 if (header[i].hash == 0) {
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
740 continue;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
741 }
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 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
744 &header[i].value);
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
745 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
746
8817
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
747 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
748 if (cl == NULL) {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
749 return NULL;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
750 }
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
751
8817
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
752 b = cl->buf;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
753
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
754 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
755 b->memory = 0;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
756 b->last_buf = 1;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
757
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
758 if (len == 0) {
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
759 b->temporary = 0;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
760 b->pos = b->last = NULL;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
761 return cl;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
762 }
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 b->temporary = 1;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
765
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
766 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
767
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
768 b->pos = ngx_palloc(r->pool, len);
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
769 if (b->pos == NULL) {
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
770 return NULL;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
771 }
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 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
774 0, 0, 0);
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
775
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
776 part = &r->headers_out.trailers.part;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
777 header = part->elts;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
778
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
779 for (i = 0; /* void */; i++) {
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
780
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
781 if (i >= part->nelts) {
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
782 if (part->next == NULL) {
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
783 break;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
784 }
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 part = part->next;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
787 header = part->elts;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
788 i = 0;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
789 }
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
790
8817
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
791 if (header[i].hash == 0) {
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
792 continue;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
793 }
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 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
796 "http3 output trailer: \"%V: %V\"",
8817
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
797 &header[i].key, &header[i].value);
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
798
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
799 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
800 &header[i].key,
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
801 &header[i].value);
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
802 }
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 n = b->last - b->pos;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
805
8881
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
806 h3c->payload_bytes += n;
72b304f6207c HTTP/3: traffic-based flood detection.
Roman Arutyunyan <arut@nginx.com>
parents: 8868
diff changeset
807
8817
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
808 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
809 if (hl == NULL) {
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
810 return NULL;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
811 }
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 b = hl->buf;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
814 p = b->start;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
815
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
816 if (p == NULL) {
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
817 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
818 if (p == NULL) {
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
819 return NULL;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
820 }
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 b->start = p;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
823 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
824 }
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 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
827 b->memory = 0;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
828 b->temporary = 1;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
829 b->pos = p;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
830
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
831 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
832 NGX_HTTP_V3_FRAME_HEADERS);
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
833 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
834
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
835 hl->next = cl;
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
836
8e8cdb7bfb17 HTTP/3: response trailers support.
Roman Arutyunyan <arut@nginx.com>
parents: 8807
diff changeset
837 return hl;
8653
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
838 }
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 static ngx_int_t
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
842 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
843 {
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
844 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
845 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
846
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
847 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
848 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
849
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
850 return NGX_OK;
1efee5e4194c HTTP/3: introduced ngx_http_v3_filter.
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
851 }