annotate src/http/modules/ngx_http_grpc_module.c @ 7728:485dba3e2a01

Core: ngx_conf_set_keyval_slot() now accepts NGX_CONF_UNSET_PTR. With this change, it is now possible to use ngx_conf_merge_ptr_value() to merge keyval arrays. This change actually follows much earlier changes in ngx_conf_merge_ptr_value() and ngx_conf_set_str_array_slot() in 1452:cd586e963db0 (0.6.10) and 1701:40d004d95d88 (0.6.22). To preserve compatibility with existing 3rd party modules, both NULL and NGX_CONF_UNSET_PTR are accepted for now.
author Maxim Dounin <mdounin@mdounin.ru>
date Thu, 22 Oct 2020 18:00:20 +0300
parents 39501ce97e29
children 1a719ee45526
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3 * Copyright (C) Maxim Dounin
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4 * Copyright (C) Nginx, Inc.
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
5 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
6
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
7
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
8 #include <ngx_config.h>
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
9 #include <ngx_core.h>
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
10 #include <ngx_http.h>
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
11
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
12
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
13 typedef struct {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
14 ngx_array_t *flushes;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
15 ngx_array_t *lengths;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
16 ngx_array_t *values;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
17 ngx_hash_t hash;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
18 } ngx_http_grpc_headers_t;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
19
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
20
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
21 typedef struct {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
22 ngx_http_upstream_conf_t upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
23
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
24 ngx_http_grpc_headers_t headers;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
25 ngx_array_t *headers_source;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
26
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
27 ngx_str_t host;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
28 ngx_uint_t host_set;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
29
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
30 ngx_array_t *grpc_lengths;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
31 ngx_array_t *grpc_values;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
32
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
33 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
34 ngx_uint_t ssl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
35 ngx_uint_t ssl_protocols;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
36 ngx_str_t ssl_ciphers;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
37 ngx_uint_t ssl_verify_depth;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
38 ngx_str_t ssl_trusted_certificate;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
39 ngx_str_t ssl_crl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
40 ngx_str_t ssl_certificate;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
41 ngx_str_t ssl_certificate_key;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
42 ngx_array_t *ssl_passwords;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
43 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
44 } ngx_http_grpc_loc_conf_t;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
45
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
46
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
47 typedef enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
48 ngx_http_grpc_st_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
49 ngx_http_grpc_st_length_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
50 ngx_http_grpc_st_length_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
51 ngx_http_grpc_st_type,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
52 ngx_http_grpc_st_flags,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
53 ngx_http_grpc_st_stream_id,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
54 ngx_http_grpc_st_stream_id_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
55 ngx_http_grpc_st_stream_id_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
56 ngx_http_grpc_st_stream_id_4,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
57 ngx_http_grpc_st_payload,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
58 ngx_http_grpc_st_padding
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
59 } ngx_http_grpc_state_e;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
60
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
61
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
62 typedef struct {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
63 size_t init_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
64 size_t send_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
65 size_t recv_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
66 ngx_uint_t last_stream_id;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
67 } ngx_http_grpc_conn_t;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
68
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
69
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
70 typedef struct {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
71 ngx_http_grpc_state_e state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
72 ngx_uint_t frame_state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
73 ngx_uint_t fragment_state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
74
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
75 ngx_chain_t *in;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
76 ngx_chain_t *out;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
77 ngx_chain_t *free;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
78 ngx_chain_t *busy;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
79
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
80 ngx_http_grpc_conn_t *connection;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
81
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
82 ngx_uint_t id;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
83
7379
57463f4e2fcd gRPC: limited allocations due to ping and settings frames.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7371
diff changeset
84 ngx_uint_t pings;
57463f4e2fcd gRPC: limited allocations due to ping and settings frames.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7371
diff changeset
85 ngx_uint_t settings;
57463f4e2fcd gRPC: limited allocations due to ping and settings frames.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7371
diff changeset
86
7680
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
87 off_t length;
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
88
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
89 ssize_t send_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
90 size_t recv_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
91
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
92 size_t rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
93 ngx_uint_t stream_id;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
94 u_char type;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
95 u_char flags;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
96 u_char padding;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
97
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
98 ngx_uint_t error;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
99 ngx_uint_t window_update;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
100
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
101 ngx_uint_t setting_id;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
102 ngx_uint_t setting_value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
103
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
104 u_char ping_data[8];
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
105
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
106 ngx_uint_t index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
107 ngx_str_t name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
108 ngx_str_t value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
109
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
110 u_char *field_end;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
111 size_t field_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
112 size_t field_rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
113 u_char field_state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
114
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
115 unsigned literal:1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
116 unsigned field_huffman:1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
117
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
118 unsigned header_sent:1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
119 unsigned output_closed:1;
7350
67c6cb7f477c gRPC: disabled keepalive when sending control frames was blocked.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7349
diff changeset
120 unsigned output_blocked:1;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
121 unsigned parsing_headers:1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
122 unsigned end_stream:1;
7349
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
123 unsigned done:1;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
124 unsigned status:1;
7646
2096b21fcd10 gRPC: RST_STREAM(NO_ERROR) handling (ticket #1792).
Ruslan Ermilov <ru@nginx.com>
parents: 7619
diff changeset
125 unsigned rst:1;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
126
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
127 ngx_http_request_t *request;
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
128
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
129 ngx_str_t host;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
130 } ngx_http_grpc_ctx_t;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
131
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
132
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
133 typedef struct {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
134 u_char length_0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
135 u_char length_1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
136 u_char length_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
137 u_char type;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
138 u_char flags;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
139 u_char stream_id_0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
140 u_char stream_id_1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
141 u_char stream_id_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
142 u_char stream_id_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
143 } ngx_http_grpc_frame_t;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
144
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
145
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
146 static ngx_int_t ngx_http_grpc_eval(ngx_http_request_t *r,
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
147 ngx_http_grpc_ctx_t *ctx, ngx_http_grpc_loc_conf_t *glcf);
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
148 static ngx_int_t ngx_http_grpc_create_request(ngx_http_request_t *r);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
149 static ngx_int_t ngx_http_grpc_reinit_request(ngx_http_request_t *r);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
150 static ngx_int_t ngx_http_grpc_body_output_filter(void *data, ngx_chain_t *in);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
151 static ngx_int_t ngx_http_grpc_process_header(ngx_http_request_t *r);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
152 static ngx_int_t ngx_http_grpc_filter_init(void *data);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
153 static ngx_int_t ngx_http_grpc_filter(void *data, ssize_t bytes);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
154
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
155 static ngx_int_t ngx_http_grpc_parse_frame(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
156 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
157 static ngx_int_t ngx_http_grpc_parse_header(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
158 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
159 static ngx_int_t ngx_http_grpc_parse_fragment(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
160 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
161 static ngx_int_t ngx_http_grpc_validate_header_name(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
162 ngx_str_t *s);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
163 static ngx_int_t ngx_http_grpc_validate_header_value(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
164 ngx_str_t *s);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
165 static ngx_int_t ngx_http_grpc_parse_rst_stream(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
166 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
167 static ngx_int_t ngx_http_grpc_parse_goaway(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
168 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
169 static ngx_int_t ngx_http_grpc_parse_window_update(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
170 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
171 static ngx_int_t ngx_http_grpc_parse_settings(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
172 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
173 static ngx_int_t ngx_http_grpc_parse_ping(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
174 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
175
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
176 static ngx_int_t ngx_http_grpc_send_settings_ack(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
177 ngx_http_grpc_ctx_t *ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
178 static ngx_int_t ngx_http_grpc_send_ping_ack(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
179 ngx_http_grpc_ctx_t *ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
180 static ngx_int_t ngx_http_grpc_send_window_update(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
181 ngx_http_grpc_ctx_t *ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
182
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
183 static ngx_chain_t *ngx_http_grpc_get_buf(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
184 ngx_http_grpc_ctx_t *ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
185 static ngx_http_grpc_ctx_t *ngx_http_grpc_get_ctx(ngx_http_request_t *r);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
186 static ngx_int_t ngx_http_grpc_get_connection_data(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
187 ngx_http_grpc_ctx_t *ctx, ngx_peer_connection_t *pc);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
188 static void ngx_http_grpc_cleanup(void *data);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
189
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
190 static void ngx_http_grpc_abort_request(ngx_http_request_t *r);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
191 static void ngx_http_grpc_finalize_request(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
192 ngx_int_t rc);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
193
7234
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
194 static ngx_int_t ngx_http_grpc_internal_trailers_variable(
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
195 ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data);
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
196
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
197 static ngx_int_t ngx_http_grpc_add_variables(ngx_conf_t *cf);
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
198 static void *ngx_http_grpc_create_loc_conf(ngx_conf_t *cf);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
199 static char *ngx_http_grpc_merge_loc_conf(ngx_conf_t *cf,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
200 void *parent, void *child);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
201 static ngx_int_t ngx_http_grpc_init_headers(ngx_conf_t *cf,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
202 ngx_http_grpc_loc_conf_t *conf, ngx_http_grpc_headers_t *headers,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
203 ngx_keyval_t *default_headers);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
204
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
205 static char *ngx_http_grpc_pass(ngx_conf_t *cf, ngx_command_t *cmd,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
206 void *conf);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
207
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
208 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
209 static char *ngx_http_grpc_ssl_password_file(ngx_conf_t *cf,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
210 ngx_command_t *cmd, void *conf);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
211 static ngx_int_t ngx_http_grpc_set_ssl(ngx_conf_t *cf,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
212 ngx_http_grpc_loc_conf_t *glcf);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
213 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
214
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
215
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
216 static ngx_conf_bitmask_t ngx_http_grpc_next_upstream_masks[] = {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
217 { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
218 { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
219 { ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
220 { ngx_string("non_idempotent"), NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
221 { ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
222 { ngx_string("http_502"), NGX_HTTP_UPSTREAM_FT_HTTP_502 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
223 { ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
224 { ngx_string("http_504"), NGX_HTTP_UPSTREAM_FT_HTTP_504 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
225 { ngx_string("http_403"), NGX_HTTP_UPSTREAM_FT_HTTP_403 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
226 { ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
227 { ngx_string("http_429"), NGX_HTTP_UPSTREAM_FT_HTTP_429 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
228 { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
229 { ngx_null_string, 0 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
230 };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
231
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
232
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
233 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
234
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
235 static ngx_conf_bitmask_t ngx_http_grpc_ssl_protocols[] = {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
236 { ngx_string("SSLv2"), NGX_SSL_SSLv2 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
237 { ngx_string("SSLv3"), NGX_SSL_SSLv3 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
238 { ngx_string("TLSv1"), NGX_SSL_TLSv1 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
239 { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
240 { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
241 { ngx_string("TLSv1.3"), NGX_SSL_TLSv1_3 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
242 { ngx_null_string, 0 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
243 };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
244
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
245 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
246
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
247
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
248 static ngx_command_t ngx_http_grpc_commands[] = {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
249
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
250 { ngx_string("grpc_pass"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
251 NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
252 ngx_http_grpc_pass,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
253 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
254 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
255 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
256
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
257 { ngx_string("grpc_bind"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
258 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
259 ngx_http_upstream_bind_set_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
260 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
261 offsetof(ngx_http_grpc_loc_conf_t, upstream.local),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
262 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
263
7371
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7350
diff changeset
264 { ngx_string("grpc_socket_keepalive"),
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7350
diff changeset
265 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7350
diff changeset
266 ngx_conf_set_flag_slot,
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7350
diff changeset
267 NGX_HTTP_LOC_CONF_OFFSET,
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7350
diff changeset
268 offsetof(ngx_http_grpc_loc_conf_t, upstream.socket_keepalive),
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7350
diff changeset
269 NULL },
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7350
diff changeset
270
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
271 { ngx_string("grpc_connect_timeout"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
272 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
273 ngx_conf_set_msec_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
274 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
275 offsetof(ngx_http_grpc_loc_conf_t, upstream.connect_timeout),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
276 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
277
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
278 { ngx_string("grpc_send_timeout"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
279 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
280 ngx_conf_set_msec_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
281 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
282 offsetof(ngx_http_grpc_loc_conf_t, upstream.send_timeout),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
283 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
284
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
285 { ngx_string("grpc_intercept_errors"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
286 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
287 ngx_conf_set_flag_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
288 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
289 offsetof(ngx_http_grpc_loc_conf_t, upstream.intercept_errors),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
290 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
291
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
292 { ngx_string("grpc_buffer_size"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
293 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
294 ngx_conf_set_size_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
295 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
296 offsetof(ngx_http_grpc_loc_conf_t, upstream.buffer_size),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
297 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
298
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
299 { ngx_string("grpc_read_timeout"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
300 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
301 ngx_conf_set_msec_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
302 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
303 offsetof(ngx_http_grpc_loc_conf_t, upstream.read_timeout),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
304 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
305
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
306 { ngx_string("grpc_next_upstream"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
307 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
308 ngx_conf_set_bitmask_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
309 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
310 offsetof(ngx_http_grpc_loc_conf_t, upstream.next_upstream),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
311 &ngx_http_grpc_next_upstream_masks },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
312
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
313 { ngx_string("grpc_next_upstream_tries"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
314 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
315 ngx_conf_set_num_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
316 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
317 offsetof(ngx_http_grpc_loc_conf_t, upstream.next_upstream_tries),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
318 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
319
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
320 { ngx_string("grpc_next_upstream_timeout"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
321 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
322 ngx_conf_set_msec_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
323 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
324 offsetof(ngx_http_grpc_loc_conf_t, upstream.next_upstream_timeout),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
325 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
326
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
327 { ngx_string("grpc_set_header"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
328 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
329 ngx_conf_set_keyval_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
330 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
331 offsetof(ngx_http_grpc_loc_conf_t, headers_source),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
332 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
333
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
334 { ngx_string("grpc_pass_header"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
335 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
336 ngx_conf_set_str_array_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
337 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
338 offsetof(ngx_http_grpc_loc_conf_t, upstream.pass_headers),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
339 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
340
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
341 { ngx_string("grpc_hide_header"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
342 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
343 ngx_conf_set_str_array_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
344 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
345 offsetof(ngx_http_grpc_loc_conf_t, upstream.hide_headers),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
346 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
347
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
348 { ngx_string("grpc_ignore_headers"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
349 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
350 ngx_conf_set_bitmask_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
351 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
352 offsetof(ngx_http_grpc_loc_conf_t, upstream.ignore_headers),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
353 &ngx_http_upstream_ignore_headers_masks },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
354
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
355 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
356
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
357 { ngx_string("grpc_ssl_session_reuse"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
358 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
359 ngx_conf_set_flag_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
360 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
361 offsetof(ngx_http_grpc_loc_conf_t, upstream.ssl_session_reuse),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
362 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
363
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
364 { ngx_string("grpc_ssl_protocols"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
365 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
366 ngx_conf_set_bitmask_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
367 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
368 offsetof(ngx_http_grpc_loc_conf_t, ssl_protocols),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
369 &ngx_http_grpc_ssl_protocols },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
370
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
371 { ngx_string("grpc_ssl_ciphers"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
372 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
373 ngx_conf_set_str_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
374 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
375 offsetof(ngx_http_grpc_loc_conf_t, ssl_ciphers),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
376 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
377
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
378 { ngx_string("grpc_ssl_name"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
379 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
380 ngx_http_set_complex_value_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
381 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
382 offsetof(ngx_http_grpc_loc_conf_t, upstream.ssl_name),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
383 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
384
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
385 { ngx_string("grpc_ssl_server_name"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
386 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
387 ngx_conf_set_flag_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
388 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
389 offsetof(ngx_http_grpc_loc_conf_t, upstream.ssl_server_name),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
390 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
391
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
392 { ngx_string("grpc_ssl_verify"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
393 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
394 ngx_conf_set_flag_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
395 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
396 offsetof(ngx_http_grpc_loc_conf_t, upstream.ssl_verify),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
397 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
398
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
399 { ngx_string("grpc_ssl_verify_depth"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
400 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
401 ngx_conf_set_num_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
402 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
403 offsetof(ngx_http_grpc_loc_conf_t, ssl_verify_depth),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
404 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
405
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
406 { ngx_string("grpc_ssl_trusted_certificate"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
407 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
408 ngx_conf_set_str_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
409 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
410 offsetof(ngx_http_grpc_loc_conf_t, ssl_trusted_certificate),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
411 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
412
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
413 { ngx_string("grpc_ssl_crl"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
414 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
415 ngx_conf_set_str_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
416 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
417 offsetof(ngx_http_grpc_loc_conf_t, ssl_crl),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
418 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
419
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
420 { ngx_string("grpc_ssl_certificate"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
421 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
422 ngx_conf_set_str_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
423 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
424 offsetof(ngx_http_grpc_loc_conf_t, ssl_certificate),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
425 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
426
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
427 { ngx_string("grpc_ssl_certificate_key"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
428 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
429 ngx_conf_set_str_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
430 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
431 offsetof(ngx_http_grpc_loc_conf_t, ssl_certificate_key),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
432 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
433
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
434 { ngx_string("grpc_ssl_password_file"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
435 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
436 ngx_http_grpc_ssl_password_file,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
437 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
438 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
439 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
440
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
441 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
442
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
443 ngx_null_command
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
444 };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
445
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
446
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
447 static ngx_http_module_t ngx_http_grpc_module_ctx = {
7234
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
448 ngx_http_grpc_add_variables, /* preconfiguration */
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
449 NULL, /* postconfiguration */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
450
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
451 NULL, /* create main configuration */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
452 NULL, /* init main configuration */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
453
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
454 NULL, /* create server configuration */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
455 NULL, /* merge server configuration */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
456
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
457 ngx_http_grpc_create_loc_conf, /* create location configuration */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
458 ngx_http_grpc_merge_loc_conf /* merge location configuration */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
459 };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
460
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
461
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
462 ngx_module_t ngx_http_grpc_module = {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
463 NGX_MODULE_V1,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
464 &ngx_http_grpc_module_ctx, /* module context */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
465 ngx_http_grpc_commands, /* module directives */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
466 NGX_HTTP_MODULE, /* module type */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
467 NULL, /* init master */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
468 NULL, /* init module */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
469 NULL, /* init process */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
470 NULL, /* init thread */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
471 NULL, /* exit thread */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
472 NULL, /* exit process */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
473 NULL, /* exit master */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
474 NGX_MODULE_V1_PADDING
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
475 };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
476
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
477
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
478 static u_char ngx_http_grpc_connection_start[] =
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
479 "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" /* connection preface */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
480
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
481 "\x00\x00\x12\x04\x00\x00\x00\x00\x00" /* settings frame */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
482 "\x00\x01\x00\x00\x00\x00" /* header table size */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
483 "\x00\x02\x00\x00\x00\x00" /* disable push */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
484 "\x00\x04\x7f\xff\xff\xff" /* initial window */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
485
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
486 "\x00\x00\x04\x08\x00\x00\x00\x00\x00" /* window update frame */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
487 "\x7f\xff\x00\x00";
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
488
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
489
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
490 static ngx_keyval_t ngx_http_grpc_headers[] = {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
491 { ngx_string("Content-Length"), ngx_string("$content_length") },
7234
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
492 { ngx_string("TE"), ngx_string("$grpc_internal_trailers") },
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
493 { ngx_string("Host"), ngx_string("") },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
494 { ngx_string("Connection"), ngx_string("") },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
495 { ngx_string("Transfer-Encoding"), ngx_string("") },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
496 { ngx_string("Keep-Alive"), ngx_string("") },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
497 { ngx_string("Expect"), ngx_string("") },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
498 { ngx_string("Upgrade"), ngx_string("") },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
499 { ngx_null_string, ngx_null_string }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
500 };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
501
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
502
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
503 static ngx_str_t ngx_http_grpc_hide_headers[] = {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
504 ngx_string("Date"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
505 ngx_string("Server"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
506 ngx_string("X-Accel-Expires"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
507 ngx_string("X-Accel-Redirect"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
508 ngx_string("X-Accel-Limit-Rate"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
509 ngx_string("X-Accel-Buffering"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
510 ngx_string("X-Accel-Charset"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
511 ngx_null_string
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
512 };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
513
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
514
7234
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
515 static ngx_http_variable_t ngx_http_grpc_vars[] = {
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
516
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
517 { ngx_string("grpc_internal_trailers"), NULL,
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
518 ngx_http_grpc_internal_trailers_variable, 0,
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
519 NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
520
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
521 ngx_http_null_variable
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
522 };
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
523
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
524
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
525 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
526 ngx_http_grpc_handler(ngx_http_request_t *r)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
527 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
528 ngx_int_t rc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
529 ngx_http_upstream_t *u;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
530 ngx_http_grpc_ctx_t *ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
531 ngx_http_grpc_loc_conf_t *glcf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
532
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
533 if (ngx_http_upstream_create(r) != NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
534 return NGX_HTTP_INTERNAL_SERVER_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
535 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
536
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
537 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_grpc_ctx_t));
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
538 if (ctx == NULL) {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
539 return NGX_HTTP_INTERNAL_SERVER_ERROR;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
540 }
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
541
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
542 ctx->request = r;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
543
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
544 ngx_http_set_ctx(r, ctx, ngx_http_grpc_module);
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
545
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
546 glcf = ngx_http_get_module_loc_conf(r, ngx_http_grpc_module);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
547
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
548 u = r->upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
549
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
550 if (glcf->grpc_lengths == NULL) {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
551 ctx->host = glcf->host;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
552
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
553 #if (NGX_HTTP_SSL)
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
554 u->ssl = (glcf->upstream.ssl != NULL);
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
555
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
556 if (u->ssl) {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
557 ngx_str_set(&u->schema, "grpcs://");
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
558
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
559 } else {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
560 ngx_str_set(&u->schema, "grpc://");
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
561 }
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
562 #else
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
563 ngx_str_set(&u->schema, "grpc://");
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
564 #endif
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
565
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
566 } else {
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
567 if (ngx_http_grpc_eval(r, ctx, glcf) != NGX_OK) {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
568 return NGX_HTTP_INTERNAL_SERVER_ERROR;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
569 }
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
570 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
571
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
572 u->output.tag = (ngx_buf_tag_t) &ngx_http_grpc_module;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
573
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
574 u->conf = &glcf->upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
575
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
576 u->create_request = ngx_http_grpc_create_request;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
577 u->reinit_request = ngx_http_grpc_reinit_request;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
578 u->process_header = ngx_http_grpc_process_header;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
579 u->abort_request = ngx_http_grpc_abort_request;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
580 u->finalize_request = ngx_http_grpc_finalize_request;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
581
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
582 u->input_filter_init = ngx_http_grpc_filter_init;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
583 u->input_filter = ngx_http_grpc_filter;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
584 u->input_filter_ctx = ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
585
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
586 r->request_body_no_buffering = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
587
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
588 rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
589
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
590 if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
591 return rc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
592 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
593
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
594 return NGX_DONE;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
595 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
596
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
597
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
598 static ngx_int_t
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
599 ngx_http_grpc_eval(ngx_http_request_t *r, ngx_http_grpc_ctx_t *ctx,
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
600 ngx_http_grpc_loc_conf_t *glcf)
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
601 {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
602 size_t add;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
603 ngx_url_t url;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
604 ngx_http_upstream_t *u;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
605
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
606 ngx_memzero(&url, sizeof(ngx_url_t));
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
607
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
608 if (ngx_http_script_run(r, &url.url, glcf->grpc_lengths->elts, 0,
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
609 glcf->grpc_values->elts)
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
610 == NULL)
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
611 {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
612 return NGX_ERROR;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
613 }
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
614
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
615 if (url.url.len > 7
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
616 && ngx_strncasecmp(url.url.data, (u_char *) "grpc://", 7) == 0)
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
617 {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
618 add = 7;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
620 } else if (url.url.len > 8
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
621 && ngx_strncasecmp(url.url.data, (u_char *) "grpcs://", 8) == 0)
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
622 {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
623
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
624 #if (NGX_HTTP_SSL)
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
625 add = 8;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
626 r->upstream->ssl = 1;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
627 #else
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
628 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
629 "grpcs protocol requires SSL support");
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
630 return NGX_ERROR;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
631 #endif
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
632
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
633 } else {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
634 add = 0;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
635 }
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
636
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
637 u = r->upstream;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
638
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
639 if (add) {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
640 u->schema.len = add;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
641 u->schema.data = url.url.data;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
642
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
643 url.url.data += add;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
644 url.url.len -= add;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
645
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
646 } else {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
647 ngx_str_set(&u->schema, "grpc://");
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
648 }
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
649
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
650 url.no_resolve = 1;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
651
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
652 if (ngx_parse_url(r->pool, &url) != NGX_OK) {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
653 if (url.err) {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
654 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
655 "%s in upstream \"%V\"", url.err, &url.url);
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
656 }
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
657
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
658 return NGX_ERROR;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
659 }
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
660
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
661 u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t));
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
662 if (u->resolved == NULL) {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
663 return NGX_ERROR;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
664 }
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
665
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
666 if (url.addrs) {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
667 u->resolved->sockaddr = url.addrs[0].sockaddr;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
668 u->resolved->socklen = url.addrs[0].socklen;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
669 u->resolved->name = url.addrs[0].name;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
670 u->resolved->naddrs = 1;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
671 }
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
672
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
673 u->resolved->host = url.host;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
674 u->resolved->port = url.port;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
675 u->resolved->no_port = url.no_port;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
676
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
677 if (url.family != AF_UNIX) {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
678
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
679 if (url.no_port) {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
680 ctx->host = url.host;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
681
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
682 } else {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
683 ctx->host.len = url.host.len + 1 + url.port_text.len;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
684 ctx->host.data = url.host.data;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
685 }
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
686
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
687 } else {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
688 ngx_str_set(&ctx->host, "localhost");
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
689 }
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
690
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
691 return NGX_OK;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
692 }
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
693
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
694
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
695 static ngx_int_t
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
696 ngx_http_grpc_create_request(ngx_http_request_t *r)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
697 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
698 u_char *p, *tmp, *key_tmp, *val_tmp, *headers_frame;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
699 size_t len, tmp_len, key_len, val_len, uri_len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
700 uintptr_t escape;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
701 ngx_buf_t *b;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
702 ngx_uint_t i, next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
703 ngx_chain_t *cl, *body;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
704 ngx_list_part_t *part;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
705 ngx_table_elt_t *header;
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
706 ngx_http_grpc_ctx_t *ctx;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
707 ngx_http_upstream_t *u;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
708 ngx_http_grpc_frame_t *f;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
709 ngx_http_script_code_pt code;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
710 ngx_http_grpc_loc_conf_t *glcf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
711 ngx_http_script_engine_t e, le;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
712 ngx_http_script_len_code_pt lcode;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
713
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
714 u = r->upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
715
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
716 glcf = ngx_http_get_module_loc_conf(r, ngx_http_grpc_module);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
717
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
718 ctx = ngx_http_get_module_ctx(r, ngx_http_grpc_module);
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
719
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
720 len = sizeof(ngx_http_grpc_connection_start) - 1
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
721 + sizeof(ngx_http_grpc_frame_t); /* headers frame */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
722
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
723 /* :method header */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
724
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
725 if (r->method == NGX_HTTP_GET || r->method == NGX_HTTP_POST) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
726 len += 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
727 tmp_len = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
728
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
729 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
730 len += 1 + NGX_HTTP_V2_INT_OCTETS + r->method_name.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
731 tmp_len = r->method_name.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
732 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
733
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
734 /* :scheme header */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
735
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
736 len += 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
737
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
738 /* :path header */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
739
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
740 if (r->valid_unparsed_uri) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
741 escape = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
742 uri_len = r->unparsed_uri.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
743
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
744 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
745 escape = 2 * ngx_escape_uri(NULL, r->uri.data, r->uri.len,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
746 NGX_ESCAPE_URI);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
747 uri_len = r->uri.len + escape + sizeof("?") - 1 + r->args.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
748 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
749
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
750 len += 1 + NGX_HTTP_V2_INT_OCTETS + uri_len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
751
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
752 if (tmp_len < uri_len) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
753 tmp_len = uri_len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
754 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
755
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
756 /* :authority header */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
757
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
758 if (!glcf->host_set) {
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
759 len += 1 + NGX_HTTP_V2_INT_OCTETS + ctx->host.len;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
760
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
761 if (tmp_len < ctx->host.len) {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
762 tmp_len = ctx->host.len;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
763 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
764 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
765
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
766 /* other headers */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
767
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
768 ngx_http_script_flush_no_cacheable_variables(r, glcf->headers.flushes);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
769 ngx_memzero(&le, sizeof(ngx_http_script_engine_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
770
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
771 le.ip = glcf->headers.lengths->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
772 le.request = r;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
773 le.flushed = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
774
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
775 while (*(uintptr_t *) le.ip) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
776
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
777 lcode = *(ngx_http_script_len_code_pt *) le.ip;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
778 key_len = lcode(&le);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
779
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
780 for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
781 lcode = *(ngx_http_script_len_code_pt *) le.ip;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
782 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
783 le.ip += sizeof(uintptr_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
784
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
785 if (val_len == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
786 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
787 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
788
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
789 len += 1 + NGX_HTTP_V2_INT_OCTETS + key_len
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
790 + NGX_HTTP_V2_INT_OCTETS + val_len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
791
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
792 if (tmp_len < key_len) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
793 tmp_len = key_len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
794 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
795
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
796 if (tmp_len < val_len) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
797 tmp_len = val_len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
798 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
799 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
800
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
801 if (glcf->upstream.pass_request_headers) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
802 part = &r->headers_in.headers.part;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
803 header = part->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
804
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
805 for (i = 0; /* void */; i++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
806
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
807 if (i >= part->nelts) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
808 if (part->next == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
809 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
810 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
811
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
812 part = part->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
813 header = part->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
814 i = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
815 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
816
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
817 if (ngx_hash_find(&glcf->headers.hash, header[i].hash,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
818 header[i].lowcase_key, header[i].key.len))
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
819 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
820 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
821 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
822
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
823 len += 1 + NGX_HTTP_V2_INT_OCTETS + header[i].key.len
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
824 + NGX_HTTP_V2_INT_OCTETS + header[i].value.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
825
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
826 if (tmp_len < header[i].key.len) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
827 tmp_len = header[i].key.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
828 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
829
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
830 if (tmp_len < header[i].value.len) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
831 tmp_len = header[i].value.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
832 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
833 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
834 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
835
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
836 /* continuation frames */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
837
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
838 len += sizeof(ngx_http_grpc_frame_t)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
839 * (len / NGX_HTTP_V2_DEFAULT_FRAME_SIZE);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
840
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
841
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
842 b = ngx_create_temp_buf(r->pool, len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
843 if (b == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
844 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
845 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
846
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
847 cl = ngx_alloc_chain_link(r->pool);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
848 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
849 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
850 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
851
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
852 cl->buf = b;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
853 cl->next = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
854
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
855 tmp = ngx_palloc(r->pool, tmp_len * 3);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
856 if (tmp == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
857 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
858 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
859
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
860 key_tmp = tmp + tmp_len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
861 val_tmp = tmp + 2 * tmp_len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
862
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
863 /* connection preface */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
864
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
865 b->last = ngx_copy(b->last, ngx_http_grpc_connection_start,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
866 sizeof(ngx_http_grpc_connection_start) - 1);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
867
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
868 /* headers frame */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
869
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
870 headers_frame = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
871
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
872 f = (ngx_http_grpc_frame_t *) b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
873 b->last += sizeof(ngx_http_grpc_frame_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
874
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
875 f->length_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
876 f->length_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
877 f->length_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
878 f->type = NGX_HTTP_V2_HEADERS_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
879 f->flags = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
880 f->stream_id_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
881 f->stream_id_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
882 f->stream_id_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
883 f->stream_id_3 = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
884
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
885 if (r->method == NGX_HTTP_GET) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
886 *b->last++ = ngx_http_v2_indexed(NGX_HTTP_V2_METHOD_GET_INDEX);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
887
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
888 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
889 "grpc header: \":method: GET\"");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
890
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
891 } else if (r->method == NGX_HTTP_POST) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
892 *b->last++ = ngx_http_v2_indexed(NGX_HTTP_V2_METHOD_POST_INDEX);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
893
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
894 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
895 "grpc header: \":method: POST\"");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
896
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
897 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
898 *b->last++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_METHOD_INDEX);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
899 b->last = ngx_http_v2_write_value(b->last, r->method_name.data,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
900 r->method_name.len, tmp);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
901
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
902 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
903 "grpc header: \":method: %V\"", &r->method_name);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
904 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
905
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
906 #if (NGX_HTTP_SSL)
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
907 if (u->ssl) {
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
908 *b->last++ = ngx_http_v2_indexed(NGX_HTTP_V2_SCHEME_HTTPS_INDEX);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
909
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
910 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
911 "grpc header: \":scheme: https\"");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
912 } else
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
913 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
914 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
915 *b->last++ = ngx_http_v2_indexed(NGX_HTTP_V2_SCHEME_HTTP_INDEX);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
916
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
917 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
918 "grpc header: \":scheme: http\"");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
919 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
920
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
921 if (r->valid_unparsed_uri) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
922
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
923 if (r->unparsed_uri.len == 1 && r->unparsed_uri.data[0] == '/') {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
924 *b->last++ = ngx_http_v2_indexed(NGX_HTTP_V2_PATH_ROOT_INDEX);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
925
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
926 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
927 *b->last++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_PATH_INDEX);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
928 b->last = ngx_http_v2_write_value(b->last, r->unparsed_uri.data,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
929 r->unparsed_uri.len, tmp);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
930 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
931
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
932 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
933 "grpc header: \":path: %V\"", &r->unparsed_uri);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
934
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
935 } else if (escape || r->args.len > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
936 p = val_tmp;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
937
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
938 if (escape) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
939 p = (u_char *) ngx_escape_uri(p, r->uri.data, r->uri.len,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
940 NGX_ESCAPE_URI);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
941
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
942 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
943 p = ngx_copy(p, r->uri.data, r->uri.len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
944 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
945
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
946 if (r->args.len > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
947 *p++ = '?';
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
948 p = ngx_copy(p, r->args.data, r->args.len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
949 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
950
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
951 *b->last++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_PATH_INDEX);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
952 b->last = ngx_http_v2_write_value(b->last, val_tmp, p - val_tmp, tmp);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
953
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
954 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
955 "grpc header: \":path: %*s\"", p - val_tmp, val_tmp);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
956
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
957 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
958 *b->last++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_PATH_INDEX);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
959 b->last = ngx_http_v2_write_value(b->last, r->uri.data,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
960 r->uri.len, tmp);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
961
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
962 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
963 "grpc header: \":path: %V\"", &r->uri);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
964 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
965
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
966 if (!glcf->host_set) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
967 *b->last++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_AUTHORITY_INDEX);
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
968 b->last = ngx_http_v2_write_value(b->last, ctx->host.data,
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
969 ctx->host.len, tmp);
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
970
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
971 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
972 "grpc header: \":authority: %V\"", &ctx->host);
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
973 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
974
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
975 ngx_memzero(&e, sizeof(ngx_http_script_engine_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
976
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
977 e.ip = glcf->headers.values->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
978 e.request = r;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
979 e.flushed = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
980
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
981 le.ip = glcf->headers.lengths->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
982
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
983 while (*(uintptr_t *) le.ip) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
984
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
985 lcode = *(ngx_http_script_len_code_pt *) le.ip;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
986 key_len = lcode(&le);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
987
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
988 for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
989 lcode = *(ngx_http_script_len_code_pt *) le.ip;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
990 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
991 le.ip += sizeof(uintptr_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
992
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
993 if (val_len == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
994 e.skip = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
995
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
996 while (*(uintptr_t *) e.ip) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
997 code = *(ngx_http_script_code_pt *) e.ip;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
998 code((ngx_http_script_engine_t *) &e);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
999 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1000 e.ip += sizeof(uintptr_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1001
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1002 e.skip = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1003
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1004 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1005 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1006
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1007 *b->last++ = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1008
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1009 e.pos = key_tmp;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1010
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1011 code = *(ngx_http_script_code_pt *) e.ip;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1012 code((ngx_http_script_engine_t *) &e);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1013
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1014 b->last = ngx_http_v2_write_name(b->last, key_tmp, key_len, tmp);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1015
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1016 e.pos = val_tmp;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1017
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1018 while (*(uintptr_t *) e.ip) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1019 code = *(ngx_http_script_code_pt *) e.ip;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1020 code((ngx_http_script_engine_t *) &e);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1021 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1022 e.ip += sizeof(uintptr_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1023
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1024 b->last = ngx_http_v2_write_value(b->last, val_tmp, val_len, tmp);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1025
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1026 #if (NGX_DEBUG)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1027 if (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1028 ngx_strlow(key_tmp, key_tmp, key_len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1029
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1030 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1031 "grpc header: \"%*s: %*s\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1032 key_len, key_tmp, val_len, val_tmp);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1033 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1034 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1035 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1036
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1037 if (glcf->upstream.pass_request_headers) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1038 part = &r->headers_in.headers.part;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1039 header = part->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1040
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1041 for (i = 0; /* void */; i++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1042
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1043 if (i >= part->nelts) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1044 if (part->next == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1045 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1046 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1047
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1048 part = part->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1049 header = part->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1050 i = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1051 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1052
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1053 if (ngx_hash_find(&glcf->headers.hash, header[i].hash,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1054 header[i].lowcase_key, header[i].key.len))
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1055 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1056 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1057 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1058
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1059 *b->last++ = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1060
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1061 b->last = ngx_http_v2_write_name(b->last, header[i].key.data,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1062 header[i].key.len, tmp);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1063
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1064 b->last = ngx_http_v2_write_value(b->last, header[i].value.data,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1065 header[i].value.len, tmp);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1066
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1067 #if (NGX_DEBUG)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1068 if (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1069 ngx_strlow(tmp, header[i].key.data, header[i].key.len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1070
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1071 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1072 "grpc header: \"%*s: %V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1073 header[i].key.len, tmp, &header[i].value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1074 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1075 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1076 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1077 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1078
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1079 /* update headers frame length */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1080
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1081 len = b->last - headers_frame - sizeof(ngx_http_grpc_frame_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1082
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1083 if (len > NGX_HTTP_V2_DEFAULT_FRAME_SIZE) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1084 len = NGX_HTTP_V2_DEFAULT_FRAME_SIZE;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1085 next = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1086
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1087 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1088 next = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1089 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1090
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1091 f = (ngx_http_grpc_frame_t *) headers_frame;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1092
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1093 f->length_0 = (u_char) ((len >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1094 f->length_1 = (u_char) ((len >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1095 f->length_2 = (u_char) (len & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1096
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1097 /* create additional continuation frames */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1098
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1099 p = headers_frame;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1100
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1101 while (next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1102 p += sizeof(ngx_http_grpc_frame_t) + NGX_HTTP_V2_DEFAULT_FRAME_SIZE;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1103 len = b->last - p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1104
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1105 ngx_memmove(p + sizeof(ngx_http_grpc_frame_t), p, len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1106 b->last += sizeof(ngx_http_grpc_frame_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1107
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1108 if (len > NGX_HTTP_V2_DEFAULT_FRAME_SIZE) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1109 len = NGX_HTTP_V2_DEFAULT_FRAME_SIZE;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1110 next = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1111
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1112 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1113 next = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1114 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1115
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1116 f = (ngx_http_grpc_frame_t *) p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1117
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1118 f->length_0 = (u_char) ((len >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1119 f->length_1 = (u_char) ((len >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1120 f->length_2 = (u_char) (len & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1121 f->type = NGX_HTTP_V2_CONTINUATION_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1122 f->flags = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1123 f->stream_id_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1124 f->stream_id_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1125 f->stream_id_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1126 f->stream_id_3 = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1127 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1128
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1129 f->flags |= NGX_HTTP_V2_END_HEADERS_FLAG;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1130
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1131 #if (NGX_DEBUG)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1132 if (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1133 u_char buf[512];
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1134 size_t n, m;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1135
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1136 n = ngx_min(b->last - b->pos, 256);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1137 m = ngx_hex_dump(buf, b->pos, n) - buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1138
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1139 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1140 "grpc header: %*s%s, len: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1141 m, buf, b->last - b->pos > 256 ? "..." : "",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1142 b->last - b->pos);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1143 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1144 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1145
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1146 if (r->request_body_no_buffering) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1147
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1148 u->request_bufs = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1149
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1150 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1151
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1152 body = u->request_bufs;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1153 u->request_bufs = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1154
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1155 if (body == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1156 f = (ngx_http_grpc_frame_t *) headers_frame;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1157 f->flags |= NGX_HTTP_V2_END_STREAM_FLAG;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1158 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1159
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1160 while (body) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1161 b = ngx_alloc_buf(r->pool);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1162 if (b == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1163 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1164 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1165
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1166 ngx_memcpy(b, body->buf, sizeof(ngx_buf_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1167
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1168 cl->next = ngx_alloc_chain_link(r->pool);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1169 if (cl->next == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1170 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1171 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1172
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1173 cl = cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1174 cl->buf = b;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1175
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1176 body = body->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1177 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1178
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1179 b->last_buf = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1180 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1181
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1182 u->output.output_filter = ngx_http_grpc_body_output_filter;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1183 u->output.filter_ctx = r;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1184
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1185 b->flush = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1186 cl->next = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1187
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1188 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1189 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1190
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1191
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1192 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1193 ngx_http_grpc_reinit_request(ngx_http_request_t *r)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1194 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1195 ngx_http_grpc_ctx_t *ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1196
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1197 ctx = ngx_http_get_module_ctx(r, ngx_http_grpc_module);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1198
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1199 if (ctx == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1200 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1201 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1202
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1203 ctx->state = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1204 ctx->header_sent = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1205 ctx->output_closed = 0;
7350
67c6cb7f477c gRPC: disabled keepalive when sending control frames was blocked.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7349
diff changeset
1206 ctx->output_blocked = 0;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1207 ctx->parsing_headers = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1208 ctx->end_stream = 0;
7349
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1209 ctx->done = 0;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1210 ctx->status = 0;
7646
2096b21fcd10 gRPC: RST_STREAM(NO_ERROR) handling (ticket #1792).
Ruslan Ermilov <ru@nginx.com>
parents: 7619
diff changeset
1211 ctx->rst = 0;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1212 ctx->connection = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1213
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1214 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1215 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1216
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1217
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1218 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1219 ngx_http_grpc_body_output_filter(void *data, ngx_chain_t *in)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1220 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1221 ngx_http_request_t *r = data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1222
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1223 off_t file_pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1224 u_char *p, *pos, *start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1225 size_t len, limit;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1226 ngx_buf_t *b;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1227 ngx_int_t rc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1228 ngx_uint_t next, last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1229 ngx_chain_t *cl, *out, **ll;
7349
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1230 ngx_http_upstream_t *u;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1231 ngx_http_grpc_ctx_t *ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1232 ngx_http_grpc_frame_t *f;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1234 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1235 "grpc output filter");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1236
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1237 ctx = ngx_http_grpc_get_ctx(r);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1238
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1239 if (ctx == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1240 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1241 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1242
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1243 if (in) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1244 if (ngx_chain_add_copy(r->pool, &ctx->in, in) != NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1245 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1246 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1247 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1248
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1249 out = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1250 ll = &out;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1251
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1252 if (!ctx->header_sent) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1253 /* first buffer contains headers */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1254
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1255 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1256 "grpc output header");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1257
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1258 ctx->header_sent = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1259
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1260 if (ctx->id != 1) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1261 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1262 * keepalive connection: skip connection preface,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1263 * update stream identifiers
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1264 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1265
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1266 b = ctx->in->buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1267 b->pos += sizeof(ngx_http_grpc_connection_start) - 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1268
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1269 p = b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1270
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1271 while (p < b->last) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1272 f = (ngx_http_grpc_frame_t *) p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1273 p += sizeof(ngx_http_grpc_frame_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1274
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1275 f->stream_id_0 = (u_char) ((ctx->id >> 24) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1276 f->stream_id_1 = (u_char) ((ctx->id >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1277 f->stream_id_2 = (u_char) ((ctx->id >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1278 f->stream_id_3 = (u_char) (ctx->id & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1279
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1280 p += (f->length_0 << 16) + (f->length_1 << 8) + f->length_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1281 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1282 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1283
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1284 if (ctx->in->buf->last_buf) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1285 ctx->output_closed = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1286 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1287
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1288 *ll = ctx->in;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1289 ll = &ctx->in->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1290
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1291 ctx->in = ctx->in->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1292 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1293
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1294 if (ctx->out) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1295 /* queued control frames */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1296
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1297 *ll = ctx->out;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1298
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1299 for (cl = ctx->out, ll = &cl->next; cl; cl = cl->next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1300 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1301 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1302
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1303 ctx->out = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1304 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1305
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1306 f = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1307 last = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1308
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1309 limit = ngx_max(0, ctx->send_window);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1310
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1311 if (limit > ctx->connection->send_window) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1312 limit = ctx->connection->send_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1313 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1314
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1315 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1316 "grpc output limit: %uz w:%z:%uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1317 limit, ctx->send_window, ctx->connection->send_window);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1318
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1319 #if (NGX_SUPPRESS_WARN)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1320 file_pos = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1321 pos = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1322 cl = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1323 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1324
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1325 in = ctx->in;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1326
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1327 while (in && limit > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1328
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1329 ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1330 "grpc output in l:%d f:%d %p, pos %p, size: %z "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1331 "file: %O, size: %O",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1332 in->buf->last_buf,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1333 in->buf->in_file,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1334 in->buf->start, in->buf->pos,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1335 in->buf->last - in->buf->pos,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1336 in->buf->file_pos,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1337 in->buf->file_last - in->buf->file_pos);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1338
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1339 if (ngx_buf_special(in->buf)) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1340 goto next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1341 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1342
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1343 if (in->buf->in_file) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1344 file_pos = in->buf->file_pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1345
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1346 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1347 pos = in->buf->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1348 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1349
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1350 next = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1351
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1352 do {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1353
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1354 cl = ngx_http_grpc_get_buf(r, ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1355 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1356 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1357 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1358
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1359 b = cl->buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1360
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1361 f = (ngx_http_grpc_frame_t *) b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1362 b->last += sizeof(ngx_http_grpc_frame_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1363
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1364 *ll = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1365 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1366
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1367 cl = ngx_chain_get_free_buf(r->pool, &ctx->free);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1368 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1369 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1370 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1371
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1372 b = cl->buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1373 start = b->start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1374
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1375 ngx_memcpy(b, in->buf, sizeof(ngx_buf_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1376
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1377 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1378 * restore b->start to preserve memory allocated in the buffer,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1379 * to reuse it later for headers and control frames
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1380 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1381
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1382 b->start = start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1383
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1384 if (in->buf->in_file) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1385 b->file_pos = file_pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1386 file_pos += ngx_min(NGX_HTTP_V2_DEFAULT_FRAME_SIZE, limit);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1387
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1388 if (file_pos >= in->buf->file_last) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1389 file_pos = in->buf->file_last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1390 next = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1391 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1392
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1393 b->file_last = file_pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1394 len = (ngx_uint_t) (file_pos - b->file_pos);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1395
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1396 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1397 b->pos = pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1398 pos += ngx_min(NGX_HTTP_V2_DEFAULT_FRAME_SIZE, limit);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1399
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1400 if (pos >= in->buf->last) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1401 pos = in->buf->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1402 next = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1403 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1404
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1405 b->last = pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1406 len = (ngx_uint_t) (pos - b->pos);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1407 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1408
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1409 b->tag = (ngx_buf_tag_t) &ngx_http_grpc_body_output_filter;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1410 b->shadow = in->buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1411 b->last_shadow = next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1412
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1413 b->last_buf = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1414 b->last_in_chain = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1415
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1416 *ll = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1417 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1418
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1419 f->length_0 = (u_char) ((len >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1420 f->length_1 = (u_char) ((len >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1421 f->length_2 = (u_char) (len & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1422 f->type = NGX_HTTP_V2_DATA_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1423 f->flags = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1424 f->stream_id_0 = (u_char) ((ctx->id >> 24) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1425 f->stream_id_1 = (u_char) ((ctx->id >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1426 f->stream_id_2 = (u_char) ((ctx->id >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1427 f->stream_id_3 = (u_char) (ctx->id & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1428
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1429 limit -= len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1430 ctx->send_window -= len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1431 ctx->connection->send_window -= len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1432
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1433 } while (!next && limit > 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1434
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1435 if (!next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1436 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1437 * if the buffer wasn't fully sent due to flow control limits,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1438 * preserve position for future use
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1439 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1440
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1441 if (in->buf->in_file) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1442 in->buf->file_pos = file_pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1443
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1444 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1445 in->buf->pos = pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1446 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1447
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1448 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1449 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1450
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1451 next:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1452
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1453 if (in->buf->last_buf) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1454 last = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1455 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1456
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1457 in = in->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1458 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1459
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1460 ctx->in = in;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1461
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1462 if (last) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1463
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1464 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1465 "grpc output last");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1466
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1467 ctx->output_closed = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1468
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1469 if (f) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1470 f->flags |= NGX_HTTP_V2_END_STREAM_FLAG;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1471
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1472 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1473 cl = ngx_http_grpc_get_buf(r, ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1474 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1475 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1476 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1477
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1478 b = cl->buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1479
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1480 f = (ngx_http_grpc_frame_t *) b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1481 b->last += sizeof(ngx_http_grpc_frame_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1482
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1483 f->length_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1484 f->length_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1485 f->length_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1486 f->type = NGX_HTTP_V2_DATA_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1487 f->flags = NGX_HTTP_V2_END_STREAM_FLAG;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1488 f->stream_id_0 = (u_char) ((ctx->id >> 24) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1489 f->stream_id_1 = (u_char) ((ctx->id >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1490 f->stream_id_2 = (u_char) ((ctx->id >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1491 f->stream_id_3 = (u_char) (ctx->id & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1492
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1493 *ll = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1494 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1495 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1496
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1497 cl->buf->last_buf = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1498 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1499
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1500 *ll = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1501
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1502 #if (NGX_DEBUG)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1503
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1504 for (cl = out; cl; cl = cl->next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1505 ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1506 "grpc output out l:%d f:%d %p, pos %p, size: %z "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1507 "file: %O, size: %O",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1508 cl->buf->last_buf,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1509 cl->buf->in_file,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1510 cl->buf->start, cl->buf->pos,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1511 cl->buf->last - cl->buf->pos,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1512 cl->buf->file_pos,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1513 cl->buf->file_last - cl->buf->file_pos);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1514 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1515
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1516 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1517 "grpc output limit: %uz w:%z:%uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1518 limit, ctx->send_window, ctx->connection->send_window);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1519
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1520 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1521
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1522 rc = ngx_chain_writer(&r->upstream->writer, out);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1523
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1524 ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &out,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1525 (ngx_buf_tag_t) &ngx_http_grpc_body_output_filter);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1526
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1527 for (cl = ctx->free; cl; cl = cl->next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1528
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1529 /* mark original buffers as sent */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1530
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1531 if (cl->buf->shadow) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1532 if (cl->buf->last_shadow) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1533 b = cl->buf->shadow;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1534 b->pos = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1535 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1536
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1537 cl->buf->shadow = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1538 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1539 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1540
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1541 if (rc == NGX_OK && ctx->in) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1542 rc = NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1543 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1544
7350
67c6cb7f477c gRPC: disabled keepalive when sending control frames was blocked.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7349
diff changeset
1545 if (rc == NGX_AGAIN) {
67c6cb7f477c gRPC: disabled keepalive when sending control frames was blocked.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7349
diff changeset
1546 ctx->output_blocked = 1;
67c6cb7f477c gRPC: disabled keepalive when sending control frames was blocked.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7349
diff changeset
1547
67c6cb7f477c gRPC: disabled keepalive when sending control frames was blocked.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7349
diff changeset
1548 } else {
67c6cb7f477c gRPC: disabled keepalive when sending control frames was blocked.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7349
diff changeset
1549 ctx->output_blocked = 0;
67c6cb7f477c gRPC: disabled keepalive when sending control frames was blocked.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7349
diff changeset
1550 }
67c6cb7f477c gRPC: disabled keepalive when sending control frames was blocked.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7349
diff changeset
1551
7349
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1552 if (ctx->done) {
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1553
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1554 /*
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1555 * We have already got the response and were sending some additional
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1556 * control frames. Even if there is still something unsent, stop
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1557 * here anyway.
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1558 */
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1559
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1560 u = r->upstream;
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1561 u->length = 0;
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1562
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1563 if (ctx->in == NULL
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1564 && ctx->out == NULL
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1565 && ctx->output_closed
7350
67c6cb7f477c gRPC: disabled keepalive when sending control frames was blocked.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7349
diff changeset
1566 && !ctx->output_blocked
7349
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1567 && ctx->state == ngx_http_grpc_st_start)
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1568 {
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1569 u->keepalive = 1;
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1570 }
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1571
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1572 ngx_post_event(u->peer.connection->read, &ngx_posted_events);
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1573 }
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1574
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1575 return rc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1576 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1577
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1578
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1579 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1580 ngx_http_grpc_process_header(ngx_http_request_t *r)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1581 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1582 ngx_str_t *status_line;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1583 ngx_int_t rc, status;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1584 ngx_buf_t *b;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1585 ngx_table_elt_t *h;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1586 ngx_http_upstream_t *u;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1587 ngx_http_grpc_ctx_t *ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1588 ngx_http_upstream_header_t *hh;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1589 ngx_http_upstream_main_conf_t *umcf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1590
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1591 u = r->upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1592 b = &u->buffer;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1593
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1594 #if (NGX_DEBUG)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1595 if (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1596 u_char buf[512];
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1597 size_t n, m;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1598
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1599 n = ngx_min(b->last - b->pos, 256);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1600 m = ngx_hex_dump(buf, b->pos, n) - buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1601
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1602 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1603 "grpc response: %*s%s, len: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1604 m, buf, b->last - b->pos > 256 ? "..." : "",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1605 b->last - b->pos);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1606 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1607 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1608
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1609 ctx = ngx_http_grpc_get_ctx(r);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1610
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1611 if (ctx == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1612 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1613 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1614
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1615 umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1616
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1617 for ( ;; ) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1618
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1619 if (ctx->state < ngx_http_grpc_st_payload) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1620
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1621 rc = ngx_http_grpc_parse_frame(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1622
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1623 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1624
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1625 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1626 * there can be a lot of window update frames,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1627 * so we reset buffer if it is empty and we haven't
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1628 * started parsing headers yet
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1629 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1630
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1631 if (!ctx->parsing_headers) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1632 b->pos = b->start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1633 b->last = b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1634 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1635
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1636 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1637 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1638
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1639 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1640 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1641 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1642
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1643 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1644 * RFC 7540 says that implementations MUST discard frames
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1645 * that have unknown or unsupported types. However, extension
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1646 * frames that appear in the middle of a header block are
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1647 * not permitted. Also, for obvious reasons CONTINUATION frames
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1648 * cannot appear before headers, and DATA frames are not expected
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1649 * to appear before all headers are parsed.
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1650 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1651
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1652 if (ctx->type == NGX_HTTP_V2_DATA_FRAME
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1653 || (ctx->type == NGX_HTTP_V2_CONTINUATION_FRAME
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1654 && !ctx->parsing_headers)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1655 || (ctx->type != NGX_HTTP_V2_CONTINUATION_FRAME
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1656 && ctx->parsing_headers))
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1657 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1658 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1659 "upstream sent unexpected http2 frame: %d",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1660 ctx->type);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1661 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1662 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1663
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1664 if (ctx->stream_id && ctx->stream_id != ctx->id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1665 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1666 "upstream sent frame for unknown stream %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1667 ctx->stream_id);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1668 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1669 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1670 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1671
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1672 /* frame payload */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1673
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1674 if (ctx->type == NGX_HTTP_V2_RST_STREAM_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1675
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1676 rc = ngx_http_grpc_parse_rst_stream(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1677
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1678 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1679 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1680 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1681
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1682 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1683 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1684 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1685
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1686 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1687 "upstream rejected request with error %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1688 ctx->error);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1689
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1690 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1691 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1692
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1693 if (ctx->type == NGX_HTTP_V2_GOAWAY_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1694
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1695 rc = ngx_http_grpc_parse_goaway(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1696
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1697 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1698 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1699 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1700
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1701 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1702 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1703 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1704
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1705 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1706 * If stream_id is lower than one we use, our
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1707 * request won't be processed and needs to be retried.
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1708 * If stream_id is greater or equal to the one we use,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1709 * we can continue normally (except we can't use this
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1710 * connection for additional requests). If there is
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1711 * a real error, the connection will be closed.
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1712 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1713
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1714 if (ctx->stream_id < ctx->id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1715
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1716 /* TODO: we can retry non-idempotent requests */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1717
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1718 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1719 "upstream sent goaway with error %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1720 ctx->error);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1721
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1722 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1723 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1724
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1725 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1726 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1727
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1728 if (ctx->type == NGX_HTTP_V2_WINDOW_UPDATE_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1729
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1730 rc = ngx_http_grpc_parse_window_update(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1731
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1732 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1733 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1734 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1735
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1736 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1737 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1738 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1739
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1740 if (ctx->in) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1741 ngx_post_event(u->peer.connection->write, &ngx_posted_events);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1742 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1743
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1744 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1745 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1746
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1747 if (ctx->type == NGX_HTTP_V2_SETTINGS_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1748
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1749 rc = ngx_http_grpc_parse_settings(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1750
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1751 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1752 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1753 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1754
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1755 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1756 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1757 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1758
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1759 if (ctx->in) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1760 ngx_post_event(u->peer.connection->write, &ngx_posted_events);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1761 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1762
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1763 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1764 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1765
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1766 if (ctx->type == NGX_HTTP_V2_PING_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1767
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1768 rc = ngx_http_grpc_parse_ping(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1769
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1770 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1771 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1772 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1773
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1774 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1775 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1776 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1777
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1778 ngx_post_event(u->peer.connection->write, &ngx_posted_events);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1779 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1780 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1781
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1782 if (ctx->type == NGX_HTTP_V2_PUSH_PROMISE_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1783 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1784 "upstream sent unexpected push promise frame");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1785 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1786 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1787
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1788 if (ctx->type != NGX_HTTP_V2_HEADERS_FRAME
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1789 && ctx->type != NGX_HTTP_V2_CONTINUATION_FRAME)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1790 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1791 /* priority, unknown frames */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1792
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1793 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1794 ctx->rest -= b->last - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1795 b->pos = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1796 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1797 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1798
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1799 b->pos += ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1800 ctx->rest = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1801 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1802
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1803 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1804 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1805
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1806 /* headers */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1807
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1808 for ( ;; ) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1809
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1810 rc = ngx_http_grpc_parse_header(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1811
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1812 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1813 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1814 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1815
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1816 if (rc == NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1817
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1818 /* a header line has been parsed successfully */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1819
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1820 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1821 "grpc header: \"%V: %V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1822 &ctx->name, &ctx->value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1823
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1824 if (ctx->name.len && ctx->name.data[0] == ':') {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1825
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1826 if (ctx->name.len != sizeof(":status") - 1
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1827 || ngx_strncmp(ctx->name.data, ":status",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1828 sizeof(":status") - 1)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1829 != 0)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1830 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1831 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1832 "upstream sent invalid header \"%V: %V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1833 &ctx->name, &ctx->value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1834 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1835 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1836
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1837 if (ctx->status) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1838 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1839 "upstream sent duplicate :status header");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1840 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1841 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1842
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1843 status_line = &ctx->value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1844
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1845 if (status_line->len != 3) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1846 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1847 "upstream sent invalid :status \"%V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1848 status_line);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1849 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1850 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1851
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1852 status = ngx_atoi(status_line->data, 3);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1853
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1854 if (status == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1855 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1856 "upstream sent invalid :status \"%V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1857 status_line);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1858 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1859 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1860
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1861 if (status < NGX_HTTP_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1862 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1863 "upstream sent unexpected :status \"%V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1864 status_line);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1865 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1866 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1867
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1868 u->headers_in.status_n = status;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1869
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1870 if (u->state && u->state->status == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1871 u->state->status = status;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1872 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1873
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1874 ctx->status = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1875
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1876 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1877
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1878 } else if (!ctx->status) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1879 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1880 "upstream sent no :status header");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1881 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1882 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1883
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1884 h = ngx_list_push(&u->headers_in.headers);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1885 if (h == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1886 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1887 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1888
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1889 h->key = ctx->name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1890 h->value = ctx->value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1891 h->lowcase_key = h->key.data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1892 h->hash = ngx_hash_key(h->key.data, h->key.len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1893
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1894 hh = ngx_hash_find(&umcf->headers_in_hash, h->hash,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1895 h->lowcase_key, h->key.len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1896
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1897 if (hh && hh->handler(r, h, hh->offset) != NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1898 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1899 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1900
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1901 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1902 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1903
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1904 if (rc == NGX_HTTP_PARSE_HEADER_DONE) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1905
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1906 /* a whole header has been parsed successfully */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1907
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1908 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1909 "grpc header done");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1910
7235
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1911 if (ctx->end_stream) {
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1912 u->headers_in.content_length_n = 0;
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1913
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1914 if (ctx->in == NULL
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1915 && ctx->out == NULL
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1916 && ctx->output_closed
7350
67c6cb7f477c gRPC: disabled keepalive when sending control frames was blocked.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7349
diff changeset
1917 && !ctx->output_blocked
7235
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1918 && b->last == b->pos)
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1919 {
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1920 u->keepalive = 1;
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1921 }
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1922 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1923
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1924 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1925 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1926
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1927 /* there was error while a header line parsing */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1928
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1929 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1930 "upstream sent invalid header");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1931
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1932 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1933 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1934
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1935 /* rc == NGX_AGAIN */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1936
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1937 if (ctx->rest == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1938 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1939 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1940 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1941
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1942 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1943 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1944 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1945
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1946
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1947 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1948 ngx_http_grpc_filter_init(void *data)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1949 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1950 ngx_http_grpc_ctx_t *ctx = data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1951
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1952 ngx_http_request_t *r;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1953 ngx_http_upstream_t *u;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1954
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1955 r = ctx->request;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1956 u = r->upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1957
7680
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
1958 if (u->headers_in.status_n == NGX_HTTP_NO_CONTENT
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
1959 || u->headers_in.status_n == NGX_HTTP_NOT_MODIFIED
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
1960 || r->method == NGX_HTTP_HEAD)
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
1961 {
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
1962 ctx->length = 0;
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
1963
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
1964 } else {
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
1965 ctx->length = u->headers_in.content_length_n;
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
1966 }
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1967
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1968 if (ctx->end_stream) {
7680
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
1969
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
1970 if (ctx->length > 0) {
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
1971 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
1972 "upstream prematurely closed stream");
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
1973 return NGX_ERROR;
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
1974 }
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
1975
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1976 u->length = 0;
7680
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
1977
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
1978 } else {
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
1979 u->length = 1;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1980 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1981
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1982 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1983 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1984
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1985
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1986 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1987 ngx_http_grpc_filter(void *data, ssize_t bytes)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1988 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1989 ngx_http_grpc_ctx_t *ctx = data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1990
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1991 ngx_int_t rc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1992 ngx_buf_t *b, *buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1993 ngx_chain_t *cl, **ll;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1994 ngx_table_elt_t *h;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1995 ngx_http_request_t *r;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1996 ngx_http_upstream_t *u;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1997
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1998 r = ctx->request;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1999 u = r->upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2000 b = &u->buffer;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2001
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2002 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2003 "grpc filter bytes:%z", bytes);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2004
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2005 b->pos = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2006 b->last += bytes;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2007
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2008 for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2009 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2010 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2011
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2012 for ( ;; ) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2013
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2014 if (ctx->state < ngx_http_grpc_st_payload) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2015
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2016 rc = ngx_http_grpc_parse_frame(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2017
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2018 if (rc == NGX_AGAIN) {
7349
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2019
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2020 if (ctx->done) {
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2021
7680
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
2022 if (ctx->length > 0) {
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
2023 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
2024 "upstream prematurely closed stream");
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
2025 return NGX_ERROR;
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
2026 }
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
2027
7349
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2028 /*
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2029 * We have finished parsing the response and the
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2030 * remaining control frames. If there are unsent
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2031 * control frames, post a write event to send them.
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2032 */
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2033
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2034 if (ctx->out) {
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2035 ngx_post_event(u->peer.connection->write,
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2036 &ngx_posted_events);
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2037 return NGX_AGAIN;
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2038 }
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2039
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2040 u->length = 0;
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2041
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2042 if (ctx->in == NULL
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2043 && ctx->output_closed
7350
67c6cb7f477c gRPC: disabled keepalive when sending control frames was blocked.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7349
diff changeset
2044 && !ctx->output_blocked
7349
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2045 && ctx->state == ngx_http_grpc_st_start)
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2046 {
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2047 u->keepalive = 1;
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2048 }
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2049
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2050 break;
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2051 }
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2052
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2053 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2054 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2055
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2056 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2057 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2058 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2059
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2060 if ((ctx->type == NGX_HTTP_V2_CONTINUATION_FRAME
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2061 && !ctx->parsing_headers)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2062 || (ctx->type != NGX_HTTP_V2_CONTINUATION_FRAME
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2063 && ctx->parsing_headers))
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2064 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2065 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2066 "upstream sent unexpected http2 frame: %d",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2067 ctx->type);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2068 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2069 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2070
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2071 if (ctx->type == NGX_HTTP_V2_DATA_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2072
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2073 if (ctx->stream_id != ctx->id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2074 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2075 "upstream sent data frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2076 "for unknown stream %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2077 ctx->stream_id);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2078 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2079 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2080
7680
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
2081 if (ctx->length != -1) {
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
2082 if ((off_t) ctx->rest > ctx->length) {
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
2083 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
2084 "upstream sent response body larger "
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
2085 "than indicated content length");
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
2086 return NGX_ERROR;
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
2087 }
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
2088
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
2089 ctx->length -= ctx->rest;
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
2090 }
39501ce97e29 gRPC: generate error when response size is wrong.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7647
diff changeset
2091
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2092 if (ctx->rest > ctx->recv_window) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2093 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2094 "upstream violated stream flow control, "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2095 "received %uz data frame with window %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2096 ctx->rest, ctx->recv_window);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2097 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2098 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2099
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2100 if (ctx->rest > ctx->connection->recv_window) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2101 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2102 "upstream violated connection flow control, "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2103 "received %uz data frame with window %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2104 ctx->rest, ctx->connection->recv_window);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2105 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2106 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2107
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2108 ctx->recv_window -= ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2109 ctx->connection->recv_window -= ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2110
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2111 if (ctx->connection->recv_window < NGX_HTTP_V2_MAX_WINDOW / 4
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2112 || ctx->recv_window < NGX_HTTP_V2_MAX_WINDOW / 4)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2113 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2114 if (ngx_http_grpc_send_window_update(r, ctx) != NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2115 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2116 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2117
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2118 ngx_post_event(u->peer.connection->write,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2119 &ngx_posted_events);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2120 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2121 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2122
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2123 if (ctx->stream_id && ctx->stream_id != ctx->id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2124 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2125 "upstream sent frame for unknown stream %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2126 ctx->stream_id);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2127 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2128 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2129
7646
2096b21fcd10 gRPC: RST_STREAM(NO_ERROR) handling (ticket #1792).
Ruslan Ermilov <ru@nginx.com>
parents: 7619
diff changeset
2130 if (ctx->stream_id && ctx->done
7647
716eddd74bc2 gRPC: WINDOW_UPDATE after END_STREAM handling (ticket #1797).
Ruslan Ermilov <ru@nginx.com>
parents: 7646
diff changeset
2131 && ctx->type != NGX_HTTP_V2_RST_STREAM_FRAME
716eddd74bc2 gRPC: WINDOW_UPDATE after END_STREAM handling (ticket #1797).
Ruslan Ermilov <ru@nginx.com>
parents: 7646
diff changeset
2132 && ctx->type != NGX_HTTP_V2_WINDOW_UPDATE_FRAME)
7646
2096b21fcd10 gRPC: RST_STREAM(NO_ERROR) handling (ticket #1792).
Ruslan Ermilov <ru@nginx.com>
parents: 7619
diff changeset
2133 {
7349
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2134 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2135 "upstream sent frame for closed stream %ui",
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2136 ctx->stream_id);
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2137 return NGX_ERROR;
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2138 }
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2139
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2140 ctx->padding = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2141 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2142
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2143 if (ctx->state == ngx_http_grpc_st_padding) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2144
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2145 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2146 ctx->rest -= b->last - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2147 b->pos = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2148 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2149 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2150
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2151 b->pos += ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2152 ctx->rest = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2153 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2154
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2155 if (ctx->flags & NGX_HTTP_V2_END_STREAM_FLAG) {
7349
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2156 ctx->done = 1;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2157 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2158
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2159 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2160 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2161
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2162 /* frame payload */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2163
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2164 if (ctx->type == NGX_HTTP_V2_RST_STREAM_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2165
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2166 rc = ngx_http_grpc_parse_rst_stream(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2167
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2168 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2169 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2170 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2171
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2172 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2173 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2174 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2175
7646
2096b21fcd10 gRPC: RST_STREAM(NO_ERROR) handling (ticket #1792).
Ruslan Ermilov <ru@nginx.com>
parents: 7619
diff changeset
2176 if (ctx->error || !ctx->done) {
2096b21fcd10 gRPC: RST_STREAM(NO_ERROR) handling (ticket #1792).
Ruslan Ermilov <ru@nginx.com>
parents: 7619
diff changeset
2177 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2096b21fcd10 gRPC: RST_STREAM(NO_ERROR) handling (ticket #1792).
Ruslan Ermilov <ru@nginx.com>
parents: 7619
diff changeset
2178 "upstream rejected request with error %ui",
2096b21fcd10 gRPC: RST_STREAM(NO_ERROR) handling (ticket #1792).
Ruslan Ermilov <ru@nginx.com>
parents: 7619
diff changeset
2179 ctx->error);
2096b21fcd10 gRPC: RST_STREAM(NO_ERROR) handling (ticket #1792).
Ruslan Ermilov <ru@nginx.com>
parents: 7619
diff changeset
2180 return NGX_ERROR;
2096b21fcd10 gRPC: RST_STREAM(NO_ERROR) handling (ticket #1792).
Ruslan Ermilov <ru@nginx.com>
parents: 7619
diff changeset
2181 }
2096b21fcd10 gRPC: RST_STREAM(NO_ERROR) handling (ticket #1792).
Ruslan Ermilov <ru@nginx.com>
parents: 7619
diff changeset
2182
2096b21fcd10 gRPC: RST_STREAM(NO_ERROR) handling (ticket #1792).
Ruslan Ermilov <ru@nginx.com>
parents: 7619
diff changeset
2183 if (ctx->rst) {
2096b21fcd10 gRPC: RST_STREAM(NO_ERROR) handling (ticket #1792).
Ruslan Ermilov <ru@nginx.com>
parents: 7619
diff changeset
2184 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2096b21fcd10 gRPC: RST_STREAM(NO_ERROR) handling (ticket #1792).
Ruslan Ermilov <ru@nginx.com>
parents: 7619
diff changeset
2185 "upstream sent frame for closed stream %ui",
2096b21fcd10 gRPC: RST_STREAM(NO_ERROR) handling (ticket #1792).
Ruslan Ermilov <ru@nginx.com>
parents: 7619
diff changeset
2186 ctx->stream_id);
2096b21fcd10 gRPC: RST_STREAM(NO_ERROR) handling (ticket #1792).
Ruslan Ermilov <ru@nginx.com>
parents: 7619
diff changeset
2187 return NGX_ERROR;
2096b21fcd10 gRPC: RST_STREAM(NO_ERROR) handling (ticket #1792).
Ruslan Ermilov <ru@nginx.com>
parents: 7619
diff changeset
2188 }
2096b21fcd10 gRPC: RST_STREAM(NO_ERROR) handling (ticket #1792).
Ruslan Ermilov <ru@nginx.com>
parents: 7619
diff changeset
2189
2096b21fcd10 gRPC: RST_STREAM(NO_ERROR) handling (ticket #1792).
Ruslan Ermilov <ru@nginx.com>
parents: 7619
diff changeset
2190 ctx->rst = 1;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2191 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2192
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2193 if (ctx->type == NGX_HTTP_V2_GOAWAY_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2194
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2195 rc = ngx_http_grpc_parse_goaway(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2196
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2197 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2198 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2199 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2200
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2201 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2202 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2203 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2204
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2205 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2206 * If stream_id is lower than one we use, our
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2207 * request won't be processed and needs to be retried.
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2208 * If stream_id is greater or equal to the one we use,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2209 * we can continue normally (except we can't use this
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2210 * connection for additional requests). If there is
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2211 * a real error, the connection will be closed.
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2212 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2213
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2214 if (ctx->stream_id < ctx->id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2215
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2216 /* TODO: we can retry non-idempotent requests */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2217
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2218 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2219 "upstream sent goaway with error %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2220 ctx->error);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2221
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2222 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2223 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2224
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2225 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2226 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2227
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2228 if (ctx->type == NGX_HTTP_V2_WINDOW_UPDATE_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2229
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2230 rc = ngx_http_grpc_parse_window_update(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2231
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2232 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2233 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2234 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2235
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2236 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2237 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2238 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2239
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2240 if (ctx->in) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2241 ngx_post_event(u->peer.connection->write, &ngx_posted_events);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2242 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2243
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2244 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2245 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2246
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2247 if (ctx->type == NGX_HTTP_V2_SETTINGS_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2248
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2249 rc = ngx_http_grpc_parse_settings(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2250
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2251 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2252 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2253 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2254
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2255 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2256 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2257 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2258
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2259 if (ctx->in) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2260 ngx_post_event(u->peer.connection->write, &ngx_posted_events);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2261 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2262
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2263 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2264 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2265
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2266 if (ctx->type == NGX_HTTP_V2_PING_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2267
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2268 rc = ngx_http_grpc_parse_ping(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2269
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2270 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2271 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2272 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2273
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2274 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2275 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2276 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2277
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2278 ngx_post_event(u->peer.connection->write, &ngx_posted_events);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2279 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2280 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2281
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2282 if (ctx->type == NGX_HTTP_V2_PUSH_PROMISE_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2283 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2284 "upstream sent unexpected push promise frame");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2285 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2286 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2287
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2288 if (ctx->type == NGX_HTTP_V2_HEADERS_FRAME
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2289 || ctx->type == NGX_HTTP_V2_CONTINUATION_FRAME)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2290 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2291 for ( ;; ) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2292
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2293 rc = ngx_http_grpc_parse_header(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2294
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2295 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2296 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2297 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2298
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2299 if (rc == NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2300
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2301 /* a header line has been parsed successfully */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2302
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2303 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2304 "grpc trailer: \"%V: %V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2305 &ctx->name, &ctx->value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2306
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2307 if (ctx->name.len && ctx->name.data[0] == ':') {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2308 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2309 "upstream sent invalid "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2310 "trailer \"%V: %V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2311 &ctx->name, &ctx->value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2312 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2313 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2314
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2315 h = ngx_list_push(&u->headers_in.trailers);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2316 if (h == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2317 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2318 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2319
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2320 h->key = ctx->name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2321 h->value = ctx->value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2322 h->lowcase_key = h->key.data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2323 h->hash = ngx_hash_key(h->key.data, h->key.len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2324
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2325 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2326 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2327
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2328 if (rc == NGX_HTTP_PARSE_HEADER_DONE) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2329
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2330 /* a whole header has been parsed successfully */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2331
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2332 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2333 "grpc trailer done");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2334
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2335 if (ctx->end_stream) {
7349
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2336 ctx->done = 1;
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2337 break;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2338 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2339
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2340 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2341 "upstream sent trailer without "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2342 "end stream flag");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2343 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2344 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2345
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2346 /* there was error while a header line parsing */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2347
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2348 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2349 "upstream sent invalid trailer");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2350
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2351 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2352 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2353
7349
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2354 if (rc == NGX_HTTP_PARSE_HEADER_DONE) {
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2355 continue;
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2356 }
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2357
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2358 /* rc == NGX_AGAIN */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2359
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2360 if (ctx->rest == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2361 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2362 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2363 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2364
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2365 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2366 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2367
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2368 if (ctx->type != NGX_HTTP_V2_DATA_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2369
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2370 /* priority, unknown frames */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2371
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2372 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2373 ctx->rest -= b->last - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2374 b->pos = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2375 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2376 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2377
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2378 b->pos += ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2379 ctx->rest = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2380 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2381
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2382 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2383 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2384
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2385 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2386 * data frame:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2387 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2388 * +---------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2389 * |Pad Length? (8)|
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2390 * +---------------+-----------------------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2391 * | Data (*) ...
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2392 * +---------------------------------------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2393 * | Padding (*) ...
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2394 * +---------------------------------------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2395 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2396
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2397 if (ctx->flags & NGX_HTTP_V2_PADDED_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2398
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2399 if (ctx->rest == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2400 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2401 "upstream sent too short http2 frame");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2402 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2403 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2404
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2405 if (b->pos == b->last) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2406 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2407 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2408
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2409 ctx->flags &= ~NGX_HTTP_V2_PADDED_FLAG;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2410 ctx->padding = *b->pos++;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2411 ctx->rest -= 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2412
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2413 if (ctx->padding > ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2414 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2415 "upstream sent http2 frame with too long "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2416 "padding: %d in frame %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2417 ctx->padding, ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2418 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2419 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2420
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2421 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2422 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2423
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2424 if (ctx->rest == ctx->padding) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2425 goto done;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2426 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2427
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2428 if (b->pos == b->last) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2429 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2430 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2431
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2432 cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2433 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2434 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2435 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2436
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2437 *ll = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2438 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2439
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2440 buf = cl->buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2441
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2442 buf->flush = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2443 buf->memory = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2444
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2445 buf->pos = b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2446 buf->tag = u->output.tag;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2447
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2448 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2449 "grpc output buf %p", buf->pos);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2450
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2451 if (b->last - b->pos < (ssize_t) ctx->rest - ctx->padding) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2452
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2453 ctx->rest -= b->last - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2454 b->pos = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2455 buf->last = b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2456
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2457 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2458 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2459
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2460 b->pos += ctx->rest - ctx->padding;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2461 buf->last = b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2462 ctx->rest = ctx->padding;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2463
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2464 done:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2465
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2466 if (ctx->padding) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2467 ctx->state = ngx_http_grpc_st_padding;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2468 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2469 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2470
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2471 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2472
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2473 if (ctx->flags & NGX_HTTP_V2_END_STREAM_FLAG) {
7349
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2474 ctx->done = 1;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2475 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2476 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2477
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2478 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2479 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2480
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2481
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2482 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2483 ngx_http_grpc_parse_frame(ngx_http_request_t *r, ngx_http_grpc_ctx_t *ctx,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2484 ngx_buf_t *b)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2485 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2486 u_char ch, *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2487 ngx_http_grpc_state_e state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2488
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2489 state = ctx->state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2490
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2491 for (p = b->pos; p < b->last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2492 ch = *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2493
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2494 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2495 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2496 "grpc frame byte: %02Xd, s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2497 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2498
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2499 switch (state) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2500
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2501 case ngx_http_grpc_st_start:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2502 ctx->rest = ch << 16;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2503 state = ngx_http_grpc_st_length_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2504 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2505
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2506 case ngx_http_grpc_st_length_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2507 ctx->rest |= ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2508 state = ngx_http_grpc_st_length_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2509 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2510
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2511 case ngx_http_grpc_st_length_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2512 ctx->rest |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2513
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2514 if (ctx->rest > NGX_HTTP_V2_DEFAULT_FRAME_SIZE) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2515 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2516 "upstream sent too large http2 frame: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2517 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2518 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2519 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2520
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2521 state = ngx_http_grpc_st_type;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2522 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2523
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2524 case ngx_http_grpc_st_type:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2525 ctx->type = ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2526 state = ngx_http_grpc_st_flags;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2527 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2528
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2529 case ngx_http_grpc_st_flags:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2530 ctx->flags = ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2531 state = ngx_http_grpc_st_stream_id;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2532 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2533
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2534 case ngx_http_grpc_st_stream_id:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2535 ctx->stream_id = (ch & 0x7f) << 24;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2536 state = ngx_http_grpc_st_stream_id_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2537 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2538
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2539 case ngx_http_grpc_st_stream_id_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2540 ctx->stream_id |= ch << 16;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2541 state = ngx_http_grpc_st_stream_id_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2542 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2543
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2544 case ngx_http_grpc_st_stream_id_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2545 ctx->stream_id |= ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2546 state = ngx_http_grpc_st_stream_id_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2547 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2548
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2549 case ngx_http_grpc_st_stream_id_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2550 ctx->stream_id |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2551
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2552 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2553 "grpc frame: %d, len: %uz, f:%d, i:%ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2554 ctx->type, ctx->rest, ctx->flags, ctx->stream_id);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2555
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2556 b->pos = p + 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2557
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2558 ctx->state = ngx_http_grpc_st_payload;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2559 ctx->frame_state = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2560
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2561 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2562
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2563 /* suppress warning */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2564 case ngx_http_grpc_st_payload:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2565 case ngx_http_grpc_st_padding:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2566 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2567 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2568 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2569
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2570 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2571 ctx->state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2572
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2573 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2574 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2575
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2576
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2577 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2578 ngx_http_grpc_parse_header(ngx_http_request_t *r, ngx_http_grpc_ctx_t *ctx,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2579 ngx_buf_t *b)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2580 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2581 u_char ch, *p, *last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2582 size_t min;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2583 ngx_int_t rc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2584 enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2585 sw_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2586 sw_padding_length,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2587 sw_dependency,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2588 sw_dependency_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2589 sw_dependency_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2590 sw_dependency_4,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2591 sw_weight,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2592 sw_fragment,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2593 sw_padding
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2594 } state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2595
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2596 state = ctx->frame_state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2597
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2598 if (state == sw_start) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2599
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2600 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2601 "grpc parse header: start");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2602
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2603 if (ctx->type == NGX_HTTP_V2_HEADERS_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2604 ctx->parsing_headers = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2605 ctx->fragment_state = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2606
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2607 min = (ctx->flags & NGX_HTTP_V2_PADDED_FLAG ? 1 : 0)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2608 + (ctx->flags & NGX_HTTP_V2_PRIORITY_FLAG ? 5 : 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2609
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2610 if (ctx->rest < min) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2611 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2612 "upstream sent headers frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2613 "with invalid length: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2614 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2615 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2616 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2617
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2618 if (ctx->flags & NGX_HTTP_V2_END_STREAM_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2619 ctx->end_stream = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2620 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2621
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2622 if (ctx->flags & NGX_HTTP_V2_PADDED_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2623 state = sw_padding_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2624
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2625 } else if (ctx->flags & NGX_HTTP_V2_PRIORITY_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2626 state = sw_dependency;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2627
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2628 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2629 state = sw_fragment;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2630 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2631
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2632 } else if (ctx->type == NGX_HTTP_V2_CONTINUATION_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2633 state = sw_fragment;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2634 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2635
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2636 ctx->padding = 0;
7242
25a4353633a0 gRPC: fixed missing state save in frame header parsing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7240
diff changeset
2637 ctx->frame_state = state;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2638 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2639
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2640 if (state < sw_fragment) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2641
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2642 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2643 last = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2644
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2645 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2646 last = b->pos + ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2647 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2648
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2649 for (p = b->pos; p < last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2650 ch = *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2651
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2652 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2653 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2654 "grpc header byte: %02Xd s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2655 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2656
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2657 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2658 * headers frame:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2659 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2660 * +---------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2661 * |Pad Length? (8)|
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2662 * +-+-------------+----------------------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2663 * |E| Stream Dependency? (31) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2664 * +-+-------------+----------------------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2665 * | Weight? (8) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2666 * +-+-------------+----------------------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2667 * | Header Block Fragment (*) ...
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2668 * +--------------------------------------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2669 * | Padding (*) ...
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2670 * +--------------------------------------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2671 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2672
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2673 switch (state) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2674
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2675 case sw_padding_length:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2676
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2677 ctx->padding = ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2678
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2679 if (ctx->flags & NGX_HTTP_V2_PRIORITY_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2680 state = sw_dependency;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2681 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2682 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2683
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2684 goto fragment;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2685
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2686 case sw_dependency:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2687 state = sw_dependency_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2688 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2689
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2690 case sw_dependency_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2691 state = sw_dependency_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2692 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2693
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2694 case sw_dependency_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2695 state = sw_dependency_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2696 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2697
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2698 case sw_dependency_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2699 state = sw_weight;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2700 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2701
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2702 case sw_weight:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2703 goto fragment;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2704
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2705 /* suppress warning */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2706 case sw_start:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2707 case sw_fragment:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2708 case sw_padding:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2709 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2710 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2711 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2712
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2713 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2714 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2715
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2716 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2717 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2718
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2719 fragment:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2720
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2721 p++;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2722 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2723 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2724
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2725 if (ctx->padding > ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2726 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2727 "upstream sent http2 frame with too long "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2728 "padding: %d in frame %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2729 ctx->padding, ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2730 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2731 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2732
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2733 state = sw_fragment;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2734 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2735 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2736
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2737 if (state == sw_fragment) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2738
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2739 rc = ngx_http_grpc_parse_fragment(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2740
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2741 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2742 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2743 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2744
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2745 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2746 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2747 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2748
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2749 if (rc == NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2750 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2751 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2752
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2753 /* rc == NGX_DONE */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2754
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2755 state = sw_padding;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2756 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2757 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2758
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2759 if (state == sw_padding) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2760
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2761 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2762
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2763 ctx->rest -= b->last - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2764 b->pos = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2765
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2766 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2767 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2768
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2769 b->pos += ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2770 ctx->rest = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2771
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2772 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2773
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2774 if (ctx->flags & NGX_HTTP_V2_END_HEADERS_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2775
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2776 if (ctx->fragment_state) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2777 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2778 "upstream sent truncated http2 header");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2779 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2780 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2781
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2782 ctx->parsing_headers = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2783
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2784 return NGX_HTTP_PARSE_HEADER_DONE;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2785 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2786
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2787 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2788 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2789
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2790 /* unreachable */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2791
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2792 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2793 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2794
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2795
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2796 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2797 ngx_http_grpc_parse_fragment(ngx_http_request_t *r, ngx_http_grpc_ctx_t *ctx,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2798 ngx_buf_t *b)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2799 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2800 u_char ch, *p, *last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2801 size_t size;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2802 ngx_uint_t index, size_update;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2803 enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2804 sw_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2805 sw_index,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2806 sw_name_length,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2807 sw_name_length_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2808 sw_name_length_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2809 sw_name_length_4,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2810 sw_name,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2811 sw_name_bytes,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2812 sw_value_length,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2813 sw_value_length_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2814 sw_value_length_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2815 sw_value_length_4,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2816 sw_value,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2817 sw_value_bytes
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2818 } state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2819
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2820 /* header block fragment */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2821
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2822 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2823 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2824 "grpc header fragment %p:%p rest:%uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2825 b->pos, b->last, ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2826 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2827
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2828 if (b->last - b->pos < (ssize_t) ctx->rest - ctx->padding) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2829 last = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2830
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2831 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2832 last = b->pos + ctx->rest - ctx->padding;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2833 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2834
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2835 state = ctx->fragment_state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2836
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2837 for (p = b->pos; p < last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2838 ch = *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2839
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2840 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2841 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2842 "grpc header byte: %02Xd s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2843 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2844
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2845 switch (state) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2846
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2847 case sw_start:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2848 ctx->index = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2849
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2850 if ((ch & 0x80) == 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2851 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2852 * indexed header:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2853 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2854 * 0 1 2 3 4 5 6 7
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2855 * +---+---+---+---+---+---+---+---+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2856 * | 1 | Index (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2857 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2858 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2859
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2860 index = ch & ~0x80;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2861
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2862 if (index == 0 || index > 61) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2863 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2864 "upstream sent invalid http2 "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2865 "table index: %ui", index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2866 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2867 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2868
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2869 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2870 "grpc indexed header: %ui", index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2871
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2872 ctx->index = index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2873 ctx->literal = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2874
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2875 goto done;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2876
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2877 } else if ((ch & 0xc0) == 0x40) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2878 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2879 * literal header with incremental indexing:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2880 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2881 * 0 1 2 3 4 5 6 7
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2882 * +---+---+---+---+---+---+---+---+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2883 * | 0 | 1 | Index (6+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2884 * +---+---+-----------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2885 * | H | Value Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2886 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2887 * | Value String (Length octets) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2888 * +-------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2889 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2890 * 0 1 2 3 4 5 6 7
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2891 * +---+---+---+---+---+---+---+---+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2892 * | 0 | 1 | 0 |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2893 * +---+---+-----------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2894 * | H | Name Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2895 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2896 * | Name String (Length octets) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2897 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2898 * | H | Value Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2899 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2900 * | Value String (Length octets) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2901 * +-------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2902 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2903
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2904 index = ch & ~0xc0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2905
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2906 if (index > 61) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2907 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2908 "upstream sent invalid http2 "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2909 "table index: %ui", index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2910 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2911 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2912
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2913 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2914 "grpc literal header: %ui", index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2915
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2916 if (index == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2917 state = sw_name_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2918 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2919 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2920
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2921 ctx->index = index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2922 ctx->literal = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2923
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2924 state = sw_value_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2925 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2926
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2927 } else if ((ch & 0xe0) == 0x20) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2928 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2929 * dynamic table size update:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2930 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2931 * 0 1 2 3 4 5 6 7
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2932 * +---+---+---+---+---+---+---+---+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2933 * | 0 | 0 | 1 | Max size (5+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2934 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2935 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2936
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2937 size_update = ch & ~0xe0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2938
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2939 if (size_update > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2940 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2941 "upstream sent invalid http2 "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2942 "dynamic table size update: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2943 size_update);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2944 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2945 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2946
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2947 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2948 "grpc table size update: %ui", size_update);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2949
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2950 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2951
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2952 } else if ((ch & 0xf0) == 0x10) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2953 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2954 * literal header field never indexed:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2955 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2956 * 0 1 2 3 4 5 6 7
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2957 * +---+---+---+---+---+---+---+---+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2958 * | 0 | 0 | 0 | 1 | Index (4+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2959 * +---+---+-----------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2960 * | H | Value Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2961 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2962 * | Value String (Length octets) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2963 * +-------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2964 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2965 * 0 1 2 3 4 5 6 7
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2966 * +---+---+---+---+---+---+---+---+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2967 * | 0 | 0 | 0 | 1 | 0 |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2968 * +---+---+-----------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2969 * | H | Name Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2970 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2971 * | Name String (Length octets) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2972 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2973 * | H | Value Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2974 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2975 * | Value String (Length octets) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2976 * +-------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2977 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2978
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2979 index = ch & ~0xf0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2980
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2981 if (index == 0x0f) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2982 ctx->index = index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2983 ctx->literal = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2984 state = sw_index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2985 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2986 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2987
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2988 if (index == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2989 state = sw_name_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2990 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2991 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2992
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2993 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2994 "grpc literal header never indexed: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2995 index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2996
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2997 ctx->index = index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2998 ctx->literal = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2999
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3000 state = sw_value_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3001 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3002
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3003 } else if ((ch & 0xf0) == 0x00) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3004 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3005 * literal header field without indexing:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3006 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3007 * 0 1 2 3 4 5 6 7
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3008 * +---+---+---+---+---+---+---+---+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3009 * | 0 | 0 | 0 | 0 | Index (4+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3010 * +---+---+-----------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3011 * | H | Value Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3012 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3013 * | Value String (Length octets) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3014 * +-------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3015 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3016 * 0 1 2 3 4 5 6 7
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3017 * +---+---+---+---+---+---+---+---+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3018 * | 0 | 0 | 0 | 0 | 0 |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3019 * +---+---+-----------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3020 * | H | Name Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3021 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3022 * | Name String (Length octets) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3023 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3024 * | H | Value Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3025 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3026 * | Value String (Length octets) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3027 * +-------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3028 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3029
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3030 index = ch & ~0xf0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3031
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3032 if (index == 0x0f) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3033 ctx->index = index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3034 ctx->literal = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3035 state = sw_index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3036 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3037 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3038
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3039 if (index == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3040 state = sw_name_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3041 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3042 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3043
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3044 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3045 "grpc literal header without indexing: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3046 index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3047
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3048 ctx->index = index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3049 ctx->literal = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3050
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3051 state = sw_value_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3052 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3053 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3054
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3055 /* not reached */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3056
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3057 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3058
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3059 case sw_index:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3060 ctx->index = ctx->index + (ch & ~0x80);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3061
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3062 if (ch & 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3063 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3064 "upstream sent http2 table index "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3065 "with continuation flag");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3066 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3067 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3068
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3069 if (ctx->index > 61) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3070 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3071 "upstream sent invalid http2 "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3072 "table index: %ui", ctx->index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3073 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3074 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3075
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3076 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3077 "grpc header index: %ui", ctx->index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3078
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3079 state = sw_value_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3080 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3081
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3082 case sw_name_length:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3083 ctx->field_huffman = ch & 0x80 ? 1 : 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3084 ctx->field_length = ch & ~0x80;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3085
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3086 if (ctx->field_length == 0x7f) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3087 state = sw_name_length_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3088 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3089 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3090
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3091 if (ctx->field_length == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3092 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3093 "upstream sent zero http2 "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3094 "header name length");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3095 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3096 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3097
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3098 state = sw_name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3099 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3100
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3101 case sw_name_length_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3102 ctx->field_length += ch & ~0x80;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3103
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3104 if (ch & 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3105 state = sw_name_length_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3106 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3107 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3108
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3109 state = sw_name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3110 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3111
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3112 case sw_name_length_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3113 ctx->field_length += (ch & ~0x80) << 7;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3114
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3115 if (ch & 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3116 state = sw_name_length_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3117 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3118 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3119
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3120 state = sw_name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3121 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3122
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3123 case sw_name_length_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3124 ctx->field_length += (ch & ~0x80) << 14;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3125
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3126 if (ch & 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3127 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3128 "upstream sent too large http2 "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3129 "header name length");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3130 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3131 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3132
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3133 state = sw_name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3134 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3135
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3136 case sw_name:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3137 ctx->name.len = ctx->field_huffman ?
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3138 ctx->field_length * 8 / 5 : ctx->field_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3139
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3140 ctx->name.data = ngx_pnalloc(r->pool, ctx->name.len + 1);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3141 if (ctx->name.data == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3142 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3143 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3144
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3145 ctx->field_end = ctx->name.data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3146 ctx->field_rest = ctx->field_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3147 ctx->field_state = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3148
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3149 state = sw_name_bytes;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3150
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3151 /* fall through */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3152
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3153 case sw_name_bytes:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3154
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3155 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3156 "grpc name: len:%uz h:%d last:%uz, rest:%uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3157 ctx->field_length,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3158 ctx->field_huffman,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3159 last - p,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3160 ctx->rest - (p - b->pos));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3161
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3162 size = ngx_min(last - p, (ssize_t) ctx->field_rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3163 ctx->field_rest -= size;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3164
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3165 if (ctx->field_huffman) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3166 if (ngx_http_v2_huff_decode(&ctx->field_state, p, size,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3167 &ctx->field_end,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3168 ctx->field_rest == 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3169 r->connection->log)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3170 != NGX_OK)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3171 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3172 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3173 "upstream sent invalid encoded header");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3174 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3175 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3176
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3177 ctx->name.len = ctx->field_end - ctx->name.data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3178 ctx->name.data[ctx->name.len] = '\0';
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3179
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3180 } else {
7240
413189f03c8d gRPC: fixed parsing response headers split on CONTINUATION frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7235
diff changeset
3181 ctx->field_end = ngx_cpymem(ctx->field_end, p, size);
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3182 ctx->name.data[ctx->name.len] = '\0';
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3183 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3184
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3185 p += size - 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3186
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3187 if (ctx->field_rest == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3188 state = sw_value_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3189 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3190
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3191 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3192
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3193 case sw_value_length:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3194 ctx->field_huffman = ch & 0x80 ? 1 : 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3195 ctx->field_length = ch & ~0x80;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3196
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3197 if (ctx->field_length == 0x7f) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3198 state = sw_value_length_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3199 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3200 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3201
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3202 if (ctx->field_length == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3203 ngx_str_set(&ctx->value, "");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3204 goto done;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3205 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3206
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3207 state = sw_value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3208 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3209
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3210 case sw_value_length_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3211 ctx->field_length += ch & ~0x80;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3212
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3213 if (ch & 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3214 state = sw_value_length_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3215 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3216 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3217
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3218 state = sw_value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3219 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3220
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3221 case sw_value_length_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3222 ctx->field_length += (ch & ~0x80) << 7;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3223
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3224 if (ch & 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3225 state = sw_value_length_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3226 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3227 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3228
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3229 state = sw_value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3230 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3231
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3232 case sw_value_length_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3233 ctx->field_length += (ch & ~0x80) << 14;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3234
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3235 if (ch & 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3236 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3237 "upstream sent too large http2 "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3238 "header value length");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3239 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3240 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3241
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3242 state = sw_value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3243 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3244
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3245 case sw_value:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3246 ctx->value.len = ctx->field_huffman ?
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3247 ctx->field_length * 8 / 5 : ctx->field_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3248
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3249 ctx->value.data = ngx_pnalloc(r->pool, ctx->value.len + 1);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3250 if (ctx->value.data == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3251 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3252 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3253
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3254 ctx->field_end = ctx->value.data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3255 ctx->field_rest = ctx->field_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3256 ctx->field_state = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3257
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3258 state = sw_value_bytes;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3259
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3260 /* fall through */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3261
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3262 case sw_value_bytes:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3263
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3264 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3265 "grpc value: len:%uz h:%d last:%uz, rest:%uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3266 ctx->field_length,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3267 ctx->field_huffman,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3268 last - p,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3269 ctx->rest - (p - b->pos));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3270
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3271 size = ngx_min(last - p, (ssize_t) ctx->field_rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3272 ctx->field_rest -= size;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3273
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3274 if (ctx->field_huffman) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3275 if (ngx_http_v2_huff_decode(&ctx->field_state, p, size,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3276 &ctx->field_end,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3277 ctx->field_rest == 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3278 r->connection->log)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3279 != NGX_OK)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3280 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3281 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3282 "upstream sent invalid encoded header");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3283 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3284 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3285
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3286 ctx->value.len = ctx->field_end - ctx->value.data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3287 ctx->value.data[ctx->value.len] = '\0';
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3288
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3289 } else {
7240
413189f03c8d gRPC: fixed parsing response headers split on CONTINUATION frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7235
diff changeset
3290 ctx->field_end = ngx_cpymem(ctx->field_end, p, size);
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3291 ctx->value.data[ctx->value.len] = '\0';
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3292 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3293
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3294 p += size - 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3295
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3296 if (ctx->field_rest == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3297 goto done;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3298 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3299
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3300 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3301 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3302
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3303 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3304
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3305 done:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3306
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3307 p++;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3308 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3309 ctx->fragment_state = sw_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3310 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3311
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3312 if (ctx->index) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3313 ctx->name = *ngx_http_v2_get_static_name(ctx->index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3314 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3315
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3316 if (ctx->index && !ctx->literal) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3317 ctx->value = *ngx_http_v2_get_static_value(ctx->index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3318 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3319
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3320 if (!ctx->index) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3321 if (ngx_http_grpc_validate_header_name(r, &ctx->name) != NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3322 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3323 "upstream sent invalid header: \"%V: %V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3324 &ctx->name, &ctx->value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3325 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3326 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3327 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3328
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3329 if (!ctx->index || ctx->literal) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3330 if (ngx_http_grpc_validate_header_value(r, &ctx->value) != NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3331 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3332 "upstream sent invalid header: \"%V: %V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3333 &ctx->name, &ctx->value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3334 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3335 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3336 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3337
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3338 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3339 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3340
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3341 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3342 ctx->fragment_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3343 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3344
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3345 if (ctx->rest > ctx->padding) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3346 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3347 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3348
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3349 return NGX_DONE;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3350 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3351
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3352
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3353 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3354 ngx_http_grpc_validate_header_name(ngx_http_request_t *r, ngx_str_t *s)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3355 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3356 u_char ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3357 ngx_uint_t i;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3358
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3359 for (i = 0; i < s->len; i++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3360 ch = s->data[i];
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3361
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3362 if (ch == ':' && i > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3363 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3364 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3365
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3366 if (ch >= 'A' && ch <= 'Z') {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3367 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3368 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3369
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3370 if (ch == '\0' || ch == CR || ch == LF) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3371 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3372 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3373 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3374
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3375 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3376 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3377
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3378
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3379 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3380 ngx_http_grpc_validate_header_value(ngx_http_request_t *r, ngx_str_t *s)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3381 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3382 u_char ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3383 ngx_uint_t i;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3384
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3385 for (i = 0; i < s->len; i++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3386 ch = s->data[i];
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3387
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3388 if (ch == '\0' || ch == CR || ch == LF) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3389 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3390 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3391 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3392
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3393 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3394 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3395
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3396
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3397 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3398 ngx_http_grpc_parse_rst_stream(ngx_http_request_t *r, ngx_http_grpc_ctx_t *ctx,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3399 ngx_buf_t *b)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3400 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3401 u_char ch, *p, *last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3402 enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3403 sw_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3404 sw_error_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3405 sw_error_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3406 sw_error_4
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3407 } state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3408
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3409 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3410 last = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3411
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3412 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3413 last = b->pos + ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3414 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3415
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3416 state = ctx->frame_state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3417
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3418 if (state == sw_start) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3419 if (ctx->rest != 4) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3420 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3421 "upstream sent rst stream frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3422 "with invalid length: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3423 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3424 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3425 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3426 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3427
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3428 for (p = b->pos; p < last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3429 ch = *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3430
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3431 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3432 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3433 "grpc rst byte: %02Xd s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3434 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3435
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3436 switch (state) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3437
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3438 case sw_start:
7249
070c972336c4 gRPC: fixed possible sign extension of error and setting_value.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7242
diff changeset
3439 ctx->error = (ngx_uint_t) ch << 24;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3440 state = sw_error_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3441 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3442
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3443 case sw_error_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3444 ctx->error |= ch << 16;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3445 state = sw_error_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3446 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3447
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3448 case sw_error_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3449 ctx->error |= ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3450 state = sw_error_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3451 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3452
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3453 case sw_error_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3454 ctx->error |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3455 state = sw_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3456
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3457 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3458 "grpc error: %ui", ctx->error);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3459
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3460 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3461 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3462 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3463
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3464 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3465 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3466 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3467
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3468 if (ctx->rest > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3469 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3470 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3471
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3472 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3473 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3474
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3475
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3476 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3477 ngx_http_grpc_parse_goaway(ngx_http_request_t *r, ngx_http_grpc_ctx_t *ctx,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3478 ngx_buf_t *b)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3479 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3480 u_char ch, *p, *last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3481 enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3482 sw_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3483 sw_last_stream_id_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3484 sw_last_stream_id_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3485 sw_last_stream_id_4,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3486 sw_error,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3487 sw_error_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3488 sw_error_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3489 sw_error_4,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3490 sw_debug
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3491 } state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3492
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3493 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3494 last = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3495
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3496 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3497 last = b->pos + ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3498 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3499
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3500 state = ctx->frame_state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3501
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3502 if (state == sw_start) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3503
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3504 if (ctx->stream_id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3505 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3506 "upstream sent goaway frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3507 "with non-zero stream id: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3508 ctx->stream_id);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3509 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3510 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3511
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3512 if (ctx->rest < 8) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3513 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3514 "upstream sent goaway frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3515 "with invalid length: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3516 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3517 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3518 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3519 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3520
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3521 for (p = b->pos; p < last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3522 ch = *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3523
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3524 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3525 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3526 "grpc goaway byte: %02Xd s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3527 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3528
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3529 switch (state) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3530
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3531 case sw_start:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3532 ctx->stream_id = (ch & 0x7f) << 24;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3533 state = sw_last_stream_id_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3534 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3535
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3536 case sw_last_stream_id_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3537 ctx->stream_id |= ch << 16;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3538 state = sw_last_stream_id_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3539 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3540
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3541 case sw_last_stream_id_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3542 ctx->stream_id |= ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3543 state = sw_last_stream_id_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3544 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3545
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3546 case sw_last_stream_id_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3547 ctx->stream_id |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3548 state = sw_error;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3549 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3550
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3551 case sw_error:
7249
070c972336c4 gRPC: fixed possible sign extension of error and setting_value.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7242
diff changeset
3552 ctx->error = (ngx_uint_t) ch << 24;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3553 state = sw_error_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3554 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3555
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3556 case sw_error_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3557 ctx->error |= ch << 16;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3558 state = sw_error_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3559 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3560
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3561 case sw_error_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3562 ctx->error |= ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3563 state = sw_error_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3564 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3565
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3566 case sw_error_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3567 ctx->error |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3568 state = sw_debug;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3569 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3570
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3571 case sw_debug:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3572 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3573 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3574 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3575
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3576 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3577 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3578 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3579
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3580 if (ctx->rest > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3581 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3582 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3583
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3584 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3585 "grpc goaway: %ui, stream %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3586 ctx->error, ctx->stream_id);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3587
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3588 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3589
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3590 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3591 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3592
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3593
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3594 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3595 ngx_http_grpc_parse_window_update(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3596 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3597 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3598 u_char ch, *p, *last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3599 enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3600 sw_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3601 sw_size_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3602 sw_size_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3603 sw_size_4
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3604 } state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3605
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3606 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3607 last = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3608
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3609 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3610 last = b->pos + ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3611 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3612
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3613 state = ctx->frame_state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3614
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3615 if (state == sw_start) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3616 if (ctx->rest != 4) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3617 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3618 "upstream sent window update frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3619 "with invalid length: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3620 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3621 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3622 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3623 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3624
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3625 for (p = b->pos; p < last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3626 ch = *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3627
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3628 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3629 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3630 "grpc window update byte: %02Xd s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3631 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3632
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3633 switch (state) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3634
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3635 case sw_start:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3636 ctx->window_update = (ch & 0x7f) << 24;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3637 state = sw_size_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3638 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3639
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3640 case sw_size_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3641 ctx->window_update |= ch << 16;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3642 state = sw_size_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3643 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3644
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3645 case sw_size_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3646 ctx->window_update |= ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3647 state = sw_size_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3648 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3649
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3650 case sw_size_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3651 ctx->window_update |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3652 state = sw_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3653 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3654 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3655 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3656
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3657 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3658 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3659 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3660
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3661 if (ctx->rest > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3662 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3663 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3664
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3665 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3666
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3667 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3668 "grpc window update: %ui", ctx->window_update);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3669
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3670 if (ctx->stream_id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3671
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3672 if (ctx->window_update > (size_t) NGX_HTTP_V2_MAX_WINDOW
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3673 - ctx->send_window)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3674 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3675 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3676 "upstream sent too large window update");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3677 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3678 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3679
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3680 ctx->send_window += ctx->window_update;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3681
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3682 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3683
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3684 if (ctx->window_update > NGX_HTTP_V2_MAX_WINDOW
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3685 - ctx->connection->send_window)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3686 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3687 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3688 "upstream sent too large window update");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3689 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3690 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3691
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3692 ctx->connection->send_window += ctx->window_update;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3693 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3694
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3695 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3696 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3697
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3698
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3699 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3700 ngx_http_grpc_parse_settings(ngx_http_request_t *r, ngx_http_grpc_ctx_t *ctx,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3701 ngx_buf_t *b)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3702 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3703 u_char ch, *p, *last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3704 ssize_t window_update;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3705 enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3706 sw_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3707 sw_id,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3708 sw_id_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3709 sw_value,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3710 sw_value_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3711 sw_value_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3712 sw_value_4
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3713 } state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3714
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3715 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3716 last = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3717
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3718 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3719 last = b->pos + ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3720 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3721
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3722 state = ctx->frame_state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3723
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3724 if (state == sw_start) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3725
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3726 if (ctx->stream_id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3727 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3728 "upstream sent settings frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3729 "with non-zero stream id: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3730 ctx->stream_id);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3731 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3732 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3733
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3734 if (ctx->flags & NGX_HTTP_V2_ACK_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3735 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3736 "grpc settings ack");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3737
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3738 if (ctx->rest != 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3739 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3740 "upstream sent settings frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3741 "with ack flag and non-zero length: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3742 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3743 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3744 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3745
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3746 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3747
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3748 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3749 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3750
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3751 if (ctx->rest % 6 != 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3752 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3753 "upstream sent settings frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3754 "with invalid length: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3755 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3756 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3757 }
7379
57463f4e2fcd gRPC: limited allocations due to ping and settings frames.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7371
diff changeset
3758
57463f4e2fcd gRPC: limited allocations due to ping and settings frames.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7371
diff changeset
3759 if (ctx->free == NULL && ctx->settings++ > 1000) {
57463f4e2fcd gRPC: limited allocations due to ping and settings frames.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7371
diff changeset
3760 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
57463f4e2fcd gRPC: limited allocations due to ping and settings frames.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7371
diff changeset
3761 "upstream sent too many settings frames");
57463f4e2fcd gRPC: limited allocations due to ping and settings frames.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7371
diff changeset
3762 return NGX_ERROR;
57463f4e2fcd gRPC: limited allocations due to ping and settings frames.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7371
diff changeset
3763 }
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3764 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3765
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3766 for (p = b->pos; p < last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3767 ch = *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3768
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3769 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3770 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3771 "grpc settings byte: %02Xd s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3772 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3773
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3774 switch (state) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3775
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3776 case sw_start:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3777 case sw_id:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3778 ctx->setting_id = ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3779 state = sw_id_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3780 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3781
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3782 case sw_id_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3783 ctx->setting_id |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3784 state = sw_value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3785 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3786
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3787 case sw_value:
7249
070c972336c4 gRPC: fixed possible sign extension of error and setting_value.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7242
diff changeset
3788 ctx->setting_value = (ngx_uint_t) ch << 24;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3789 state = sw_value_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3790 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3791
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3792 case sw_value_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3793 ctx->setting_value |= ch << 16;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3794 state = sw_value_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3795 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3796
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3797 case sw_value_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3798 ctx->setting_value |= ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3799 state = sw_value_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3800 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3801
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3802 case sw_value_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3803 ctx->setting_value |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3804 state = sw_id;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3805
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3806 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3807 "grpc setting: %ui %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3808 ctx->setting_id, ctx->setting_value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3809
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3810 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3811 * The following settings are defined by the protocol:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3812 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3813 * SETTINGS_HEADER_TABLE_SIZE, SETTINGS_ENABLE_PUSH,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3814 * SETTINGS_MAX_CONCURRENT_STREAMS, SETTINGS_INITIAL_WINDOW_SIZE,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3815 * SETTINGS_MAX_FRAME_SIZE, SETTINGS_MAX_HEADER_LIST_SIZE
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3816 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3817 * Only SETTINGS_INITIAL_WINDOW_SIZE seems to be needed in
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3818 * a simple client.
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3819 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3820
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3821 if (ctx->setting_id == 0x04) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3822 /* SETTINGS_INITIAL_WINDOW_SIZE */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3823
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3824 if (ctx->setting_value > NGX_HTTP_V2_MAX_WINDOW) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3825 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3826 "upstream sent settings frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3827 "with too large initial window size: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3828 ctx->setting_value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3829 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3830 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3831
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3832 window_update = ctx->setting_value
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3833 - ctx->connection->init_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3834 ctx->connection->init_window = ctx->setting_value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3835
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3836 if (ctx->send_window > 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3837 && window_update > (ssize_t) NGX_HTTP_V2_MAX_WINDOW
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3838 - ctx->send_window)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3839 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3840 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3841 "upstream sent settings frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3842 "with too large initial window size: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3843 ctx->setting_value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3844 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3845 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3846
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3847 ctx->send_window += window_update;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3848 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3849
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3850 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3851 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3852 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3853
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3854 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3855 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3856 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3857
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3858 if (ctx->rest > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3859 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3860 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3861
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3862 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3863
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3864 return ngx_http_grpc_send_settings_ack(r, ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3865 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3866
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3867
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3868 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3869 ngx_http_grpc_parse_ping(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3870 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3871 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3872 u_char ch, *p, *last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3873 enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3874 sw_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3875 sw_data_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3876 sw_data_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3877 sw_data_4,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3878 sw_data_5,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3879 sw_data_6,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3880 sw_data_7,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3881 sw_data_8
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3882 } state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3883
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3884 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3885 last = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3886
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3887 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3888 last = b->pos + ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3889 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3890
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3891 state = ctx->frame_state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3892
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3893 if (state == sw_start) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3894
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3895 if (ctx->stream_id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3896 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3897 "upstream sent ping frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3898 "with non-zero stream id: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3899 ctx->stream_id);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3900 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3901 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3902
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3903 if (ctx->rest != 8) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3904 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3905 "upstream sent ping frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3906 "with invalid length: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3907 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3908 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3909 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3910
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3911 if (ctx->flags & NGX_HTTP_V2_ACK_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3912 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3913 "upstream sent ping frame with ack flag");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3914 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3915 }
7379
57463f4e2fcd gRPC: limited allocations due to ping and settings frames.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7371
diff changeset
3916
57463f4e2fcd gRPC: limited allocations due to ping and settings frames.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7371
diff changeset
3917 if (ctx->free == NULL && ctx->pings++ > 1000) {
57463f4e2fcd gRPC: limited allocations due to ping and settings frames.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7371
diff changeset
3918 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
57463f4e2fcd gRPC: limited allocations due to ping and settings frames.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7371
diff changeset
3919 "upstream sent too many ping frames");
57463f4e2fcd gRPC: limited allocations due to ping and settings frames.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7371
diff changeset
3920 return NGX_ERROR;
57463f4e2fcd gRPC: limited allocations due to ping and settings frames.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7371
diff changeset
3921 }
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3922 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3923
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3924 for (p = b->pos; p < last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3925 ch = *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3926
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3927 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3928 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3929 "grpc ping byte: %02Xd s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3930 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3931
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3932 if (state < sw_data_8) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3933 ctx->ping_data[state] = ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3934 state++;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3935
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3936 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3937 ctx->ping_data[7] = ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3938 state = sw_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3939
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3940 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3941 "grpc ping");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3942 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3943 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3944
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3945 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3946 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3947 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3948
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3949 if (ctx->rest > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3950 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3951 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3952
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3953 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3954
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3955 return ngx_http_grpc_send_ping_ack(r, ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3956 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3957
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3958
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3959 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3960 ngx_http_grpc_send_settings_ack(ngx_http_request_t *r, ngx_http_grpc_ctx_t *ctx)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3961 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3962 ngx_chain_t *cl, **ll;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3963 ngx_http_grpc_frame_t *f;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3964
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3965 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3966 "grpc send settings ack");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3967
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3968 for (cl = ctx->out, ll = &ctx->out; cl; cl = cl->next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3969 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3970 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3971
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3972 cl = ngx_http_grpc_get_buf(r, ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3973 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3974 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3975 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3976
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3977 f = (ngx_http_grpc_frame_t *) cl->buf->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3978 cl->buf->last += sizeof(ngx_http_grpc_frame_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3979
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3980 f->length_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3981 f->length_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3982 f->length_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3983 f->type = NGX_HTTP_V2_SETTINGS_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3984 f->flags = NGX_HTTP_V2_ACK_FLAG;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3985 f->stream_id_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3986 f->stream_id_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3987 f->stream_id_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3988 f->stream_id_3 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3989
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3990 *ll = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3991
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3992 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3993 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3994
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3995
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3996 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3997 ngx_http_grpc_send_ping_ack(ngx_http_request_t *r, ngx_http_grpc_ctx_t *ctx)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3998 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3999 ngx_chain_t *cl, **ll;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4000 ngx_http_grpc_frame_t *f;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4001
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4002 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4003 "grpc send ping ack");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4004
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4005 for (cl = ctx->out, ll = &ctx->out; cl; cl = cl->next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4006 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4007 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4008
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4009 cl = ngx_http_grpc_get_buf(r, ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4010 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4011 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4012 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4013
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4014 f = (ngx_http_grpc_frame_t *) cl->buf->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4015 cl->buf->last += sizeof(ngx_http_grpc_frame_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4016
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4017 f->length_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4018 f->length_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4019 f->length_2 = 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4020 f->type = NGX_HTTP_V2_PING_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4021 f->flags = NGX_HTTP_V2_ACK_FLAG;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4022 f->stream_id_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4023 f->stream_id_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4024 f->stream_id_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4025 f->stream_id_3 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4026
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4027 cl->buf->last = ngx_copy(cl->buf->last, ctx->ping_data, 8);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4028
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4029 *ll = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4030
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4031 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4032 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4033
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4034
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4035 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4036 ngx_http_grpc_send_window_update(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4037 ngx_http_grpc_ctx_t *ctx)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4038 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4039 size_t n;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4040 ngx_chain_t *cl, **ll;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4041 ngx_http_grpc_frame_t *f;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4042
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4043 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4044 "grpc send window update: %uz %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4045 ctx->connection->recv_window, ctx->recv_window);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4046
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4047 for (cl = ctx->out, ll = &ctx->out; cl; cl = cl->next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4048 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4049 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4050
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4051 cl = ngx_http_grpc_get_buf(r, ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4052 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4053 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4054 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4055
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4056 f = (ngx_http_grpc_frame_t *) cl->buf->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4057 cl->buf->last += sizeof(ngx_http_grpc_frame_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4058
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4059 f->length_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4060 f->length_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4061 f->length_2 = 4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4062 f->type = NGX_HTTP_V2_WINDOW_UPDATE_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4063 f->flags = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4064 f->stream_id_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4065 f->stream_id_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4066 f->stream_id_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4067 f->stream_id_3 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4068
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4069 n = NGX_HTTP_V2_MAX_WINDOW - ctx->connection->recv_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4070 ctx->connection->recv_window = NGX_HTTP_V2_MAX_WINDOW;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4071
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4072 *cl->buf->last++ = (u_char) ((n >> 24) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4073 *cl->buf->last++ = (u_char) ((n >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4074 *cl->buf->last++ = (u_char) ((n >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4075 *cl->buf->last++ = (u_char) (n & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4076
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4077 f = (ngx_http_grpc_frame_t *) cl->buf->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4078 cl->buf->last += sizeof(ngx_http_grpc_frame_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4079
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4080 f->length_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4081 f->length_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4082 f->length_2 = 4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4083 f->type = NGX_HTTP_V2_WINDOW_UPDATE_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4084 f->flags = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4085 f->stream_id_0 = (u_char) ((ctx->id >> 24) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4086 f->stream_id_1 = (u_char) ((ctx->id >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4087 f->stream_id_2 = (u_char) ((ctx->id >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4088 f->stream_id_3 = (u_char) (ctx->id & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4089
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4090 n = NGX_HTTP_V2_MAX_WINDOW - ctx->recv_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4091 ctx->recv_window = NGX_HTTP_V2_MAX_WINDOW;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4092
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4093 *cl->buf->last++ = (u_char) ((n >> 24) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4094 *cl->buf->last++ = (u_char) ((n >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4095 *cl->buf->last++ = (u_char) ((n >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4096 *cl->buf->last++ = (u_char) (n & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4097
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4098 *ll = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4099
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4100 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4101 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4102
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4103
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4104 static ngx_chain_t *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4105 ngx_http_grpc_get_buf(ngx_http_request_t *r, ngx_http_grpc_ctx_t *ctx)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4106 {
7305
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4107 u_char *start;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4108 ngx_buf_t *b;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4109 ngx_chain_t *cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4110
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4111 cl = ngx_chain_get_free_buf(r->pool, &ctx->free);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4112 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4113 return NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4114 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4115
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4116 b = cl->buf;
7305
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4117 start = b->start;
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4118
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4119 if (start == NULL) {
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4120
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4121 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4122 * each buffer is large enough to hold two window update
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4123 * frames in a row
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4124 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4125
7305
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4126 start = ngx_palloc(r->pool, 2 * sizeof(ngx_http_grpc_frame_t) + 8);
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4127 if (start == NULL) {
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4128 return NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4129 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4130
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4131 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4132
7305
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4133 ngx_memzero(b, sizeof(ngx_buf_t));
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4134
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4135 b->start = start;
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4136 b->pos = start;
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4137 b->last = start;
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4138 b->end = start + 2 * sizeof(ngx_http_grpc_frame_t) + 8;
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4139
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4140 b->tag = (ngx_buf_tag_t) &ngx_http_grpc_body_output_filter;
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4141 b->temporary = 1;
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4142 b->flush = 1;
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4143
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4144 return cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4145 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4146
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4147
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4148 static ngx_http_grpc_ctx_t *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4149 ngx_http_grpc_get_ctx(ngx_http_request_t *r)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4150 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4151 ngx_http_grpc_ctx_t *ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4152 ngx_http_upstream_t *u;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4153
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4154 ctx = ngx_http_get_module_ctx(r, ngx_http_grpc_module);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4155
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4156 if (ctx->connection == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4157 u = r->upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4158
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4159 if (ngx_http_grpc_get_connection_data(r, ctx, &u->peer) != NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4160 return NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4161 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4162 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4163
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4164 return ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4165 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4166
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4167
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4168 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4169 ngx_http_grpc_get_connection_data(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4170 ngx_http_grpc_ctx_t *ctx, ngx_peer_connection_t *pc)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4171 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4172 ngx_connection_t *c;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4173 ngx_pool_cleanup_t *cln;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4174
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4175 c = pc->connection;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4176
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4177 if (pc->cached) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4178
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4179 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4180 * for cached connections, connection data can be found
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4181 * in the cleanup handler
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4182 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4183
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4184 for (cln = c->pool->cleanup; cln; cln = cln->next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4185 if (cln->handler == ngx_http_grpc_cleanup) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4186 ctx->connection = cln->data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4187 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4188 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4189 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4190
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4191 if (ctx->connection == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4192 ngx_log_error(NGX_LOG_ERR, c->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4193 "no connection data found for "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4194 "keepalive http2 connection");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4195 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4196 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4197
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4198 ctx->send_window = ctx->connection->init_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4199 ctx->recv_window = NGX_HTTP_V2_MAX_WINDOW;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4200
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4201 ctx->connection->last_stream_id += 2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4202 ctx->id = ctx->connection->last_stream_id;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4203
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4204 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4205 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4206
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4207 cln = ngx_pool_cleanup_add(c->pool, sizeof(ngx_http_grpc_conn_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4208 if (cln == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4209 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4210 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4211
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4212 cln->handler = ngx_http_grpc_cleanup;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4213 ctx->connection = cln->data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4214
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4215 ctx->connection->init_window = NGX_HTTP_V2_DEFAULT_WINDOW;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4216 ctx->connection->send_window = NGX_HTTP_V2_DEFAULT_WINDOW;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4217 ctx->connection->recv_window = NGX_HTTP_V2_MAX_WINDOW;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4218
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4219 ctx->send_window = NGX_HTTP_V2_DEFAULT_WINDOW;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4220 ctx->recv_window = NGX_HTTP_V2_MAX_WINDOW;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4221
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4222 ctx->id = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4223 ctx->connection->last_stream_id = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4224
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4225 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4226 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4227
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4228
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4229 static void
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4230 ngx_http_grpc_cleanup(void *data)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4231 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4232 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4233 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4234 "grpc cleanup");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4235 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4236 return;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4237 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4238
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4239
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4240 static void
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4241 ngx_http_grpc_abort_request(ngx_http_request_t *r)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4242 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4243 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4244 "abort grpc request");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4245 return;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4246 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4247
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4248
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4249 static void
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4250 ngx_http_grpc_finalize_request(ngx_http_request_t *r, ngx_int_t rc)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4251 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4252 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4253 "finalize grpc request");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4254 return;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4255 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4256
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4257
7234
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4258 static ngx_int_t
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4259 ngx_http_grpc_internal_trailers_variable(ngx_http_request_t *r,
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4260 ngx_http_variable_value_t *v, uintptr_t data)
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4261 {
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4262 ngx_table_elt_t *te;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4263
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4264 te = r->headers_in.te;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4265
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4266 if (te == NULL) {
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4267 v->not_found = 1;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4268 return NGX_OK;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4269 }
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4270
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4271 if (ngx_strlcasestrn(te->value.data, te->value.data + te->value.len,
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4272 (u_char *) "trailers", 8 - 1)
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4273 == NULL)
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4274 {
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4275 v->not_found = 1;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4276 return NGX_OK;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4277 }
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4278
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4279 v->valid = 1;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4280 v->no_cacheable = 0;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4281 v->not_found = 0;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4282
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4283 v->data = (u_char *) "trailers";
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4284 v->len = sizeof("trailers") - 1;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4285
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4286 return NGX_OK;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4287 }
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4288
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4289
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4290 static ngx_int_t
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4291 ngx_http_grpc_add_variables(ngx_conf_t *cf)
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4292 {
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4293 ngx_http_variable_t *var, *v;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4294
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4295 for (v = ngx_http_grpc_vars; v->name.len; v++) {
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4296 var = ngx_http_add_variable(cf, &v->name, v->flags);
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4297 if (var == NULL) {
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4298 return NGX_ERROR;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4299 }
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4300
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4301 var->get_handler = v->get_handler;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4302 var->data = v->data;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4303 }
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4304
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4305 return NGX_OK;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4306 }
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4307
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4308
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4309 static void *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4310 ngx_http_grpc_create_loc_conf(ngx_conf_t *cf)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4311 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4312 ngx_http_grpc_loc_conf_t *conf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4313
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4314 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_grpc_loc_conf_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4315 if (conf == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4316 return NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4317 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4318
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4319 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4320 * set by ngx_pcalloc():
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4321 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4322 * conf->upstream.ignore_headers = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4323 * conf->upstream.next_upstream = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4324 * conf->upstream.hide_headers_hash = { NULL, 0 };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4325 * conf->upstream.ssl_name = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4326 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4327 * conf->headers.lengths = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4328 * conf->headers.values = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4329 * conf->headers.hash = { NULL, 0 };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4330 * conf->host = { 0, NULL };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4331 * conf->host_set = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4332 * conf->ssl = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4333 * conf->ssl_protocols = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4334 * conf->ssl_ciphers = { 0, NULL };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4335 * conf->ssl_trusted_certificate = { 0, NULL };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4336 * conf->ssl_crl = { 0, NULL };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4337 * conf->ssl_certificate = { 0, NULL };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4338 * conf->ssl_certificate_key = { 0, NULL };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4339 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4340
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4341 conf->upstream.local = NGX_CONF_UNSET_PTR;
7371
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7350
diff changeset
4342 conf->upstream.socket_keepalive = NGX_CONF_UNSET;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4343 conf->upstream.next_upstream_tries = NGX_CONF_UNSET_UINT;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4344 conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4345 conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4346 conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4347 conf->upstream.next_upstream_timeout = NGX_CONF_UNSET_MSEC;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4348
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4349 conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4350
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4351 conf->upstream.hide_headers = NGX_CONF_UNSET_PTR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4352 conf->upstream.pass_headers = NGX_CONF_UNSET_PTR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4353
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4354 conf->upstream.intercept_errors = NGX_CONF_UNSET;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4355
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4356 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4357 conf->upstream.ssl_session_reuse = NGX_CONF_UNSET;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4358 conf->upstream.ssl_server_name = NGX_CONF_UNSET;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4359 conf->upstream.ssl_verify = NGX_CONF_UNSET;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4360 conf->ssl_verify_depth = NGX_CONF_UNSET_UINT;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4361 conf->ssl_passwords = NGX_CONF_UNSET_PTR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4362 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4363
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4364 /* the hardcoded values */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4365 conf->upstream.cyclic_temp_file = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4366 conf->upstream.buffering = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4367 conf->upstream.ignore_client_abort = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4368 conf->upstream.send_lowat = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4369 conf->upstream.bufs.num = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4370 conf->upstream.busy_buffers_size = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4371 conf->upstream.max_temp_file_size = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4372 conf->upstream.temp_file_write_size = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4373 conf->upstream.pass_request_headers = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4374 conf->upstream.pass_request_body = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4375 conf->upstream.force_ranges = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4376 conf->upstream.pass_trailers = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4377 conf->upstream.preserve_output = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4378
7728
485dba3e2a01 Core: ngx_conf_set_keyval_slot() now accepts NGX_CONF_UNSET_PTR.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7680
diff changeset
4379 conf->headers_source = NGX_CONF_UNSET_PTR;
485dba3e2a01 Core: ngx_conf_set_keyval_slot() now accepts NGX_CONF_UNSET_PTR.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7680
diff changeset
4380
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4381 ngx_str_set(&conf->upstream.module, "grpc");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4382
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4383 return conf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4384 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4385
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4386
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4387 static char *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4388 ngx_http_grpc_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4389 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4390 ngx_http_grpc_loc_conf_t *prev = parent;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4391 ngx_http_grpc_loc_conf_t *conf = child;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4392
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4393 ngx_int_t rc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4394 ngx_hash_init_t hash;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4395 ngx_http_core_loc_conf_t *clcf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4396
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4397 ngx_conf_merge_ptr_value(conf->upstream.local,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4398 prev->upstream.local, NULL);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4399
7371
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7350
diff changeset
4400 ngx_conf_merge_value(conf->upstream.socket_keepalive,
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7350
diff changeset
4401 prev->upstream.socket_keepalive, 0);
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7350
diff changeset
4402
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4403 ngx_conf_merge_uint_value(conf->upstream.next_upstream_tries,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4404 prev->upstream.next_upstream_tries, 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4405
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4406 ngx_conf_merge_msec_value(conf->upstream.connect_timeout,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4407 prev->upstream.connect_timeout, 60000);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4408
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4409 ngx_conf_merge_msec_value(conf->upstream.send_timeout,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4410 prev->upstream.send_timeout, 60000);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4411
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4412 ngx_conf_merge_msec_value(conf->upstream.read_timeout,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4413 prev->upstream.read_timeout, 60000);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4414
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4415 ngx_conf_merge_msec_value(conf->upstream.next_upstream_timeout,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4416 prev->upstream.next_upstream_timeout, 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4417
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4418 ngx_conf_merge_size_value(conf->upstream.buffer_size,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4419 prev->upstream.buffer_size,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4420 (size_t) ngx_pagesize);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4421
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4422 ngx_conf_merge_bitmask_value(conf->upstream.ignore_headers,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4423 prev->upstream.ignore_headers,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4424 NGX_CONF_BITMASK_SET);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4425
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4426 ngx_conf_merge_bitmask_value(conf->upstream.next_upstream,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4427 prev->upstream.next_upstream,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4428 (NGX_CONF_BITMASK_SET
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4429 |NGX_HTTP_UPSTREAM_FT_ERROR
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4430 |NGX_HTTP_UPSTREAM_FT_TIMEOUT));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4431
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4432 if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4433 conf->upstream.next_upstream = NGX_CONF_BITMASK_SET
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4434 |NGX_HTTP_UPSTREAM_FT_OFF;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4435 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4436
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4437 ngx_conf_merge_value(conf->upstream.intercept_errors,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4438 prev->upstream.intercept_errors, 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4439
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4440 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4441
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4442 ngx_conf_merge_value(conf->upstream.ssl_session_reuse,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4443 prev->upstream.ssl_session_reuse, 1);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4444
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4445 ngx_conf_merge_bitmask_value(conf->ssl_protocols, prev->ssl_protocols,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4446 (NGX_CONF_BITMASK_SET|NGX_SSL_TLSv1
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4447 |NGX_SSL_TLSv1_1|NGX_SSL_TLSv1_2));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4448
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4449 ngx_conf_merge_str_value(conf->ssl_ciphers, prev->ssl_ciphers,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4450 "DEFAULT");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4451
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4452 if (conf->upstream.ssl_name == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4453 conf->upstream.ssl_name = prev->upstream.ssl_name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4454 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4455
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4456 ngx_conf_merge_value(conf->upstream.ssl_server_name,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4457 prev->upstream.ssl_server_name, 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4458 ngx_conf_merge_value(conf->upstream.ssl_verify,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4459 prev->upstream.ssl_verify, 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4460 ngx_conf_merge_uint_value(conf->ssl_verify_depth,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4461 prev->ssl_verify_depth, 1);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4462 ngx_conf_merge_str_value(conf->ssl_trusted_certificate,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4463 prev->ssl_trusted_certificate, "");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4464 ngx_conf_merge_str_value(conf->ssl_crl, prev->ssl_crl, "");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4465
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4466 ngx_conf_merge_str_value(conf->ssl_certificate,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4467 prev->ssl_certificate, "");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4468 ngx_conf_merge_str_value(conf->ssl_certificate_key,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4469 prev->ssl_certificate_key, "");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4470 ngx_conf_merge_ptr_value(conf->ssl_passwords, prev->ssl_passwords, NULL);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4471
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4472 if (conf->ssl && ngx_http_grpc_set_ssl(cf, conf) != NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4473 return NGX_CONF_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4474 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4475
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4476 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4477
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4478 hash.max_size = 512;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4479 hash.bucket_size = ngx_align(64, ngx_cacheline_size);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4480 hash.name = "grpc_headers_hash";
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4481
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4482 if (ngx_http_upstream_hide_headers_hash(cf, &conf->upstream,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4483 &prev->upstream, ngx_http_grpc_hide_headers, &hash)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4484 != NGX_OK)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4485 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4486 return NGX_CONF_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4487 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4488
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4489 clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4490
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4491 if (clcf->noname
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4492 && conf->upstream.upstream == NULL && conf->grpc_lengths == NULL)
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4493 {
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4494 conf->upstream.upstream = prev->upstream.upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4495 conf->host = prev->host;
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4496
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4497 conf->grpc_lengths = prev->grpc_lengths;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4498 conf->grpc_values = prev->grpc_values;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4499
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4500 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4501 conf->upstream.ssl = prev->upstream.ssl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4502 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4503 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4504
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4505 if (clcf->lmt_excpt && clcf->handler == NULL
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4506 && (conf->upstream.upstream || conf->grpc_lengths))
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4507 {
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4508 clcf->handler = ngx_http_grpc_handler;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4509 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4510
7728
485dba3e2a01 Core: ngx_conf_set_keyval_slot() now accepts NGX_CONF_UNSET_PTR.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7680
diff changeset
4511 ngx_conf_merge_ptr_value(conf->headers_source, prev->headers_source, NULL);
485dba3e2a01 Core: ngx_conf_set_keyval_slot() now accepts NGX_CONF_UNSET_PTR.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7680
diff changeset
4512
485dba3e2a01 Core: ngx_conf_set_keyval_slot() now accepts NGX_CONF_UNSET_PTR.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7680
diff changeset
4513 if (conf->headers_source == prev->headers_source) {
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4514 conf->headers = prev->headers;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4515 conf->host_set = prev->host_set;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4516 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4517
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4518 rc = ngx_http_grpc_init_headers(cf, conf, &conf->headers,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4519 ngx_http_grpc_headers);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4520 if (rc != NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4521 return NGX_CONF_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4522 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4523
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4524 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4525 * special handling to preserve conf->headers in the "http" section
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4526 * to inherit it to all servers
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4527 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4528
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4529 if (prev->headers.hash.buckets == NULL
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4530 && conf->headers_source == prev->headers_source)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4531 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4532 prev->headers = conf->headers;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4533 prev->host_set = conf->host_set;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4534 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4535
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4536 return NGX_CONF_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4537 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4538
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4539
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4540 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4541 ngx_http_grpc_init_headers(ngx_conf_t *cf, ngx_http_grpc_loc_conf_t *conf,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4542 ngx_http_grpc_headers_t *headers, ngx_keyval_t *default_headers)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4543 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4544 u_char *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4545 size_t size;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4546 uintptr_t *code;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4547 ngx_uint_t i;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4548 ngx_array_t headers_names, headers_merged;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4549 ngx_keyval_t *src, *s, *h;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4550 ngx_hash_key_t *hk;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4551 ngx_hash_init_t hash;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4552 ngx_http_script_compile_t sc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4553 ngx_http_script_copy_code_t *copy;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4554
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4555 if (headers->hash.buckets) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4556 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4557 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4558
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4559 if (ngx_array_init(&headers_names, cf->temp_pool, 4, sizeof(ngx_hash_key_t))
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4560 != NGX_OK)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4561 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4562 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4563 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4564
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4565 if (ngx_array_init(&headers_merged, cf->temp_pool, 4, sizeof(ngx_keyval_t))
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4566 != NGX_OK)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4567 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4568 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4569 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4570
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4571 headers->lengths = ngx_array_create(cf->pool, 64, 1);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4572 if (headers->lengths == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4573 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4574 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4575
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4576 headers->values = ngx_array_create(cf->pool, 512, 1);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4577 if (headers->values == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4578 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4579 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4580
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4581 if (conf->headers_source) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4582
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4583 src = conf->headers_source->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4584 for (i = 0; i < conf->headers_source->nelts; i++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4585
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4586 if (src[i].key.len == 4
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4587 && ngx_strncasecmp(src[i].key.data, (u_char *) "Host", 4) == 0)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4588 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4589 conf->host_set = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4590 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4591
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4592 s = ngx_array_push(&headers_merged);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4593 if (s == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4594 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4595 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4596
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4597 *s = src[i];
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4598 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4599 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4600
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4601 h = default_headers;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4602
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4603 while (h->key.len) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4604
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4605 src = headers_merged.elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4606 for (i = 0; i < headers_merged.nelts; i++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4607 if (ngx_strcasecmp(h->key.data, src[i].key.data) == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4608 goto next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4609 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4610 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4611
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4612 s = ngx_array_push(&headers_merged);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4613 if (s == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4614 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4615 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4616
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4617 *s = *h;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4618
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4619 next:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4620
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4621 h++;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4622 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4623
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4624
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4625 src = headers_merged.elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4626 for (i = 0; i < headers_merged.nelts; i++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4627
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4628 hk = ngx_array_push(&headers_names);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4629 if (hk == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4630 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4631 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4632
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4633 hk->key = src[i].key;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4634 hk->key_hash = ngx_hash_key_lc(src[i].key.data, src[i].key.len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4635 hk->value = (void *) 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4636
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4637 if (src[i].value.len == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4638 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4639 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4640
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4641 copy = ngx_array_push_n(headers->lengths,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4642 sizeof(ngx_http_script_copy_code_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4643 if (copy == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4644 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4645 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4646
7271
9e25a5380a21 Silenced -Wcast-function-type warnings (closes #1546).
Sergey Kandaurov <pluknet@nginx.com>
parents: 7249
diff changeset
4647 copy->code = (ngx_http_script_code_pt) (void *)
9e25a5380a21 Silenced -Wcast-function-type warnings (closes #1546).
Sergey Kandaurov <pluknet@nginx.com>
parents: 7249
diff changeset
4648 ngx_http_script_copy_len_code;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4649 copy->len = src[i].key.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4650
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4651 size = (sizeof(ngx_http_script_copy_code_t)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4652 + src[i].key.len + sizeof(uintptr_t) - 1)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4653 & ~(sizeof(uintptr_t) - 1);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4654
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4655 copy = ngx_array_push_n(headers->values, size);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4656 if (copy == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4657 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4658 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4659
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4660 copy->code = ngx_http_script_copy_code;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4661 copy->len = src[i].key.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4662
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4663 p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4664 ngx_memcpy(p, src[i].key.data, src[i].key.len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4665
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4666 ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4667
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4668 sc.cf = cf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4669 sc.source = &src[i].value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4670 sc.flushes = &headers->flushes;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4671 sc.lengths = &headers->lengths;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4672 sc.values = &headers->values;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4673
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4674 if (ngx_http_script_compile(&sc) != NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4675 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4676 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4677
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4678 code = ngx_array_push_n(headers->lengths, sizeof(uintptr_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4679 if (code == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4680 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4681 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4682
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4683 *code = (uintptr_t) NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4684
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4685 code = ngx_array_push_n(headers->values, sizeof(uintptr_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4686 if (code == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4687 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4688 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4689
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4690 *code = (uintptr_t) NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4691 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4692
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4693 code = ngx_array_push_n(headers->lengths, sizeof(uintptr_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4694 if (code == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4695 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4696 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4697
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4698 *code = (uintptr_t) NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4699
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4700
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4701 hash.hash = &headers->hash;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4702 hash.key = ngx_hash_key_lc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4703 hash.max_size = 512;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4704 hash.bucket_size = 64;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4705 hash.name = "grpc_headers_hash";
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4706 hash.pool = cf->pool;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4707 hash.temp_pool = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4708
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4709 return ngx_hash_init(&hash, headers_names.elts, headers_names.nelts);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4710 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4711
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4712
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4713 static char *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4714 ngx_http_grpc_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4715 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4716 ngx_http_grpc_loc_conf_t *glcf = conf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4717
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4718 size_t add;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4719 ngx_str_t *value, *url;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4720 ngx_url_t u;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4721 ngx_uint_t n;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4722 ngx_http_core_loc_conf_t *clcf;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4723 ngx_http_script_compile_t sc;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4724
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4725 if (glcf->upstream.upstream || glcf->grpc_lengths) {
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4726 return "is duplicate";
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4727 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4728
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4729 clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4730
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4731 clcf->handler = ngx_http_grpc_handler;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4732
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4733 if (clcf->name.len && clcf->name.data[clcf->name.len - 1] == '/') {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4734 clcf->auto_redirect = 1;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4735 }
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4736
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4737 value = cf->args->elts;
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4738
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4739 url = &value[1];
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4740
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4741 n = ngx_http_script_variables_count(url);
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4742
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4743 if (n) {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4744
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4745 ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4746
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4747 sc.cf = cf;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4748 sc.source = url;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4749 sc.lengths = &glcf->grpc_lengths;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4750 sc.values = &glcf->grpc_values;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4751 sc.variables = n;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4752 sc.complete_lengths = 1;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4753 sc.complete_values = 1;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4754
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4755 if (ngx_http_script_compile(&sc) != NGX_OK) {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4756 return NGX_CONF_ERROR;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4757 }
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4758
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4759 #if (NGX_HTTP_SSL)
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4760 glcf->ssl = 1;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4761 #endif
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4762
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4763 return NGX_CONF_OK;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4764 }
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4765
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4766 if (ngx_strncasecmp(url->data, (u_char *) "grpc://", 7) == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4767 add = 7;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4768
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4769 } else if (ngx_strncasecmp(url->data, (u_char *) "grpcs://", 8) == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4770
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4771 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4772 glcf->ssl = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4773
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4774 add = 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4775 #else
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4776 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4777 "grpcs protocol requires SSL support");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4778 return NGX_CONF_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4779 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4780
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4781 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4782 add = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4783 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4784
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4785 ngx_memzero(&u, sizeof(ngx_url_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4786
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4787 u.url.len = url->len - add;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4788 u.url.data = url->data + add;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4789 u.no_resolve = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4790
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4791 glcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4792 if (glcf->upstream.upstream == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4793 return NGX_CONF_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4794 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4795
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4796 if (u.family != AF_UNIX) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4797
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4798 if (u.no_port) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4799 glcf->host = u.host;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4800
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4801 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4802 glcf->host.len = u.host.len + 1 + u.port_text.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4803 glcf->host.data = u.host.data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4804 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4805
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4806 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4807 ngx_str_set(&glcf->host, "localhost");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4808 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4809
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4810 return NGX_CONF_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4811 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4812
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4813
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4814 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4815
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4816 static char *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4817 ngx_http_grpc_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4818 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4819 ngx_http_grpc_loc_conf_t *glcf = conf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4820
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4821 ngx_str_t *value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4822
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4823 if (glcf->ssl_passwords != NGX_CONF_UNSET_PTR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4824 return "is duplicate";
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4825 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4826
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4827 value = cf->args->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4828
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4829 glcf->ssl_passwords = ngx_ssl_read_password_file(cf, &value[1]);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4830
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4831 if (glcf->ssl_passwords == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4832 return NGX_CONF_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4833 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4834
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4835 return NGX_CONF_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4836 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4837
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4838
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4839 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4840 ngx_http_grpc_set_ssl(ngx_conf_t *cf, ngx_http_grpc_loc_conf_t *glcf)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4841 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4842 ngx_pool_cleanup_t *cln;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4843
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4844 glcf->upstream.ssl = ngx_pcalloc(cf->pool, sizeof(ngx_ssl_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4845 if (glcf->upstream.ssl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4846 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4847 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4848
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4849 glcf->upstream.ssl->log = cf->log;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4850
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4851 if (ngx_ssl_create(glcf->upstream.ssl, glcf->ssl_protocols, NULL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4852 != NGX_OK)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4853 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4854 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4855 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4856
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4857 cln = ngx_pool_cleanup_add(cf->pool, 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4858 if (cln == NULL) {
7473
8981dbb12254 SSL: fixed potential leak on memory allocation errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7379
diff changeset
4859 ngx_ssl_cleanup_ctx(glcf->upstream.ssl);
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4860 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4861 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4862
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4863 cln->handler = ngx_ssl_cleanup_ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4864 cln->data = glcf->upstream.ssl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4865
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4866 if (glcf->ssl_certificate.len) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4867
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4868 if (glcf->ssl_certificate_key.len == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4869 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4870 "no \"grpc_ssl_certificate_key\" is defined "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4871 "for certificate \"%V\"", &glcf->ssl_certificate);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4872 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4873 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4874
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4875 if (ngx_ssl_certificate(cf, glcf->upstream.ssl, &glcf->ssl_certificate,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4876 &glcf->ssl_certificate_key, glcf->ssl_passwords)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4877 != NGX_OK)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4878 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4879 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4880 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4881 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4882
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4883 if (ngx_ssl_ciphers(cf, glcf->upstream.ssl, &glcf->ssl_ciphers, 0)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4884 != NGX_OK)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4885 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4886 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4887 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4888
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4889 if (glcf->upstream.ssl_verify) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4890 if (glcf->ssl_trusted_certificate.len == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4891 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4892 "no grpc_ssl_trusted_certificate for grpc_ssl_verify");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4893 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4894 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4895
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4896 if (ngx_ssl_trusted_certificate(cf, glcf->upstream.ssl,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4897 &glcf->ssl_trusted_certificate,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4898 glcf->ssl_verify_depth)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4899 != NGX_OK)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4900 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4901 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4902 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4903
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4904 if (ngx_ssl_crl(cf, glcf->upstream.ssl, &glcf->ssl_crl) != NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4905 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4906 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4907 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4908
7320
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7305
diff changeset
4909 if (ngx_ssl_client_session_cache(cf, glcf->upstream.ssl,
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7305
diff changeset
4910 glcf->upstream.ssl_session_reuse)
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7305
diff changeset
4911 != NGX_OK)
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7305
diff changeset
4912 {
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7305
diff changeset
4913 return NGX_ERROR;
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7305
diff changeset
4914 }
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7305
diff changeset
4915
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4916 #ifdef TLSEXT_TYPE_application_layer_protocol_negotiation
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4917
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4918 if (SSL_CTX_set_alpn_protos(glcf->upstream.ssl->ctx,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4919 (u_char *) "\x02h2", 3)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4920 != 0)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4921 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4922 ngx_ssl_error(NGX_LOG_EMERG, cf->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4923 "SSL_CTX_set_alpn_protos() failed");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4924 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4925 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4926
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4927 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4928
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4929 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4930 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4931
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4932 #endif