annotate src/http/modules/ngx_http_grpc_module.c @ 7619:6439ef81e37d

gRPC: variables support in the "grpc_pass" directive.
author Vladimir Homutov <vl@nginx.com>
date Fri, 17 Jan 2020 12:13:02 +0300
parents 8981dbb12254
children 2096b21fcd10
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
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
87 ssize_t send_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
88 size_t recv_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
89
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
90 size_t rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
91 ngx_uint_t stream_id;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
92 u_char type;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
93 u_char flags;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
94 u_char padding;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
95
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
96 ngx_uint_t error;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
97 ngx_uint_t window_update;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
98
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
99 ngx_uint_t setting_id;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
100 ngx_uint_t setting_value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
101
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
102 u_char ping_data[8];
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 ngx_uint_t index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
105 ngx_str_t name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
106 ngx_str_t value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
107
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
108 u_char *field_end;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
109 size_t field_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
110 size_t field_rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
111 u_char field_state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
112
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
113 unsigned literal:1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
114 unsigned field_huffman:1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
115
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
116 unsigned header_sent:1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
117 unsigned output_closed:1;
7350
67c6cb7f477c gRPC: disabled keepalive when sending control frames was blocked.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7349
diff changeset
118 unsigned output_blocked:1;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
119 unsigned parsing_headers:1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
120 unsigned end_stream:1;
7349
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
121 unsigned done:1;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
122 unsigned status:1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
123
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
124 ngx_http_request_t *request;
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
125
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
126 ngx_str_t host;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
127 } ngx_http_grpc_ctx_t;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
128
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
129
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
130 typedef struct {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
131 u_char length_0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
132 u_char length_1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
133 u_char length_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
134 u_char type;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
135 u_char flags;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
136 u_char stream_id_0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
137 u_char stream_id_1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
138 u_char stream_id_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
139 u_char stream_id_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
140 } ngx_http_grpc_frame_t;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
141
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
142
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
143 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
144 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
145 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
146 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
147 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
148 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
149 static ngx_int_t ngx_http_grpc_filter_init(void *data);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
150 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
151
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
152 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
153 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
154 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
155 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
156 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
157 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
158 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
159 ngx_str_t *s);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
160 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
161 ngx_str_t *s);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
162 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
163 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
164 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
165 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
166 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
167 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
168 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
169 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
170 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
171 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
172
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
173 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
174 ngx_http_grpc_ctx_t *ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
175 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
176 ngx_http_grpc_ctx_t *ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
177 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
178 ngx_http_grpc_ctx_t *ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
179
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
180 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
181 ngx_http_grpc_ctx_t *ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
182 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
183 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
184 ngx_http_grpc_ctx_t *ctx, ngx_peer_connection_t *pc);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
185 static void ngx_http_grpc_cleanup(void *data);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
186
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
187 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
188 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
189 ngx_int_t rc);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
190
7234
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
191 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
192 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
193
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_add_variables(ngx_conf_t *cf);
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
195 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
196 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
197 void *parent, void *child);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
198 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
199 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
200 ngx_keyval_t *default_headers);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
201
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
202 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
203 void *conf);
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 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
206 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
207 ngx_command_t *cmd, void *conf);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
208 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
209 ngx_http_grpc_loc_conf_t *glcf);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
210 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
211
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
212
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
213 static ngx_conf_bitmask_t ngx_http_grpc_next_upstream_masks[] = {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
214 { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
215 { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
216 { ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
217 { ngx_string("non_idempotent"), NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
218 { ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
219 { ngx_string("http_502"), NGX_HTTP_UPSTREAM_FT_HTTP_502 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
220 { ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
221 { ngx_string("http_504"), NGX_HTTP_UPSTREAM_FT_HTTP_504 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
222 { ngx_string("http_403"), NGX_HTTP_UPSTREAM_FT_HTTP_403 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
223 { ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
224 { ngx_string("http_429"), NGX_HTTP_UPSTREAM_FT_HTTP_429 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
225 { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
226 { ngx_null_string, 0 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
227 };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
228
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
229
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
230 #if (NGX_HTTP_SSL)
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 static ngx_conf_bitmask_t ngx_http_grpc_ssl_protocols[] = {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
233 { ngx_string("SSLv2"), NGX_SSL_SSLv2 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
234 { ngx_string("SSLv3"), NGX_SSL_SSLv3 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
235 { ngx_string("TLSv1"), NGX_SSL_TLSv1 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
236 { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
237 { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
238 { ngx_string("TLSv1.3"), NGX_SSL_TLSv1_3 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
239 { ngx_null_string, 0 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
240 };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
241
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
242 #endif
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 static ngx_command_t ngx_http_grpc_commands[] = {
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 { ngx_string("grpc_pass"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
248 NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
249 ngx_http_grpc_pass,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
250 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
251 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
252 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
253
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
254 { ngx_string("grpc_bind"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
255 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
256 ngx_http_upstream_bind_set_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
257 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
258 offsetof(ngx_http_grpc_loc_conf_t, upstream.local),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
259 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
260
7371
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7350
diff changeset
261 { ngx_string("grpc_socket_keepalive"),
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7350
diff changeset
262 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
263 ngx_conf_set_flag_slot,
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7350
diff changeset
264 NGX_HTTP_LOC_CONF_OFFSET,
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7350
diff changeset
265 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
266 NULL },
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7350
diff changeset
267
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
268 { ngx_string("grpc_connect_timeout"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
269 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
270 ngx_conf_set_msec_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
271 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
272 offsetof(ngx_http_grpc_loc_conf_t, upstream.connect_timeout),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
273 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
274
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
275 { ngx_string("grpc_send_timeout"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
276 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
277 ngx_conf_set_msec_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
278 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
279 offsetof(ngx_http_grpc_loc_conf_t, upstream.send_timeout),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
280 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
281
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
282 { ngx_string("grpc_intercept_errors"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
283 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
284 ngx_conf_set_flag_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
285 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
286 offsetof(ngx_http_grpc_loc_conf_t, upstream.intercept_errors),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
287 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
288
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
289 { ngx_string("grpc_buffer_size"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
290 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
291 ngx_conf_set_size_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
292 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
293 offsetof(ngx_http_grpc_loc_conf_t, upstream.buffer_size),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
294 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
295
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
296 { ngx_string("grpc_read_timeout"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
297 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
298 ngx_conf_set_msec_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
299 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
300 offsetof(ngx_http_grpc_loc_conf_t, upstream.read_timeout),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
301 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
302
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
303 { ngx_string("grpc_next_upstream"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
304 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
305 ngx_conf_set_bitmask_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
306 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
307 offsetof(ngx_http_grpc_loc_conf_t, upstream.next_upstream),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
308 &ngx_http_grpc_next_upstream_masks },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
309
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
310 { ngx_string("grpc_next_upstream_tries"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
311 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
312 ngx_conf_set_num_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
313 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
314 offsetof(ngx_http_grpc_loc_conf_t, upstream.next_upstream_tries),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
315 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
316
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
317 { ngx_string("grpc_next_upstream_timeout"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
318 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
319 ngx_conf_set_msec_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
320 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
321 offsetof(ngx_http_grpc_loc_conf_t, upstream.next_upstream_timeout),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
322 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
323
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
324 { ngx_string("grpc_set_header"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
325 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
326 ngx_conf_set_keyval_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
327 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
328 offsetof(ngx_http_grpc_loc_conf_t, headers_source),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
329 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
330
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
331 { ngx_string("grpc_pass_header"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
332 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
333 ngx_conf_set_str_array_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
334 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
335 offsetof(ngx_http_grpc_loc_conf_t, upstream.pass_headers),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
336 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
337
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
338 { ngx_string("grpc_hide_header"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
339 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
340 ngx_conf_set_str_array_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
341 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
342 offsetof(ngx_http_grpc_loc_conf_t, upstream.hide_headers),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
343 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
344
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
345 { ngx_string("grpc_ignore_headers"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
346 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
347 ngx_conf_set_bitmask_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
348 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
349 offsetof(ngx_http_grpc_loc_conf_t, upstream.ignore_headers),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
350 &ngx_http_upstream_ignore_headers_masks },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
351
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
352 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
353
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
354 { ngx_string("grpc_ssl_session_reuse"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
355 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
356 ngx_conf_set_flag_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
357 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
358 offsetof(ngx_http_grpc_loc_conf_t, upstream.ssl_session_reuse),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
359 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
360
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
361 { ngx_string("grpc_ssl_protocols"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
362 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
363 ngx_conf_set_bitmask_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
364 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
365 offsetof(ngx_http_grpc_loc_conf_t, ssl_protocols),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
366 &ngx_http_grpc_ssl_protocols },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
367
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
368 { ngx_string("grpc_ssl_ciphers"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
369 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
370 ngx_conf_set_str_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
371 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
372 offsetof(ngx_http_grpc_loc_conf_t, ssl_ciphers),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
373 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
374
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
375 { ngx_string("grpc_ssl_name"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
376 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
377 ngx_http_set_complex_value_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
378 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
379 offsetof(ngx_http_grpc_loc_conf_t, upstream.ssl_name),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
380 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
381
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
382 { ngx_string("grpc_ssl_server_name"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
383 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
384 ngx_conf_set_flag_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
385 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
386 offsetof(ngx_http_grpc_loc_conf_t, upstream.ssl_server_name),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
387 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
388
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
389 { ngx_string("grpc_ssl_verify"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
390 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
391 ngx_conf_set_flag_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
392 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
393 offsetof(ngx_http_grpc_loc_conf_t, upstream.ssl_verify),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
394 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
395
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
396 { ngx_string("grpc_ssl_verify_depth"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
397 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
398 ngx_conf_set_num_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
399 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
400 offsetof(ngx_http_grpc_loc_conf_t, ssl_verify_depth),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
401 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
402
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
403 { ngx_string("grpc_ssl_trusted_certificate"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
404 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
405 ngx_conf_set_str_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
406 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
407 offsetof(ngx_http_grpc_loc_conf_t, ssl_trusted_certificate),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
408 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
409
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
410 { ngx_string("grpc_ssl_crl"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
411 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
412 ngx_conf_set_str_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
413 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
414 offsetof(ngx_http_grpc_loc_conf_t, ssl_crl),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
415 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
416
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
417 { ngx_string("grpc_ssl_certificate"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
418 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
419 ngx_conf_set_str_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
420 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
421 offsetof(ngx_http_grpc_loc_conf_t, ssl_certificate),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
422 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
423
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
424 { ngx_string("grpc_ssl_certificate_key"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
425 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
426 ngx_conf_set_str_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
427 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
428 offsetof(ngx_http_grpc_loc_conf_t, ssl_certificate_key),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
429 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
430
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
431 { ngx_string("grpc_ssl_password_file"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
432 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
433 ngx_http_grpc_ssl_password_file,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
434 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
435 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
436 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
437
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
438 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
439
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
440 ngx_null_command
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
441 };
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
444 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
445 ngx_http_grpc_add_variables, /* preconfiguration */
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
446 NULL, /* postconfiguration */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
447
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
448 NULL, /* create main configuration */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
449 NULL, /* init main configuration */
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 server configuration */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
452 NULL, /* merge server 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 ngx_http_grpc_create_loc_conf, /* create location configuration */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
455 ngx_http_grpc_merge_loc_conf /* merge location 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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
458
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
459 ngx_module_t ngx_http_grpc_module = {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
460 NGX_MODULE_V1,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
461 &ngx_http_grpc_module_ctx, /* module context */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
462 ngx_http_grpc_commands, /* module directives */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
463 NGX_HTTP_MODULE, /* module type */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
464 NULL, /* init master */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
465 NULL, /* init module */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
466 NULL, /* init process */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
467 NULL, /* init thread */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
468 NULL, /* exit thread */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
469 NULL, /* exit process */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
470 NULL, /* exit master */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
471 NGX_MODULE_V1_PADDING
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
472 };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
473
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
474
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
475 static u_char ngx_http_grpc_connection_start[] =
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
476 "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
477
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
478 "\x00\x00\x12\x04\x00\x00\x00\x00\x00" /* settings frame */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
479 "\x00\x01\x00\x00\x00\x00" /* header table size */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
480 "\x00\x02\x00\x00\x00\x00" /* disable push */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
481 "\x00\x04\x7f\xff\xff\xff" /* initial window */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
482
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
483 "\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
484 "\x7f\xff\x00\x00";
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
487 static ngx_keyval_t ngx_http_grpc_headers[] = {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
488 { 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
489 { ngx_string("TE"), ngx_string("$grpc_internal_trailers") },
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
490 { ngx_string("Host"), ngx_string("") },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
491 { ngx_string("Connection"), ngx_string("") },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
492 { ngx_string("Transfer-Encoding"), ngx_string("") },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
493 { ngx_string("Keep-Alive"), ngx_string("") },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
494 { ngx_string("Expect"), ngx_string("") },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
495 { ngx_string("Upgrade"), ngx_string("") },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
496 { ngx_null_string, ngx_null_string }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
497 };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
498
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
499
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
500 static ngx_str_t ngx_http_grpc_hide_headers[] = {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
501 ngx_string("Date"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
502 ngx_string("Server"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
503 ngx_string("X-Accel-Expires"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
504 ngx_string("X-Accel-Redirect"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
505 ngx_string("X-Accel-Limit-Rate"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
506 ngx_string("X-Accel-Buffering"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
507 ngx_string("X-Accel-Charset"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
508 ngx_null_string
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
509 };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
510
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
511
7234
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
512 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
513
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
514 { ngx_string("grpc_internal_trailers"), NULL,
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
515 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
516 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
517
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
518 ngx_http_null_variable
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
519 };
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
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
522 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
523 ngx_http_grpc_handler(ngx_http_request_t *r)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
524 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
525 ngx_int_t rc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
526 ngx_http_upstream_t *u;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
527 ngx_http_grpc_ctx_t *ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
528 ngx_http_grpc_loc_conf_t *glcf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
529
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
530 if (ngx_http_upstream_create(r) != NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
531 return NGX_HTTP_INTERNAL_SERVER_ERROR;
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
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
534 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
535 if (ctx == NULL) {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
536 return NGX_HTTP_INTERNAL_SERVER_ERROR;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
537 }
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
538
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
539 ctx->request = r;
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 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
542
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
543 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
544
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
545 u = r->upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
546
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
547 if (glcf->grpc_lengths == NULL) {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
548 ctx->host = glcf->host;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
549
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
550 #if (NGX_HTTP_SSL)
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
551 u->ssl = (glcf->upstream.ssl != NULL);
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
552
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
553 if (u->ssl) {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
554 ngx_str_set(&u->schema, "grpcs://");
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 } else {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
557 ngx_str_set(&u->schema, "grpc://");
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 #endif
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
562
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
563 } else {
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
564 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
565 return NGX_HTTP_INTERNAL_SERVER_ERROR;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
566 }
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
567 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
568
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
569 u->output.tag = (ngx_buf_tag_t) &ngx_http_grpc_module;
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 u->conf = &glcf->upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
572
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
573 u->create_request = ngx_http_grpc_create_request;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
574 u->reinit_request = ngx_http_grpc_reinit_request;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
575 u->process_header = ngx_http_grpc_process_header;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
576 u->abort_request = ngx_http_grpc_abort_request;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
577 u->finalize_request = ngx_http_grpc_finalize_request;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
578
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
579 u->input_filter_init = ngx_http_grpc_filter_init;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
580 u->input_filter = ngx_http_grpc_filter;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
581 u->input_filter_ctx = ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
582
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
583 r->request_body_no_buffering = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
584
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
585 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
586
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
587 if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
588 return rc;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
591 return NGX_DONE;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
595 static ngx_int_t
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
596 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
597 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
598 {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
599 size_t add;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
600 ngx_url_t url;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
601 ngx_http_upstream_t *u;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
602
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
603 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
604
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
605 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
606 glcf->grpc_values->elts)
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
607 == NULL)
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
608 {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
609 return NGX_ERROR;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
610 }
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 if (url.url.len > 7
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
613 && 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
614 {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
615 add = 7;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
616
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
617 } else if (url.url.len > 8
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
618 && 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
619 {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
620
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
621 #if (NGX_HTTP_SSL)
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
622 add = 8;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
623 r->upstream->ssl = 1;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
624 #else
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
625 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
626 "grpcs protocol requires SSL support");
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
627 return NGX_ERROR;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
628 #endif
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
629
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
630 } else {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
631 add = 0;
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
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
634 u = r->upstream;
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 if (add) {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
637 u->schema.len = add;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
638 u->schema.data = url.url.data;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
639
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
640 url.url.data += add;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
641 url.url.len -= add;
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 } else {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
644 ngx_str_set(&u->schema, "grpc://");
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
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
647 url.no_resolve = 1;
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 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
650 if (url.err) {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
651 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
652 "%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
653 }
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
654
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
655 return NGX_ERROR;
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 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
659 if (u->resolved == NULL) {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
660 return NGX_ERROR;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
661 }
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
662
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
663 if (url.addrs) {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
664 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
665 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
666 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
667 u->resolved->naddrs = 1;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
668 }
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
669
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
670 u->resolved->host = url.host;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
671 u->resolved->port = url.port;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
672 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
673
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
674 if (url.family != AF_UNIX) {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
675
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
676 if (url.no_port) {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
677 ctx->host = url.host;
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 } else {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
680 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
681 ctx->host.data = url.host.data;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
682 }
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
683
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
684 } else {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
685 ngx_str_set(&ctx->host, "localhost");
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
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
688 return NGX_OK;
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
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
692 static ngx_int_t
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
693 ngx_http_grpc_create_request(ngx_http_request_t *r)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
694 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
695 u_char *p, *tmp, *key_tmp, *val_tmp, *headers_frame;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
696 size_t len, tmp_len, key_len, val_len, uri_len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
697 uintptr_t escape;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
698 ngx_buf_t *b;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
699 ngx_uint_t i, next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
700 ngx_chain_t *cl, *body;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
701 ngx_list_part_t *part;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
702 ngx_table_elt_t *header;
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
703 ngx_http_grpc_ctx_t *ctx;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
704 ngx_http_upstream_t *u;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
705 ngx_http_grpc_frame_t *f;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
706 ngx_http_script_code_pt code;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
707 ngx_http_grpc_loc_conf_t *glcf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
708 ngx_http_script_engine_t e, le;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
709 ngx_http_script_len_code_pt lcode;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
710
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
711 u = r->upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
712
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
713 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
714
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
715 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
716
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
717 len = sizeof(ngx_http_grpc_connection_start) - 1
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
718 + sizeof(ngx_http_grpc_frame_t); /* headers frame */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
719
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
720 /* :method header */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
721
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
722 if (r->method == NGX_HTTP_GET || r->method == NGX_HTTP_POST) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
723 len += 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
724 tmp_len = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
725
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
726 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
727 len += 1 + NGX_HTTP_V2_INT_OCTETS + r->method_name.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
728 tmp_len = r->method_name.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
729 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
730
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
731 /* :scheme header */
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 len += 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
734
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
735 /* :path header */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
736
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
737 if (r->valid_unparsed_uri) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
738 escape = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
739 uri_len = r->unparsed_uri.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
740
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
741 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
742 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
743 NGX_ESCAPE_URI);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
744 uri_len = r->uri.len + escape + sizeof("?") - 1 + r->args.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
745 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
746
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
747 len += 1 + NGX_HTTP_V2_INT_OCTETS + uri_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 if (tmp_len < uri_len) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
750 tmp_len = 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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
753 /* :authority header */
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 if (!glcf->host_set) {
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
756 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
757
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
758 if (tmp_len < ctx->host.len) {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
759 tmp_len = ctx->host.len;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
760 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
761 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
762
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
763 /* other headers */
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 ngx_http_script_flush_no_cacheable_variables(r, glcf->headers.flushes);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
766 ngx_memzero(&le, sizeof(ngx_http_script_engine_t));
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 le.ip = glcf->headers.lengths->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
769 le.request = r;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
770 le.flushed = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
771
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
772 while (*(uintptr_t *) le.ip) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
773
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
774 lcode = *(ngx_http_script_len_code_pt *) le.ip;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
775 key_len = lcode(&le);
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 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
778 lcode = *(ngx_http_script_len_code_pt *) le.ip;
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 le.ip += sizeof(uintptr_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
781
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
782 if (val_len == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
783 continue;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
786 len += 1 + NGX_HTTP_V2_INT_OCTETS + key_len
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
787 + NGX_HTTP_V2_INT_OCTETS + val_len;
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 if (tmp_len < key_len) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
790 tmp_len = key_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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
793 if (tmp_len < val_len) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
794 tmp_len = val_len;
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 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
797
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
798 if (glcf->upstream.pass_request_headers) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
799 part = &r->headers_in.headers.part;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
800 header = part->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
801
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
802 for (i = 0; /* void */; i++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
803
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
804 if (i >= part->nelts) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
805 if (part->next == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
806 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
807 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
808
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
809 part = part->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
810 header = part->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
811 i = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
812 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
813
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
814 if (ngx_hash_find(&glcf->headers.hash, header[i].hash,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
815 header[i].lowcase_key, header[i].key.len))
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 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
818 }
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 len += 1 + NGX_HTTP_V2_INT_OCTETS + header[i].key.len
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
821 + NGX_HTTP_V2_INT_OCTETS + header[i].value.len;
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 if (tmp_len < header[i].key.len) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
824 tmp_len = header[i].key.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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
827 if (tmp_len < header[i].value.len) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
828 tmp_len = header[i].value.len;
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 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
831 }
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 /* continuation frames */
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 len += sizeof(ngx_http_grpc_frame_t)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
836 * (len / NGX_HTTP_V2_DEFAULT_FRAME_SIZE);
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
839 b = ngx_create_temp_buf(r->pool, len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
840 if (b == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
841 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
842 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
843
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
844 cl = ngx_alloc_chain_link(r->pool);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
845 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
846 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
847 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
848
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
849 cl->buf = b;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
850 cl->next = NULL;
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 tmp = ngx_palloc(r->pool, tmp_len * 3);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
853 if (tmp == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
854 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
855 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
856
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
857 key_tmp = tmp + tmp_len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
858 val_tmp = tmp + 2 * tmp_len;
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 /* connection preface */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
861
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
862 b->last = ngx_copy(b->last, ngx_http_grpc_connection_start,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
863 sizeof(ngx_http_grpc_connection_start) - 1);
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 /* headers frame */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
866
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
867 headers_frame = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
868
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
869 f = (ngx_http_grpc_frame_t *) b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
870 b->last += sizeof(ngx_http_grpc_frame_t);
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->length_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
873 f->length_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
874 f->length_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
875 f->type = NGX_HTTP_V2_HEADERS_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
876 f->flags = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
877 f->stream_id_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
878 f->stream_id_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
879 f->stream_id_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
880 f->stream_id_3 = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
881
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
882 if (r->method == NGX_HTTP_GET) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
883 *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
884
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
885 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
886 "grpc header: \":method: GET\"");
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 } else if (r->method == NGX_HTTP_POST) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
889 *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
890
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
891 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
892 "grpc header: \":method: POST\"");
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 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
895 *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
896 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
897 r->method_name.len, tmp);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
898
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
899 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
900 "grpc header: \":method: %V\"", &r->method_name);
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
903 #if (NGX_HTTP_SSL)
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
904 if (u->ssl) {
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
905 *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
906
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
907 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
908 "grpc header: \":scheme: https\"");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
909 } else
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
910 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
911 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
912 *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
913
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
914 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
915 "grpc header: \":scheme: http\"");
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
918 if (r->valid_unparsed_uri) {
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 if (r->unparsed_uri.len == 1 && r->unparsed_uri.data[0] == '/') {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
921 *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
922
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
923 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
924 *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
925 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
926 r->unparsed_uri.len, tmp);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
927 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
928
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
929 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
930 "grpc header: \":path: %V\"", &r->unparsed_uri);
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 } else if (escape || r->args.len > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
933 p = val_tmp;
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 if (escape) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
936 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
937 NGX_ESCAPE_URI);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
938
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
939 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
940 p = ngx_copy(p, r->uri.data, r->uri.len);
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
943 if (r->args.len > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
944 *p++ = '?';
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
945 p = ngx_copy(p, r->args.data, r->args.len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
946 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
947
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
948 *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
949 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
950
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
951 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
952 "grpc header: \":path: %*s\"", p - val_tmp, val_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 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
955 *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
956 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
957 r->uri.len, tmp);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
958
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
959 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
960 "grpc header: \":path: %V\"", &r->uri);
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
963 if (!glcf->host_set) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
964 *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
965 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
966 ctx->host.len, tmp);
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
967
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
968 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
969 "grpc header: \":authority: %V\"", &ctx->host);
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
972 ngx_memzero(&e, sizeof(ngx_http_script_engine_t));
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 e.ip = glcf->headers.values->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
975 e.request = r;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
976 e.flushed = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
977
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
978 le.ip = glcf->headers.lengths->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
979
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
980 while (*(uintptr_t *) le.ip) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
981
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
982 lcode = *(ngx_http_script_len_code_pt *) le.ip;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
983 key_len = lcode(&le);
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 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
986 lcode = *(ngx_http_script_len_code_pt *) le.ip;
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 le.ip += sizeof(uintptr_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
989
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
990 if (val_len == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
991 e.skip = 1;
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 while (*(uintptr_t *) e.ip) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
994 code = *(ngx_http_script_code_pt *) e.ip;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
995 code((ngx_http_script_engine_t *) &e);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
996 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
997 e.ip += sizeof(uintptr_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
998
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
999 e.skip = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1000
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1001 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1002 }
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 *b->last++ = 0;
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 e.pos = key_tmp;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1007
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1008 code = *(ngx_http_script_code_pt *) e.ip;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1009 code((ngx_http_script_engine_t *) &e);
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 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
1012
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1013 e.pos = val_tmp;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1014
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1015 while (*(uintptr_t *) e.ip) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1016 code = *(ngx_http_script_code_pt *) e.ip;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1017 code((ngx_http_script_engine_t *) &e);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1018 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1019 e.ip += sizeof(uintptr_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1020
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1021 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
1022
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1023 #if (NGX_DEBUG)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1024 if (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1025 ngx_strlow(key_tmp, key_tmp, key_len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1026
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1027 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1028 "grpc header: \"%*s: %*s\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1029 key_len, key_tmp, val_len, val_tmp);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1030 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1031 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1032 }
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 if (glcf->upstream.pass_request_headers) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1035 part = &r->headers_in.headers.part;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1036 header = part->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1037
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1038 for (i = 0; /* void */; i++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1039
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1040 if (i >= part->nelts) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1041 if (part->next == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1042 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1043 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1044
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1045 part = part->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1046 header = part->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1047 i = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1048 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1049
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1050 if (ngx_hash_find(&glcf->headers.hash, header[i].hash,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1051 header[i].lowcase_key, header[i].key.len))
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 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1054 }
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 *b->last++ = 0;
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 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
1059 header[i].key.len, tmp);
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_value(b->last, header[i].value.data,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1062 header[i].value.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 #if (NGX_DEBUG)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1065 if (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1066 ngx_strlow(tmp, header[i].key.data, header[i].key.len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1067
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1068 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1069 "grpc header: \"%*s: %V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1070 header[i].key.len, tmp, &header[i].value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1071 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1072 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1073 }
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1076 /* update headers frame length */
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 len = b->last - headers_frame - sizeof(ngx_http_grpc_frame_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1079
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1080 if (len > NGX_HTTP_V2_DEFAULT_FRAME_SIZE) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1081 len = NGX_HTTP_V2_DEFAULT_FRAME_SIZE;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1082 next = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1083
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1084 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1085 next = 0;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1088 f = (ngx_http_grpc_frame_t *) headers_frame;
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 f->length_0 = (u_char) ((len >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1091 f->length_1 = (u_char) ((len >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1092 f->length_2 = (u_char) (len & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1093
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1094 /* create additional continuation frames */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1095
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1096 p = headers_frame;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1097
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1098 while (next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1099 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
1100 len = b->last - p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1101
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1102 ngx_memmove(p + sizeof(ngx_http_grpc_frame_t), p, len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1103 b->last += sizeof(ngx_http_grpc_frame_t);
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 if (len > NGX_HTTP_V2_DEFAULT_FRAME_SIZE) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1106 len = NGX_HTTP_V2_DEFAULT_FRAME_SIZE;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1107 next = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1108
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1109 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1110 next = 0;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1113 f = (ngx_http_grpc_frame_t *) p;
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 f->length_0 = (u_char) ((len >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1116 f->length_1 = (u_char) ((len >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1117 f->length_2 = (u_char) (len & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1118 f->type = NGX_HTTP_V2_CONTINUATION_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1119 f->flags = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1120 f->stream_id_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1121 f->stream_id_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1122 f->stream_id_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1123 f->stream_id_3 = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1124 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1125
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1126 f->flags |= NGX_HTTP_V2_END_HEADERS_FLAG;
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 #if (NGX_DEBUG)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1129 if (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1130 u_char buf[512];
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1131 size_t n, m;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1132
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1133 n = ngx_min(b->last - b->pos, 256);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1134 m = ngx_hex_dump(buf, b->pos, n) - buf;
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 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1137 "grpc header: %*s%s, len: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1138 m, buf, b->last - b->pos > 256 ? "..." : "",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1139 b->last - b->pos);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1140 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1141 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1142
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1143 if (r->request_body_no_buffering) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1144
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1145 u->request_bufs = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1146
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1147 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1148
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1149 body = u->request_bufs;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1150 u->request_bufs = cl;
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 if (body == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1153 f = (ngx_http_grpc_frame_t *) headers_frame;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1154 f->flags |= NGX_HTTP_V2_END_STREAM_FLAG;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1155 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1156
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1157 while (body) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1158 b = ngx_alloc_buf(r->pool);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1159 if (b == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1160 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1161 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1162
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1163 ngx_memcpy(b, body->buf, sizeof(ngx_buf_t));
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 cl->next = ngx_alloc_chain_link(r->pool);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1166 if (cl->next == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1167 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1168 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1169
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1170 cl = cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1171 cl->buf = b;
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 body = body->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1174 }
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 b->last_buf = 1;
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 u->output.output_filter = ngx_http_grpc_body_output_filter;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1180 u->output.filter_ctx = r;
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 b->flush = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1183 cl->next = NULL;
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 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1186 }
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1189 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1190 ngx_http_grpc_reinit_request(ngx_http_request_t *r)
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 ngx_http_grpc_ctx_t *ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1193
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1194 ctx = ngx_http_get_module_ctx(r, ngx_http_grpc_module);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1195
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1196 if (ctx == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1197 return NGX_OK;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1200 ctx->state = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1201 ctx->header_sent = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1202 ctx->output_closed = 0;
7350
67c6cb7f477c gRPC: disabled keepalive when sending control frames was blocked.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7349
diff changeset
1203 ctx->output_blocked = 0;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1204 ctx->parsing_headers = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1205 ctx->end_stream = 0;
7349
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1206 ctx->done = 0;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1207 ctx->status = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1208 ctx->connection = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1209
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1210 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1211 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1212
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 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1215 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
1216 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1217 ngx_http_request_t *r = data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1218
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1219 off_t file_pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1220 u_char *p, *pos, *start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1221 size_t len, limit;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1222 ngx_buf_t *b;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1223 ngx_int_t rc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1224 ngx_uint_t next, last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1225 ngx_chain_t *cl, *out, **ll;
7349
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1226 ngx_http_upstream_t *u;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1227 ngx_http_grpc_ctx_t *ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1228 ngx_http_grpc_frame_t *f;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1229
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1230 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1231 "grpc output filter");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1232
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1233 ctx = ngx_http_grpc_get_ctx(r);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1234
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1235 if (ctx == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1236 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1237 }
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 (in) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1240 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
1241 return NGX_ERROR;
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 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1244
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1245 out = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1246 ll = &out;
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 if (!ctx->header_sent) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1249 /* first buffer contains headers */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1250
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1251 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1252 "grpc output header");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1253
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1254 ctx->header_sent = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1255
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1256 if (ctx->id != 1) {
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 * keepalive connection: skip connection preface,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1259 * update stream identifiers
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1260 */
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 b = ctx->in->buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1263 b->pos += sizeof(ngx_http_grpc_connection_start) - 1;
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 p = b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1266
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1267 while (p < b->last) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1268 f = (ngx_http_grpc_frame_t *) p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1269 p += sizeof(ngx_http_grpc_frame_t);
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 f->stream_id_0 = (u_char) ((ctx->id >> 24) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1272 f->stream_id_1 = (u_char) ((ctx->id >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1273 f->stream_id_2 = (u_char) ((ctx->id >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1274 f->stream_id_3 = (u_char) (ctx->id & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1275
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1276 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
1277 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1278 }
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 if (ctx->in->buf->last_buf) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1281 ctx->output_closed = 1;
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 *ll = ctx->in;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1285 ll = &ctx->in->next;
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 ctx->in = ctx->in->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1288 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1289
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1290 if (ctx->out) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1291 /* queued control frames */
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 *ll = ctx->out;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1294
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1295 for (cl = ctx->out, ll = &cl->next; cl; cl = cl->next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1296 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1297 }
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 ctx->out = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1300 }
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 f = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1303 last = 0;
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 limit = ngx_max(0, ctx->send_window);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1306
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1307 if (limit > ctx->connection->send_window) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1308 limit = ctx->connection->send_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1309 }
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 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1312 "grpc output limit: %uz w:%z:%uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1313 limit, ctx->send_window, ctx->connection->send_window);
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 #if (NGX_SUPPRESS_WARN)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1316 file_pos = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1317 pos = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1318 cl = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1319 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1320
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1321 in = ctx->in;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1322
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1323 while (in && limit > 0) {
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 ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1326 "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
1327 "file: %O, size: %O",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1328 in->buf->last_buf,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1329 in->buf->in_file,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1330 in->buf->start, in->buf->pos,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1331 in->buf->last - in->buf->pos,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1332 in->buf->file_pos,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1333 in->buf->file_last - in->buf->file_pos);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1334
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1335 if (ngx_buf_special(in->buf)) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1336 goto next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1337 }
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 (in->buf->in_file) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1340 file_pos = in->buf->file_pos;
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 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1343 pos = in->buf->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1344 }
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 next = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1347
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1348 do {
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 cl = ngx_http_grpc_get_buf(r, ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1351 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1352 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1355 b = cl->buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1356
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1357 f = (ngx_http_grpc_frame_t *) b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1358 b->last += sizeof(ngx_http_grpc_frame_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1359
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1360 *ll = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1361 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1362
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1363 cl = ngx_chain_get_free_buf(r->pool, &ctx->free);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1364 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1365 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1368 b = cl->buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1369 start = b->start;
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 ngx_memcpy(b, in->buf, sizeof(ngx_buf_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1372
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1373 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1374 * restore b->start to preserve memory allocated in the buffer,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1375 * to reuse it later for headers and control frames
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 b->start = start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1379
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1380 if (in->buf->in_file) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1381 b->file_pos = file_pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1382 file_pos += ngx_min(NGX_HTTP_V2_DEFAULT_FRAME_SIZE, limit);
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 (file_pos >= in->buf->file_last) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1385 file_pos = in->buf->file_last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1386 next = 1;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1389 b->file_last = file_pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1390 len = (ngx_uint_t) (file_pos - b->file_pos);
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 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1393 b->pos = pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1394 pos += ngx_min(NGX_HTTP_V2_DEFAULT_FRAME_SIZE, limit);
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 if (pos >= in->buf->last) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1397 pos = in->buf->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1398 next = 1;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1401 b->last = pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1402 len = (ngx_uint_t) (pos - b->pos);
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->tag = (ngx_buf_tag_t) &ngx_http_grpc_body_output_filter;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1406 b->shadow = in->buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1407 b->last_shadow = next;
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->last_buf = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1410 b->last_in_chain = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1411
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1412 *ll = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1413 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1414
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1415 f->length_0 = (u_char) ((len >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1416 f->length_1 = (u_char) ((len >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1417 f->length_2 = (u_char) (len & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1418 f->type = NGX_HTTP_V2_DATA_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1419 f->flags = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1420 f->stream_id_0 = (u_char) ((ctx->id >> 24) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1421 f->stream_id_1 = (u_char) ((ctx->id >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1422 f->stream_id_2 = (u_char) ((ctx->id >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1423 f->stream_id_3 = (u_char) (ctx->id & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1424
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1425 limit -= len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1426 ctx->send_window -= len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1427 ctx->connection->send_window -= len;
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 } while (!next && limit > 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1430
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1431 if (!next) {
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 * 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
1434 * preserve position for future use
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1435 */
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 (in->buf->in_file) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1438 in->buf->file_pos = file_pos;
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 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1441 in->buf->pos = pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1442 }
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 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1445 }
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 next:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1448
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1449 if (in->buf->last_buf) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1450 last = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1451 }
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 in = in->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1454 }
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 ctx->in = in;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1457
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1458 if (last) {
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 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1461 "grpc output last");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1462
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1463 ctx->output_closed = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1464
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1465 if (f) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1466 f->flags |= NGX_HTTP_V2_END_STREAM_FLAG;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1467
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1468 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1469 cl = ngx_http_grpc_get_buf(r, ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1470 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1471 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1472 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1473
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1474 b = cl->buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1475
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1476 f = (ngx_http_grpc_frame_t *) b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1477 b->last += sizeof(ngx_http_grpc_frame_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1478
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1479 f->length_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1480 f->length_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1481 f->length_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1482 f->type = NGX_HTTP_V2_DATA_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1483 f->flags = NGX_HTTP_V2_END_STREAM_FLAG;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1484 f->stream_id_0 = (u_char) ((ctx->id >> 24) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1485 f->stream_id_1 = (u_char) ((ctx->id >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1486 f->stream_id_2 = (u_char) ((ctx->id >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1487 f->stream_id_3 = (u_char) (ctx->id & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1488
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1489 *ll = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1490 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1491 }
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 cl->buf->last_buf = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1494 }
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 *ll = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1497
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1498 #if (NGX_DEBUG)
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 for (cl = out; cl; cl = cl->next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1501 ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1502 "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
1503 "file: %O, size: %O",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1504 cl->buf->last_buf,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1505 cl->buf->in_file,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1506 cl->buf->start, cl->buf->pos,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1507 cl->buf->last - cl->buf->pos,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1508 cl->buf->file_pos,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1509 cl->buf->file_last - cl->buf->file_pos);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1510 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1511
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1512 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1513 "grpc output limit: %uz w:%z:%uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1514 limit, ctx->send_window, ctx->connection->send_window);
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 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1517
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1518 rc = ngx_chain_writer(&r->upstream->writer, out);
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 ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &out,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1521 (ngx_buf_tag_t) &ngx_http_grpc_body_output_filter);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1522
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1523 for (cl = ctx->free; cl; cl = cl->next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1524
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1525 /* mark original buffers as sent */
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 if (cl->buf->shadow) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1528 if (cl->buf->last_shadow) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1529 b = cl->buf->shadow;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1530 b->pos = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1531 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1532
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1533 cl->buf->shadow = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1534 }
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 if (rc == NGX_OK && ctx->in) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1538 rc = NGX_AGAIN;
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
7350
67c6cb7f477c gRPC: disabled keepalive when sending control frames was blocked.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7349
diff changeset
1541 if (rc == NGX_AGAIN) {
67c6cb7f477c gRPC: disabled keepalive when sending control frames was blocked.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7349
diff changeset
1542 ctx->output_blocked = 1;
67c6cb7f477c gRPC: disabled keepalive when sending control frames was blocked.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7349
diff changeset
1543
67c6cb7f477c gRPC: disabled keepalive when sending control frames was blocked.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7349
diff changeset
1544 } else {
67c6cb7f477c gRPC: disabled keepalive when sending control frames was blocked.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7349
diff changeset
1545 ctx->output_blocked = 0;
67c6cb7f477c gRPC: disabled keepalive when sending control frames was blocked.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7349
diff changeset
1546 }
67c6cb7f477c gRPC: disabled keepalive when sending control frames was blocked.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7349
diff changeset
1547
7349
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1548 if (ctx->done) {
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1549
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1550 /*
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1551 * 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
1552 * control frames. Even if there is still something unsent, stop
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1553 * here anyway.
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
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1556 u = r->upstream;
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1557 u->length = 0;
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 if (ctx->in == NULL
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1560 && ctx->out == NULL
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1561 && ctx->output_closed
7350
67c6cb7f477c gRPC: disabled keepalive when sending control frames was blocked.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7349
diff changeset
1562 && !ctx->output_blocked
7349
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1563 && ctx->state == ngx_http_grpc_st_start)
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1564 {
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1565 u->keepalive = 1;
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1566 }
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1567
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1568 ngx_post_event(u->peer.connection->read, &ngx_posted_events);
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1569 }
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1570
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1571 return rc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1572 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1573
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1574
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1575 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1576 ngx_http_grpc_process_header(ngx_http_request_t *r)
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 ngx_str_t *status_line;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1579 ngx_int_t rc, status;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1580 ngx_buf_t *b;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1581 ngx_table_elt_t *h;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1582 ngx_http_upstream_t *u;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1583 ngx_http_grpc_ctx_t *ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1584 ngx_http_upstream_header_t *hh;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1585 ngx_http_upstream_main_conf_t *umcf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1586
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1587 u = r->upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1588 b = &u->buffer;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1589
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1590 #if (NGX_DEBUG)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1591 if (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1592 u_char buf[512];
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1593 size_t n, m;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1594
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1595 n = ngx_min(b->last - b->pos, 256);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1596 m = ngx_hex_dump(buf, b->pos, n) - buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1597
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1598 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1599 "grpc response: %*s%s, len: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1600 m, buf, b->last - b->pos > 256 ? "..." : "",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1601 b->last - b->pos);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1602 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1603 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1604
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1605 ctx = ngx_http_grpc_get_ctx(r);
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 if (ctx == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1608 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1609 }
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 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
1612
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1613 for ( ;; ) {
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 if (ctx->state < ngx_http_grpc_st_payload) {
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 rc = ngx_http_grpc_parse_frame(r, ctx, b);
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 (rc == NGX_AGAIN) {
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 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1622 * there can be a lot of window update frames,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1623 * 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
1624 * started parsing headers yet
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1627 if (!ctx->parsing_headers) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1628 b->pos = b->start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1629 b->last = b->pos;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1632 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1633 }
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 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1636 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
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 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1640 * RFC 7540 says that implementations MUST discard frames
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1641 * that have unknown or unsupported types. However, extension
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1642 * frames that appear in the middle of a header block are
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1643 * not permitted. Also, for obvious reasons CONTINUATION frames
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1644 * cannot appear before headers, and DATA frames are not expected
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1645 * to appear before all headers are parsed.
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1646 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1647
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1648 if (ctx->type == NGX_HTTP_V2_DATA_FRAME
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1649 || (ctx->type == NGX_HTTP_V2_CONTINUATION_FRAME
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1650 && !ctx->parsing_headers)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1651 || (ctx->type != NGX_HTTP_V2_CONTINUATION_FRAME
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1652 && ctx->parsing_headers))
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1653 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1654 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1655 "upstream sent unexpected http2 frame: %d",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1656 ctx->type);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1657 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1658 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1659
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1660 if (ctx->stream_id && ctx->stream_id != ctx->id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1661 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1662 "upstream sent frame for unknown stream %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1663 ctx->stream_id);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1664 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1665 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1666 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1667
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1668 /* frame payload */
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 if (ctx->type == NGX_HTTP_V2_RST_STREAM_FRAME) {
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 rc = ngx_http_grpc_parse_rst_stream(r, ctx, b);
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 (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1675 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1676 }
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_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1679 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
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 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1683 "upstream rejected request with error %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1684 ctx->error);
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 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1687 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1688
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1689 if (ctx->type == NGX_HTTP_V2_GOAWAY_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1690
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1691 rc = ngx_http_grpc_parse_goaway(r, ctx, b);
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 (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1694 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1695 }
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_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1698 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
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 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1702 * If stream_id is lower than one we use, our
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1703 * request won't be processed and needs to be retried.
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1704 * 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
1705 * we can continue normally (except we can't use this
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1706 * connection for additional requests). If there is
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1707 * a real error, the connection will be closed.
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1708 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1709
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1710 if (ctx->stream_id < ctx->id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1711
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1712 /* TODO: we can retry non-idempotent requests */
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 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1715 "upstream sent goaway with error %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1716 ctx->error);
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 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1719 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1720
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1721 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1722 }
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 if (ctx->type == NGX_HTTP_V2_WINDOW_UPDATE_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1725
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1726 rc = ngx_http_grpc_parse_window_update(r, ctx, b);
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 (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1729 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1730 }
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_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1733 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
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 (ctx->in) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1737 ngx_post_event(u->peer.connection->write, &ngx_posted_events);
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 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1741 }
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 if (ctx->type == NGX_HTTP_V2_SETTINGS_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1744
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1745 rc = ngx_http_grpc_parse_settings(r, ctx, b);
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 (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1748 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1749 }
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_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1752 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
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 (ctx->in) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1756 ngx_post_event(u->peer.connection->write, &ngx_posted_events);
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 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1760 }
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 if (ctx->type == NGX_HTTP_V2_PING_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1763
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1764 rc = ngx_http_grpc_parse_ping(r, ctx, b);
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 (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1767 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1768 }
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_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1771 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
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 ngx_post_event(u->peer.connection->write, &ngx_posted_events);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1775 continue;
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 if (ctx->type == NGX_HTTP_V2_PUSH_PROMISE_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1779 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1780 "upstream sent unexpected push promise frame");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1781 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1782 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1783
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1784 if (ctx->type != NGX_HTTP_V2_HEADERS_FRAME
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1785 && ctx->type != NGX_HTTP_V2_CONTINUATION_FRAME)
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 /* priority, unknown frames */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1788
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1789 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1790 ctx->rest -= b->last - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1791 b->pos = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1792 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1793 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1794
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1795 b->pos += ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1796 ctx->rest = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1797 ctx->state = ngx_http_grpc_st_start;
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 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1800 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1801
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1802 /* headers */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1803
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1804 for ( ;; ) {
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 rc = ngx_http_grpc_parse_header(r, ctx, b);
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 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1809 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1810 }
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_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1813
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1814 /* a header line has been parsed successfully */
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 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1817 "grpc header: \"%V: %V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1818 &ctx->name, &ctx->value);
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 if (ctx->name.len && ctx->name.data[0] == ':') {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1821
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1822 if (ctx->name.len != sizeof(":status") - 1
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1823 || ngx_strncmp(ctx->name.data, ":status",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1824 sizeof(":status") - 1)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1825 != 0)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1826 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1827 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1828 "upstream sent invalid header \"%V: %V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1829 &ctx->name, &ctx->value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1830 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1831 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1832
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1833 if (ctx->status) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1834 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1835 "upstream sent duplicate :status header");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1836 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1837 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1838
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1839 status_line = &ctx->value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1840
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1841 if (status_line->len != 3) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1842 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1843 "upstream sent invalid :status \"%V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1844 status_line);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1845 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1846 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1847
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1848 status = ngx_atoi(status_line->data, 3);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1849
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1850 if (status == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1851 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1852 "upstream sent invalid :status \"%V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1853 status_line);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1854 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1855 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1856
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1857 if (status < NGX_HTTP_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1858 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1859 "upstream sent unexpected :status \"%V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1860 status_line);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1861 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1862 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1863
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1864 u->headers_in.status_n = status;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1865
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1866 if (u->state && u->state->status == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1867 u->state->status = status;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1868 }
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 ctx->status = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1871
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1872 continue;
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 } else if (!ctx->status) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1875 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1876 "upstream sent no :status header");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1877 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1878 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1879
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1880 h = ngx_list_push(&u->headers_in.headers);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1881 if (h == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1882 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1885 h->key = ctx->name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1886 h->value = ctx->value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1887 h->lowcase_key = h->key.data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1888 h->hash = ngx_hash_key(h->key.data, h->key.len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1889
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1890 hh = ngx_hash_find(&umcf->headers_in_hash, h->hash,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1891 h->lowcase_key, h->key.len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1892
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1893 if (hh && hh->handler(r, h, hh->offset) != NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1894 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1895 }
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 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1898 }
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 if (rc == NGX_HTTP_PARSE_HEADER_DONE) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1901
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1902 /* a whole header has been parsed successfully */
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 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1905 "grpc header done");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1906
7235
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1907 if (ctx->end_stream) {
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1908 u->headers_in.content_length_n = 0;
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1909
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1910 if (ctx->in == NULL
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1911 && ctx->out == NULL
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1912 && ctx->output_closed
7350
67c6cb7f477c gRPC: disabled keepalive when sending control frames was blocked.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7349
diff changeset
1913 && !ctx->output_blocked
7235
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1914 && b->last == b->pos)
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1915 {
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1916 u->keepalive = 1;
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1917 }
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1918 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1919
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1920 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1921 }
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 /* there was error while a header line parsing */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1924
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1925 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1926 "upstream sent invalid header");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1927
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1928 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1929 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1930
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1931 /* rc == NGX_AGAIN */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1932
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1933 if (ctx->rest == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1934 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1935 continue;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1938 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1939 }
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1943 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1944 ngx_http_grpc_filter_init(void *data)
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 ngx_http_grpc_ctx_t *ctx = data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1947
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1948 ngx_http_request_t *r;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1949 ngx_http_upstream_t *u;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1950
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1951 r = ctx->request;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1952 u = r->upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1953
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1954 u->length = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1955
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1956 if (ctx->end_stream) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1957 u->length = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1958 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1959
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1960 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1961 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1962
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1963
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1964 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1965 ngx_http_grpc_filter(void *data, ssize_t bytes)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1966 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1967 ngx_http_grpc_ctx_t *ctx = data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1968
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1969 ngx_int_t rc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1970 ngx_buf_t *b, *buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1971 ngx_chain_t *cl, **ll;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1972 ngx_table_elt_t *h;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1973 ngx_http_request_t *r;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1974 ngx_http_upstream_t *u;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1975
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1976 r = ctx->request;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1977 u = r->upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1978 b = &u->buffer;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1979
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1980 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1981 "grpc filter bytes:%z", bytes);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1982
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1983 b->pos = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1984 b->last += bytes;
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 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
1987 ll = &cl->next;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1990 for ( ;; ) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1991
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1992 if (ctx->state < ngx_http_grpc_st_payload) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1993
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1994 rc = ngx_http_grpc_parse_frame(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1995
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1996 if (rc == NGX_AGAIN) {
7349
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1997
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1998 if (ctx->done) {
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
1999
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2000 /*
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2001 * We have finished parsing the response and the
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2002 * remaining control frames. If there are unsent
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2003 * control frames, post a write event to send them.
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2004 */
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2005
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2006 if (ctx->out) {
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2007 ngx_post_event(u->peer.connection->write,
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2008 &ngx_posted_events);
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2009 return NGX_AGAIN;
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2010 }
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2011
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2012 u->length = 0;
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2013
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2014 if (ctx->in == NULL
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2015 && ctx->output_closed
7350
67c6cb7f477c gRPC: disabled keepalive when sending control frames was blocked.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7349
diff changeset
2016 && !ctx->output_blocked
7349
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2017 && ctx->state == ngx_http_grpc_st_start)
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2018 {
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2019 u->keepalive = 1;
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2020 }
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2021
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2022 break;
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2023 }
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2024
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2025 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2026 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2027
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2028 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2029 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2030 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2031
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2032 if ((ctx->type == NGX_HTTP_V2_CONTINUATION_FRAME
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2033 && !ctx->parsing_headers)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2034 || (ctx->type != NGX_HTTP_V2_CONTINUATION_FRAME
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2035 && ctx->parsing_headers))
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2036 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2037 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2038 "upstream sent unexpected http2 frame: %d",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2039 ctx->type);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2040 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2041 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2042
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2043 if (ctx->type == NGX_HTTP_V2_DATA_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2044
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2045 if (ctx->stream_id != ctx->id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2046 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2047 "upstream sent data frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2048 "for unknown stream %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2049 ctx->stream_id);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2050 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2051 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2052
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2053 if (ctx->rest > ctx->recv_window) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2054 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2055 "upstream violated stream flow control, "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2056 "received %uz data frame with window %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2057 ctx->rest, ctx->recv_window);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2058 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2061 if (ctx->rest > ctx->connection->recv_window) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2062 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2063 "upstream violated connection flow control, "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2064 "received %uz data frame with window %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2065 ctx->rest, ctx->connection->recv_window);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2066 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2067 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2068
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2069 ctx->recv_window -= ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2070 ctx->connection->recv_window -= ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2071
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2072 if (ctx->connection->recv_window < NGX_HTTP_V2_MAX_WINDOW / 4
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2073 || ctx->recv_window < NGX_HTTP_V2_MAX_WINDOW / 4)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2074 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2075 if (ngx_http_grpc_send_window_update(r, ctx) != NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2076 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2077 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2078
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2079 ngx_post_event(u->peer.connection->write,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2080 &ngx_posted_events);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2081 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2082 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2083
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2084 if (ctx->stream_id && ctx->stream_id != ctx->id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2085 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2086 "upstream sent frame for unknown stream %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2087 ctx->stream_id);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2088 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2089 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2090
7349
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2091 if (ctx->stream_id && ctx->done) {
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2092 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2093 "upstream sent frame for closed stream %ui",
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2094 ctx->stream_id);
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2095 return NGX_ERROR;
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2096 }
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2097
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2098 ctx->padding = 0;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2101 if (ctx->state == ngx_http_grpc_st_padding) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2102
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2103 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2104 ctx->rest -= b->last - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2105 b->pos = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2106 return NGX_AGAIN;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2109 b->pos += ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2110 ctx->rest = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2111 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2112
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2113 if (ctx->flags & NGX_HTTP_V2_END_STREAM_FLAG) {
7349
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2114 ctx->done = 1;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2115 }
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 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2118 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2119
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2120 /* frame payload */
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 if (ctx->type == NGX_HTTP_V2_RST_STREAM_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2123
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2124 rc = ngx_http_grpc_parse_rst_stream(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2125
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2126 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2127 return NGX_AGAIN;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2130 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2131 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2132 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2133
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2134 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2135 "upstream rejected request with error %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2136 ctx->error);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2137
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2138 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2139 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2140
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2141 if (ctx->type == NGX_HTTP_V2_GOAWAY_FRAME) {
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 rc = ngx_http_grpc_parse_goaway(r, ctx, b);
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 (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2146 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2147 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2148
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2149 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2150 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2151 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2152
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2153 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2154 * If stream_id is lower than one we use, our
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2155 * request won't be processed and needs to be retried.
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2156 * 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
2157 * we can continue normally (except we can't use this
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2158 * connection for additional requests). If there is
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2159 * a real error, the connection will be closed.
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 if (ctx->stream_id < ctx->id) {
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 /* TODO: we can retry non-idempotent requests */
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 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2167 "upstream sent goaway with error %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2168 ctx->error);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2169
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2170 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2173 continue;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2176 if (ctx->type == NGX_HTTP_V2_WINDOW_UPDATE_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2177
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2178 rc = ngx_http_grpc_parse_window_update(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2179
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2180 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2181 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2182 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2183
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2184 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2185 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2186 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2187
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2188 if (ctx->in) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2189 ngx_post_event(u->peer.connection->write, &ngx_posted_events);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2190 }
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 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2193 }
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 if (ctx->type == NGX_HTTP_V2_SETTINGS_FRAME) {
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 rc = ngx_http_grpc_parse_settings(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2198
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2199 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2200 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2201 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2202
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2203 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2204 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2207 if (ctx->in) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2208 ngx_post_event(u->peer.connection->write, &ngx_posted_events);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2209 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2210
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2211 continue;
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->type == NGX_HTTP_V2_PING_FRAME) {
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 rc = ngx_http_grpc_parse_ping(r, ctx, b);
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 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2219 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2220 }
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 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2223 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2226 ngx_post_event(u->peer.connection->write, &ngx_posted_events);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2227 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2228 }
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 if (ctx->type == NGX_HTTP_V2_PUSH_PROMISE_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2231 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2232 "upstream sent unexpected push promise frame");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2233 return NGX_ERROR;
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 (ctx->type == NGX_HTTP_V2_HEADERS_FRAME
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2237 || ctx->type == NGX_HTTP_V2_CONTINUATION_FRAME)
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 for ( ;; ) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2240
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2241 rc = ngx_http_grpc_parse_header(r, ctx, b);
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 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2244 break;
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 (rc == NGX_OK) {
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 /* a header line has been parsed successfully */
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 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2252 "grpc trailer: \"%V: %V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2253 &ctx->name, &ctx->value);
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 (ctx->name.len && ctx->name.data[0] == ':') {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2256 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2257 "upstream sent invalid "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2258 "trailer \"%V: %V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2259 &ctx->name, &ctx->value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2260 return NGX_ERROR;
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 h = ngx_list_push(&u->headers_in.trailers);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2264 if (h == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2265 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2266 }
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 h->key = ctx->name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2269 h->value = ctx->value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2270 h->lowcase_key = h->key.data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2271 h->hash = ngx_hash_key(h->key.data, h->key.len);
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 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2274 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2275
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2276 if (rc == NGX_HTTP_PARSE_HEADER_DONE) {
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 /* a whole header has been parsed successfully */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2279
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2280 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2281 "grpc trailer done");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2282
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2283 if (ctx->end_stream) {
7349
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2284 ctx->done = 1;
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2285 break;
7233
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 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2289 "upstream sent trailer without "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2290 "end stream flag");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2291 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2294 /* there was error while a header line parsing */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2295
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2296 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2297 "upstream sent invalid trailer");
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 return NGX_ERROR;
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
7349
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2302 if (rc == NGX_HTTP_PARSE_HEADER_DONE) {
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2303 continue;
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2304 }
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2305
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2306 /* rc == NGX_AGAIN */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2307
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2308 if (ctx->rest == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2309 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2310 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2311 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2312
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2313 return NGX_AGAIN;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2316 if (ctx->type != NGX_HTTP_V2_DATA_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2317
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2318 /* priority, unknown frames */
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 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2321 ctx->rest -= b->last - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2322 b->pos = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2323 return NGX_AGAIN;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2326 b->pos += ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2327 ctx->rest = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2328 ctx->state = ngx_http_grpc_st_start;
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 continue;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2333 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2334 * data frame:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2335 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2336 * +---------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2337 * |Pad Length? (8)|
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 * | Data (*) ...
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2340 * +---------------------------------------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2341 * | Padding (*) ...
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2342 * +---------------------------------------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2343 */
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 if (ctx->flags & NGX_HTTP_V2_PADDED_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2346
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2347 if (ctx->rest == 0) {
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 too short http2 frame");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2350 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2351 }
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 if (b->pos == b->last) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2354 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2355 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2356
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2357 ctx->flags &= ~NGX_HTTP_V2_PADDED_FLAG;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2358 ctx->padding = *b->pos++;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2359 ctx->rest -= 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2360
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2361 if (ctx->padding > ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2362 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2363 "upstream sent http2 frame with too long "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2364 "padding: %d in frame %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2365 ctx->padding, ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2366 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2369 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2370 }
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 (ctx->rest == ctx->padding) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2373 goto done;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2374 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2375
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2376 if (b->pos == b->last) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2377 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2378 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2379
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2380 cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2381 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2382 return NGX_ERROR;
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 *ll = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2386 ll = &cl->next;
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 buf = cl->buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2389
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2390 buf->flush = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2391 buf->memory = 1;
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 buf->pos = b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2394 buf->tag = u->output.tag;
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 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2397 "grpc output buf %p", buf->pos);
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 (b->last - b->pos < (ssize_t) ctx->rest - ctx->padding) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2400
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2401 ctx->rest -= b->last - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2402 b->pos = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2403 buf->last = b->pos;
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 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2406 }
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 b->pos += ctx->rest - ctx->padding;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2409 buf->last = b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2410 ctx->rest = ctx->padding;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2411
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2412 done:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2413
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2414 if (ctx->padding) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2415 ctx->state = ngx_http_grpc_st_padding;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2416 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2417 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2418
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2419 ctx->state = ngx_http_grpc_st_start;
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 if (ctx->flags & NGX_HTTP_V2_END_STREAM_FLAG) {
7349
f6047a579ca1 gRPC: improved keepalive handling.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7321
diff changeset
2422 ctx->done = 1;
7233
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 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2425
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2426 return NGX_OK;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2429
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2430 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2431 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
2432 ngx_buf_t *b)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2433 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2434 u_char ch, *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2435 ngx_http_grpc_state_e state;
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 state = ctx->state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2438
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2439 for (p = b->pos; p < b->last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2440 ch = *p;
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 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2443 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2444 "grpc frame byte: %02Xd, s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2445 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2446
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2447 switch (state) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2448
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2449 case ngx_http_grpc_st_start:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2450 ctx->rest = ch << 16;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2451 state = ngx_http_grpc_st_length_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2452 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2453
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2454 case ngx_http_grpc_st_length_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2455 ctx->rest |= ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2456 state = ngx_http_grpc_st_length_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2457 break;
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 case ngx_http_grpc_st_length_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2460 ctx->rest |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2461
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2462 if (ctx->rest > NGX_HTTP_V2_DEFAULT_FRAME_SIZE) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2463 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2464 "upstream sent too large http2 frame: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2465 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2466 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2467 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2468
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2469 state = ngx_http_grpc_st_type;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2470 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2471
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2472 case ngx_http_grpc_st_type:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2473 ctx->type = ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2474 state = ngx_http_grpc_st_flags;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2475 break;
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 case ngx_http_grpc_st_flags:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2478 ctx->flags = ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2479 state = ngx_http_grpc_st_stream_id;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2480 break;
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 case ngx_http_grpc_st_stream_id:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2483 ctx->stream_id = (ch & 0x7f) << 24;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2484 state = ngx_http_grpc_st_stream_id_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2485 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2486
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2487 case ngx_http_grpc_st_stream_id_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2488 ctx->stream_id |= ch << 16;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2489 state = ngx_http_grpc_st_stream_id_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2490 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2491
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2492 case ngx_http_grpc_st_stream_id_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2493 ctx->stream_id |= ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2494 state = ngx_http_grpc_st_stream_id_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2495 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2496
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2497 case ngx_http_grpc_st_stream_id_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2498 ctx->stream_id |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2499
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2500 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2501 "grpc frame: %d, len: %uz, f:%d, i:%ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2502 ctx->type, ctx->rest, ctx->flags, ctx->stream_id);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2503
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2504 b->pos = p + 1;
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 ctx->state = ngx_http_grpc_st_payload;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2507 ctx->frame_state = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2508
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2509 return NGX_OK;
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 /* suppress warning */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2512 case ngx_http_grpc_st_payload:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2513 case ngx_http_grpc_st_padding:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2514 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2515 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2516 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2517
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2518 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2519 ctx->state = state;
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 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2522 }
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2525 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2526 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
2527 ngx_buf_t *b)
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 u_char ch, *p, *last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2530 size_t min;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2531 ngx_int_t rc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2532 enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2533 sw_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2534 sw_padding_length,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2535 sw_dependency,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2536 sw_dependency_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2537 sw_dependency_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2538 sw_dependency_4,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2539 sw_weight,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2540 sw_fragment,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2541 sw_padding
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2542 } state;
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 state = ctx->frame_state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2545
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2546 if (state == sw_start) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2547
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2548 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2549 "grpc parse header: start");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2550
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2551 if (ctx->type == NGX_HTTP_V2_HEADERS_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2552 ctx->parsing_headers = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2553 ctx->fragment_state = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2554
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2555 min = (ctx->flags & NGX_HTTP_V2_PADDED_FLAG ? 1 : 0)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2556 + (ctx->flags & NGX_HTTP_V2_PRIORITY_FLAG ? 5 : 0);
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 if (ctx->rest < min) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2559 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2560 "upstream sent headers frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2561 "with invalid length: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2562 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2563 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2564 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2565
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2566 if (ctx->flags & NGX_HTTP_V2_END_STREAM_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2567 ctx->end_stream = 1;
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 if (ctx->flags & NGX_HTTP_V2_PADDED_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2571 state = sw_padding_length;
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 } else if (ctx->flags & NGX_HTTP_V2_PRIORITY_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2574 state = sw_dependency;
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 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2577 state = sw_fragment;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2578 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2579
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2580 } else if (ctx->type == NGX_HTTP_V2_CONTINUATION_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2581 state = sw_fragment;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2582 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2583
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2584 ctx->padding = 0;
7242
25a4353633a0 gRPC: fixed missing state save in frame header parsing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7240
diff changeset
2585 ctx->frame_state = state;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2586 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2587
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2588 if (state < sw_fragment) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2589
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2590 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2591 last = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2592
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2593 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2594 last = b->pos + ctx->rest;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2597 for (p = b->pos; p < last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2598 ch = *p;
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 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2601 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2602 "grpc header byte: %02Xd s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2603 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2604
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2605 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2606 * headers frame:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2607 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2608 * +---------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2609 * |Pad Length? (8)|
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2610 * +-+-------------+----------------------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2611 * |E| Stream Dependency? (31) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2612 * +-+-------------+----------------------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2613 * | Weight? (8) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2614 * +-+-------------+----------------------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2615 * | Header Block Fragment (*) ...
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 * | Padding (*) ...
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2618 * +--------------------------------------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2619 */
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 switch (state) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2622
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2623 case 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 ctx->padding = ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2626
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2627 if (ctx->flags & NGX_HTTP_V2_PRIORITY_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2628 state = sw_dependency;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2629 break;
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 goto fragment;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2633
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2634 case sw_dependency:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2635 state = sw_dependency_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2636 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2637
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2638 case sw_dependency_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2639 state = sw_dependency_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2640 break;
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 case sw_dependency_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2643 state = sw_dependency_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2644 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2645
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2646 case sw_dependency_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2647 state = sw_weight;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2648 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2649
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2650 case sw_weight:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2651 goto fragment;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2652
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2653 /* suppress warning */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2654 case sw_start:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2655 case sw_fragment:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2656 case sw_padding:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2657 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2658 }
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 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2662 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2663
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2664 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2665 return NGX_AGAIN;
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 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 p++;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2670 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2671 b->pos = p;
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 if (ctx->padding > ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2674 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2675 "upstream sent http2 frame with too long "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2676 "padding: %d in frame %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2677 ctx->padding, ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2678 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2679 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2680
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2681 state = sw_fragment;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2682 ctx->frame_state = state;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2685 if (state == sw_fragment) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2686
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2687 rc = ngx_http_grpc_parse_fragment(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2688
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2689 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2690 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2691 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2692
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2693 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2694 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2695 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2696
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2697 if (rc == NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2698 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2699 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2700
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2701 /* rc == NGX_DONE */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2702
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2703 state = sw_padding;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2704 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2705 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2706
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2707 if (state == sw_padding) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2708
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2709 if (b->last - b->pos < (ssize_t) ctx->rest) {
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 ctx->rest -= b->last - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2712 b->pos = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2713
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2714 return NGX_AGAIN;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2717 b->pos += ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2718 ctx->rest = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2719
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2720 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2721
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2722 if (ctx->flags & NGX_HTTP_V2_END_HEADERS_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2723
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2724 if (ctx->fragment_state) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2725 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2726 "upstream sent truncated http2 header");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2727 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2728 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2729
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2730 ctx->parsing_headers = 0;
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 return NGX_HTTP_PARSE_HEADER_DONE;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2733 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2734
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2735 return NGX_AGAIN;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2738 /* unreachable */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2739
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2740 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2741 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2742
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 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2745 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
2746 ngx_buf_t *b)
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 u_char ch, *p, *last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2749 size_t size;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2750 ngx_uint_t index, size_update;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2751 enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2752 sw_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2753 sw_index,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2754 sw_name_length,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2755 sw_name_length_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2756 sw_name_length_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2757 sw_name_length_4,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2758 sw_name,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2759 sw_name_bytes,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2760 sw_value_length,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2761 sw_value_length_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2762 sw_value_length_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2763 sw_value_length_4,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2764 sw_value,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2765 sw_value_bytes
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2766 } state;
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 /* header block fragment */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2769
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2770 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2771 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2772 "grpc header fragment %p:%p rest:%uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2773 b->pos, b->last, ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2774 #endif
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 (b->last - b->pos < (ssize_t) ctx->rest - ctx->padding) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2777 last = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2778
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2779 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2780 last = b->pos + ctx->rest - ctx->padding;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2783 state = ctx->fragment_state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2784
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2785 for (p = b->pos; p < last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2786 ch = *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2787
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2788 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2789 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2790 "grpc header byte: %02Xd s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2791 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2792
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2793 switch (state) {
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 case sw_start:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2796 ctx->index = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2797
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2798 if ((ch & 0x80) == 0x80) {
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 * indexed header:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2801 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2802 * 0 1 2 3 4 5 6 7
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2803 * +---+---+---+---+---+---+---+---+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2804 * | 1 | Index (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2805 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2806 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2807
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2808 index = ch & ~0x80;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2809
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2810 if (index == 0 || index > 61) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2811 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2812 "upstream sent invalid http2 "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2813 "table index: %ui", index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2814 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2815 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2816
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2817 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2818 "grpc indexed header: %ui", index);
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 ctx->index = index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2821 ctx->literal = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2822
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2823 goto done;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2824
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2825 } else if ((ch & 0xc0) == 0x40) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2826 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2827 * literal header with incremental indexing:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2828 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2829 * 0 1 2 3 4 5 6 7
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 * | 0 | 1 | Index (6+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2832 * +---+---+-----------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2833 * | H | Value Length (7+) |
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 * | Value String (Length octets) |
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 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2838 * 0 1 2 3 4 5 6 7
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 * | 0 | 1 | 0 |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2841 * +---+---+-----------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2842 * | H | Name Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2843 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2844 * | Name String (Length octets) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2845 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2846 * | H | Value Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2847 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2848 * | Value String (Length octets) |
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 */
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 index = ch & ~0xc0;
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 if (index > 61) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2855 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2856 "upstream sent invalid http2 "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2857 "table index: %ui", index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2858 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2861 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2862 "grpc literal header: %ui", index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2863
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2864 if (index == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2865 state = sw_name_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2866 break;
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 ctx->index = index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2870 ctx->literal = 1;
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 state = sw_value_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2873 break;
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 } else if ((ch & 0xe0) == 0x20) {
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 * dynamic table size update:
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 * 0 1 2 3 4 5 6 7
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 | 0 | 1 | Max size (5+) |
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 */
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 size_update = ch & ~0xe0;
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 if (size_update > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2888 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2889 "upstream sent invalid http2 "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2890 "dynamic table size update: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2891 size_update);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2892 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2895 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2896 "grpc table size update: %ui", size_update);
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 break;
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 } else if ((ch & 0xf0) == 0x10) {
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 * literal header field never indexed:
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 * 0 1 2 3 4 5 6 7
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 * | 0 | 0 | 0 | 1 | Index (4+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2907 * +---+---+-----------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2908 * | H | Value Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2909 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2910 * | Value String (Length octets) |
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 * 0 1 2 3 4 5 6 7
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2914 * +---+---+---+---+---+---+---+---+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2915 * | 0 | 0 | 0 | 1 | 0 |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2916 * +---+---+-----------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2917 * | H | Name Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2918 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2919 * | Name String (Length octets) |
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 * | H | Value Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2922 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2923 * | Value String (Length octets) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2924 * +-------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2925 */
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 index = ch & ~0xf0;
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 if (index == 0x0f) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2930 ctx->index = index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2931 ctx->literal = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2932 state = sw_index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2933 break;
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 if (index == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2937 state = sw_name_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2938 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2939 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2940
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2941 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2942 "grpc literal header never indexed: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2943 index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2944
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2945 ctx->index = index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2946 ctx->literal = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2947
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2948 state = sw_value_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2949 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2950
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2951 } else if ((ch & 0xf0) == 0x00) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2952 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2953 * literal header field without indexing:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2954 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2955 * 0 1 2 3 4 5 6 7
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2956 * +---+---+---+---+---+---+---+---+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2957 * | 0 | 0 | 0 | 0 | Index (4+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2958 * +---+---+-----------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2959 * | H | Value Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2960 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2961 * | Value String (Length octets) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2962 * +-------------------------------+
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 * 0 1 2 3 4 5 6 7
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2965 * +---+---+---+---+---+---+---+---+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2966 * | 0 | 0 | 0 | 0 | 0 |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2967 * +---+---+-----------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2968 * | H | Name Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2969 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2970 * | Name String (Length octets) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2971 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2972 * | H | Value Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2973 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2974 * | Value String (Length octets) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2975 * +-------------------------------+
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 index = ch & ~0xf0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2979
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2980 if (index == 0x0f) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2981 ctx->index = index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2982 ctx->literal = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2983 state = sw_index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2984 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2985 }
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 if (index == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2988 state = sw_name_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2989 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2990 }
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 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2993 "grpc literal header without indexing: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2994 index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2995
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2996 ctx->index = index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2997 ctx->literal = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2998
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2999 state = sw_value_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3000 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3001 }
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 /* not reached */
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 return NGX_ERROR;
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 case sw_index:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3008 ctx->index = ctx->index + (ch & ~0x80);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3009
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3010 if (ch & 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3011 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3012 "upstream sent http2 table index "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3013 "with continuation flag");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3014 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3017 if (ctx->index > 61) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3018 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3019 "upstream sent invalid http2 "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3020 "table index: %ui", ctx->index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3021 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3022 }
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 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3025 "grpc header index: %ui", ctx->index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3026
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3027 state = sw_value_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3028 break;
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 case sw_name_length:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3031 ctx->field_huffman = ch & 0x80 ? 1 : 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3032 ctx->field_length = ch & ~0x80;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3033
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3034 if (ctx->field_length == 0x7f) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3035 state = sw_name_length_2;
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 (ctx->field_length == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3040 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3041 "upstream sent zero http2 "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3042 "header name length");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3043 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3044 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3045
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3046 state = sw_name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3047 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3048
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3049 case sw_name_length_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3050 ctx->field_length += ch & ~0x80;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3051
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3052 if (ch & 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3053 state = sw_name_length_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3054 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3055 }
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 state = sw_name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3058 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3059
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3060 case sw_name_length_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3061 ctx->field_length += (ch & ~0x80) << 7;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3062
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3063 if (ch & 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3064 state = sw_name_length_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3065 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3066 }
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 state = sw_name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3069 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3070
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3071 case sw_name_length_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3072 ctx->field_length += (ch & ~0x80) << 14;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3073
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3074 if (ch & 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3075 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3076 "upstream sent too large http2 "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3077 "header name length");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3078 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3079 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3080
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3081 state = sw_name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3082 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3083
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3084 case sw_name:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3085 ctx->name.len = ctx->field_huffman ?
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3086 ctx->field_length * 8 / 5 : ctx->field_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3087
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3088 ctx->name.data = ngx_pnalloc(r->pool, ctx->name.len + 1);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3089 if (ctx->name.data == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3090 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3091 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3092
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3093 ctx->field_end = ctx->name.data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3094 ctx->field_rest = ctx->field_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3095 ctx->field_state = 0;
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 state = sw_name_bytes;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3098
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3099 /* fall through */
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_bytes:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3102
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3103 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3104 "grpc name: len:%uz h:%d last:%uz, rest:%uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3105 ctx->field_length,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3106 ctx->field_huffman,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3107 last - p,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3108 ctx->rest - (p - b->pos));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3109
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3110 size = ngx_min(last - p, (ssize_t) ctx->field_rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3111 ctx->field_rest -= size;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3112
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3113 if (ctx->field_huffman) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3114 if (ngx_http_v2_huff_decode(&ctx->field_state, p, size,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3115 &ctx->field_end,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3116 ctx->field_rest == 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3117 r->connection->log)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3118 != NGX_OK)
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 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3121 "upstream sent invalid encoded header");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3122 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3123 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3124
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3125 ctx->name.len = ctx->field_end - ctx->name.data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3126 ctx->name.data[ctx->name.len] = '\0';
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3127
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3128 } else {
7240
413189f03c8d gRPC: fixed parsing response headers split on CONTINUATION frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7235
diff changeset
3129 ctx->field_end = ngx_cpymem(ctx->field_end, p, size);
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3130 ctx->name.data[ctx->name.len] = '\0';
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 p += size - 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3134
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3135 if (ctx->field_rest == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3136 state = sw_value_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3137 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3138
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3139 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3140
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3141 case sw_value_length:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3142 ctx->field_huffman = ch & 0x80 ? 1 : 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3143 ctx->field_length = ch & ~0x80;
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 if (ctx->field_length == 0x7f) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3146 state = sw_value_length_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3147 break;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3150 if (ctx->field_length == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3151 ngx_str_set(&ctx->value, "");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3152 goto done;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3153 }
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 state = sw_value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3156 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3157
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3158 case sw_value_length_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3159 ctx->field_length += ch & ~0x80;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3160
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3161 if (ch & 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3162 state = sw_value_length_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3163 break;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3166 state = sw_value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3167 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3168
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3169 case sw_value_length_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3170 ctx->field_length += (ch & ~0x80) << 7;
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 if (ch & 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3173 state = sw_value_length_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3174 break;
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 state = sw_value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3178 break;
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 case sw_value_length_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3181 ctx->field_length += (ch & ~0x80) << 14;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3182
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3183 if (ch & 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3184 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3185 "upstream sent too large http2 "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3186 "header value length");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3187 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3188 }
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 state = sw_value;
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:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3194 ctx->value.len = ctx->field_huffman ?
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3195 ctx->field_length * 8 / 5 : ctx->field_length;
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 ctx->value.data = ngx_pnalloc(r->pool, ctx->value.len + 1);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3198 if (ctx->value.data == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3199 return NGX_ERROR;
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 ctx->field_end = ctx->value.data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3203 ctx->field_rest = ctx->field_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3204 ctx->field_state = 0;
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 state = sw_value_bytes;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3207
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3208 /* fall through */
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_bytes:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3211
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3212 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3213 "grpc value: len:%uz h:%d last:%uz, rest:%uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3214 ctx->field_length,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3215 ctx->field_huffman,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3216 last - p,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3217 ctx->rest - (p - b->pos));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3218
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3219 size = ngx_min(last - p, (ssize_t) ctx->field_rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3220 ctx->field_rest -= size;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3221
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3222 if (ctx->field_huffman) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3223 if (ngx_http_v2_huff_decode(&ctx->field_state, p, size,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3224 &ctx->field_end,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3225 ctx->field_rest == 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3226 r->connection->log)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3227 != NGX_OK)
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 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3230 "upstream sent invalid encoded header");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3231 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3232 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3234 ctx->value.len = ctx->field_end - ctx->value.data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3235 ctx->value.data[ctx->value.len] = '\0';
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3236
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3237 } else {
7240
413189f03c8d gRPC: fixed parsing response headers split on CONTINUATION frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7235
diff changeset
3238 ctx->field_end = ngx_cpymem(ctx->field_end, p, size);
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3239 ctx->value.data[ctx->value.len] = '\0';
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 p += size - 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3243
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3244 if (ctx->field_rest == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3245 goto done;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3246 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3247
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3248 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3249 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3250
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3251 continue;
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 done:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3254
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3255 p++;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3256 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3257 ctx->fragment_state = sw_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3258 b->pos = p;
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 if (ctx->index) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3261 ctx->name = *ngx_http_v2_get_static_name(ctx->index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3262 }
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 if (ctx->index && !ctx->literal) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3265 ctx->value = *ngx_http_v2_get_static_value(ctx->index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3266 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3267
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3268 if (!ctx->index) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3269 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
3270 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3271 "upstream sent invalid header: \"%V: %V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3272 &ctx->name, &ctx->value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3273 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3274 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3275 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3276
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3277 if (!ctx->index || ctx->literal) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3278 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
3279 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3280 "upstream sent invalid header: \"%V: %V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3281 &ctx->name, &ctx->value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3282 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3283 }
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 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3287 }
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 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3290 ctx->fragment_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3291 b->pos = p;
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 if (ctx->rest > ctx->padding) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3294 return NGX_AGAIN;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3297 return NGX_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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3301 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3302 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
3303 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3304 u_char ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3305 ngx_uint_t i;
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 for (i = 0; i < s->len; i++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3308 ch = s->data[i];
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3309
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3310 if (ch == ':' && i > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3311 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3312 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3313
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3314 if (ch >= 'A' && ch <= 'Z') {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3315 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3316 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3317
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3318 if (ch == '\0' || ch == CR || ch == LF) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3319 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3320 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3321 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3322
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3323 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3324 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3325
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 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3328 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
3329 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3330 u_char ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3331 ngx_uint_t i;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3332
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3333 for (i = 0; i < s->len; i++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3334 ch = s->data[i];
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 if (ch == '\0' || ch == CR || ch == LF) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3337 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3338 }
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 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3342 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3343
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 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3346 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
3347 ngx_buf_t *b)
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 u_char ch, *p, *last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3350 enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3351 sw_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3352 sw_error_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3353 sw_error_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3354 sw_error_4
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3355 } state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3356
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3357 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3358 last = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3359
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3360 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3361 last = b->pos + ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3362 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3363
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3364 state = ctx->frame_state;
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 (state == sw_start) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3367 if (ctx->rest != 4) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3368 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3369 "upstream sent rst stream frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3370 "with invalid length: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3371 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3372 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3376 for (p = b->pos; p < last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3377 ch = *p;
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 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3380 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3381 "grpc rst byte: %02Xd s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3382 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3383
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3384 switch (state) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3385
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3386 case sw_start:
7249
070c972336c4 gRPC: fixed possible sign extension of error and setting_value.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7242
diff changeset
3387 ctx->error = (ngx_uint_t) ch << 24;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3388 state = sw_error_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3389 break;
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 case sw_error_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3392 ctx->error |= ch << 16;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3393 state = sw_error_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3394 break;
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 case sw_error_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3397 ctx->error |= ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3398 state = sw_error_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3399 break;
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 case sw_error_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3402 ctx->error |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3403 state = sw_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3404
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3405 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3406 "grpc error: %ui", ctx->error);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3407
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3408 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3409 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3410 }
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 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3413 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3414 b->pos = p;
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 if (ctx->rest > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3417 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3418 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3419
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3420 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3421 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3422
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3423
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3424 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3425 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
3426 ngx_buf_t *b)
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 u_char ch, *p, *last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3429 enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3430 sw_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3431 sw_last_stream_id_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3432 sw_last_stream_id_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3433 sw_last_stream_id_4,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3434 sw_error,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3435 sw_error_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3436 sw_error_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3437 sw_error_4,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3438 sw_debug
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3439 } state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3440
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3441 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3442 last = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3443
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3444 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3445 last = b->pos + ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3446 }
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 state = ctx->frame_state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3449
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3450 if (state == sw_start) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3451
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3452 if (ctx->stream_id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3453 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3454 "upstream sent goaway frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3455 "with non-zero stream id: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3456 ctx->stream_id);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3457 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3458 }
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 if (ctx->rest < 8) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3461 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3462 "upstream sent goaway frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3463 "with invalid length: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3464 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3465 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3466 }
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3469 for (p = b->pos; p < last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3470 ch = *p;
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 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3473 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3474 "grpc goaway byte: %02Xd s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3475 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3476
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3477 switch (state) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3478
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3479 case sw_start:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3480 ctx->stream_id = (ch & 0x7f) << 24;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3481 state = sw_last_stream_id_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3482 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3483
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3484 case sw_last_stream_id_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3485 ctx->stream_id |= ch << 16;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3486 state = sw_last_stream_id_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3487 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3488
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3489 case sw_last_stream_id_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3490 ctx->stream_id |= ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3491 state = sw_last_stream_id_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3492 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3493
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3494 case sw_last_stream_id_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3495 ctx->stream_id |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3496 state = sw_error;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3497 break;
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 case sw_error:
7249
070c972336c4 gRPC: fixed possible sign extension of error and setting_value.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7242
diff changeset
3500 ctx->error = (ngx_uint_t) ch << 24;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3501 state = sw_error_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3502 break;
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 case sw_error_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3505 ctx->error |= ch << 16;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3506 state = sw_error_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3507 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3508
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3509 case sw_error_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3510 ctx->error |= ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3511 state = sw_error_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3512 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3513
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3514 case sw_error_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3515 ctx->error |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3516 state = sw_debug;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3517 break;
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 case sw_debug:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3520 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3521 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3522 }
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 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3525 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3526 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3527
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3528 if (ctx->rest > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3529 return NGX_AGAIN;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3532 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3533 "grpc goaway: %ui, stream %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3534 ctx->error, ctx->stream_id);
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 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3537
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3538 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3539 }
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3542 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3543 ngx_http_grpc_parse_window_update(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3544 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b)
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 u_char ch, *p, *last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3547 enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3548 sw_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3549 sw_size_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3550 sw_size_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3551 sw_size_4
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3552 } state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3553
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3554 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3555 last = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3556
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3557 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3558 last = b->pos + ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3559 }
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 state = ctx->frame_state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3562
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3563 if (state == sw_start) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3564 if (ctx->rest != 4) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3565 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3566 "upstream sent window update frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3567 "with invalid length: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3568 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3569 return NGX_ERROR;
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 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3572
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3573 for (p = b->pos; p < last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3574 ch = *p;
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 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3577 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3578 "grpc window update byte: %02Xd s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3579 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3580
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3581 switch (state) {
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 case sw_start:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3584 ctx->window_update = (ch & 0x7f) << 24;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3585 state = sw_size_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3586 break;
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 case sw_size_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3589 ctx->window_update |= ch << 16;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3590 state = sw_size_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3591 break;
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 case sw_size_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3594 ctx->window_update |= ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3595 state = sw_size_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3596 break;
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 case sw_size_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3599 ctx->window_update |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3600 state = sw_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3601 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3602 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3603 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3604
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3605 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3606 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3607 b->pos = p;
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 if (ctx->rest > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3610 return NGX_AGAIN;
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 ctx->state = ngx_http_grpc_st_start;
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 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3616 "grpc window update: %ui", ctx->window_update);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3617
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3618 if (ctx->stream_id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3619
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3620 if (ctx->window_update > (size_t) NGX_HTTP_V2_MAX_WINDOW
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3621 - ctx->send_window)
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 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3624 "upstream sent too large window update");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3625 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3626 }
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 ctx->send_window += ctx->window_update;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3629
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3630 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3631
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3632 if (ctx->window_update > NGX_HTTP_V2_MAX_WINDOW
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3633 - ctx->connection->send_window)
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 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3636 "upstream sent too large window update");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3637 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3638 }
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 ctx->connection->send_window += ctx->window_update;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3641 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3642
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3643 return NGX_OK;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3646
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3647 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3648 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
3649 ngx_buf_t *b)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3650 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3651 u_char ch, *p, *last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3652 ssize_t window_update;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3653 enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3654 sw_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3655 sw_id,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3656 sw_id_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3657 sw_value,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3658 sw_value_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3659 sw_value_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3660 sw_value_4
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3661 } state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3662
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3663 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3664 last = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3665
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3666 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3667 last = b->pos + ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3668 }
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 state = ctx->frame_state;
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 (state == sw_start) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3673
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3674 if (ctx->stream_id) {
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 settings frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3677 "with non-zero stream id: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3678 ctx->stream_id);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3679 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3680 }
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 if (ctx->flags & NGX_HTTP_V2_ACK_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3683 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3684 "grpc settings ack");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3685
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3686 if (ctx->rest != 0) {
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 settings frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3689 "with ack flag and non-zero length: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3690 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3691 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3692 }
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 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3695
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3696 return NGX_OK;
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 if (ctx->rest % 6 != 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3700 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3701 "upstream sent settings frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3702 "with invalid length: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3703 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3704 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3705 }
7379
57463f4e2fcd gRPC: limited allocations due to ping and settings frames.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7371
diff changeset
3706
57463f4e2fcd gRPC: limited allocations due to ping and settings frames.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7371
diff changeset
3707 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
3708 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
3709 "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
3710 return NGX_ERROR;
57463f4e2fcd gRPC: limited allocations due to ping and settings frames.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7371
diff changeset
3711 }
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3712 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3713
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3714 for (p = b->pos; p < last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3715 ch = *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3716
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3717 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3718 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3719 "grpc settings byte: %02Xd s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3720 #endif
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 switch (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 case sw_start:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3725 case sw_id:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3726 ctx->setting_id = ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3727 state = sw_id_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3728 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3729
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3730 case sw_id_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3731 ctx->setting_id |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3732 state = sw_value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3733 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3734
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3735 case sw_value:
7249
070c972336c4 gRPC: fixed possible sign extension of error and setting_value.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7242
diff changeset
3736 ctx->setting_value = (ngx_uint_t) ch << 24;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3737 state = sw_value_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3738 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3739
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3740 case sw_value_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3741 ctx->setting_value |= ch << 16;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3742 state = sw_value_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3743 break;
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 case sw_value_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3746 ctx->setting_value |= ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3747 state = sw_value_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3748 break;
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 case sw_value_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3751 ctx->setting_value |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3752 state = sw_id;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3753
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3754 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3755 "grpc setting: %ui %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3756 ctx->setting_id, ctx->setting_value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3757
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3758 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3759 * The following settings are defined by the protocol:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3760 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3761 * SETTINGS_HEADER_TABLE_SIZE, SETTINGS_ENABLE_PUSH,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3762 * SETTINGS_MAX_CONCURRENT_STREAMS, SETTINGS_INITIAL_WINDOW_SIZE,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3763 * SETTINGS_MAX_FRAME_SIZE, SETTINGS_MAX_HEADER_LIST_SIZE
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 * Only SETTINGS_INITIAL_WINDOW_SIZE seems to be needed in
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3766 * a simple client.
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3767 */
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 (ctx->setting_id == 0x04) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3770 /* SETTINGS_INITIAL_WINDOW_SIZE */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3771
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3772 if (ctx->setting_value > NGX_HTTP_V2_MAX_WINDOW) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3773 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3774 "upstream sent settings frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3775 "with too large initial window size: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3776 ctx->setting_value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3777 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3778 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3779
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3780 window_update = ctx->setting_value
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3781 - ctx->connection->init_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3782 ctx->connection->init_window = ctx->setting_value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3783
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3784 if (ctx->send_window > 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3785 && window_update > (ssize_t) NGX_HTTP_V2_MAX_WINDOW
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3786 - ctx->send_window)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3787 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3788 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3789 "upstream sent settings frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3790 "with too large initial window size: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3791 ctx->setting_value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3792 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3793 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3794
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3795 ctx->send_window += window_update;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3798 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3799 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3800 }
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 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3803 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3804 b->pos = p;
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 if (ctx->rest > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3807 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3808 }
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 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3811
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3812 return ngx_http_grpc_send_settings_ack(r, ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3813 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3814
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3815
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3816 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3817 ngx_http_grpc_parse_ping(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3818 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b)
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 u_char ch, *p, *last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3821 enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3822 sw_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3823 sw_data_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3824 sw_data_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3825 sw_data_4,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3826 sw_data_5,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3827 sw_data_6,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3828 sw_data_7,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3829 sw_data_8
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3830 } state;
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 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3833 last = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3834
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3835 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3836 last = b->pos + ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3837 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3838
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3839 state = ctx->frame_state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3840
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3841 if (state == sw_start) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3842
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3843 if (ctx->stream_id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3844 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3845 "upstream sent ping frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3846 "with non-zero stream id: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3847 ctx->stream_id);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3848 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3851 if (ctx->rest != 8) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3852 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3853 "upstream sent ping frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3854 "with invalid length: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3855 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3856 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3859 if (ctx->flags & NGX_HTTP_V2_ACK_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3860 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3861 "upstream sent ping frame with ack flag");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3862 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3863 }
7379
57463f4e2fcd gRPC: limited allocations due to ping and settings frames.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7371
diff changeset
3864
57463f4e2fcd gRPC: limited allocations due to ping and settings frames.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7371
diff changeset
3865 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
3866 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
3867 "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
3868 return NGX_ERROR;
57463f4e2fcd gRPC: limited allocations due to ping and settings frames.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7371
diff changeset
3869 }
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3870 }
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 for (p = b->pos; p < last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3873 ch = *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3874
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3875 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3876 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3877 "grpc ping byte: %02Xd s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3878 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3879
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3880 if (state < sw_data_8) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3881 ctx->ping_data[state] = ch;
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 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3885 ctx->ping_data[7] = ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3886 state = sw_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3887
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3888 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3889 "grpc ping");
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 }
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 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3894 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3895 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3896
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3897 if (ctx->rest > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3898 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3899 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3900
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3901 ctx->state = ngx_http_grpc_st_start;
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 return ngx_http_grpc_send_ping_ack(r, ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3904 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3905
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3906
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3907 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3908 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
3909 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3910 ngx_chain_t *cl, **ll;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3911 ngx_http_grpc_frame_t *f;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3912
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3913 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3914 "grpc send settings ack");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3915
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3916 for (cl = ctx->out, ll = &ctx->out; cl; cl = cl->next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3917 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3918 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3919
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3920 cl = ngx_http_grpc_get_buf(r, ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3921 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3922 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3925 f = (ngx_http_grpc_frame_t *) cl->buf->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3926 cl->buf->last += sizeof(ngx_http_grpc_frame_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3927
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3928 f->length_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3929 f->length_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3930 f->length_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3931 f->type = NGX_HTTP_V2_SETTINGS_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3932 f->flags = NGX_HTTP_V2_ACK_FLAG;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3933 f->stream_id_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3934 f->stream_id_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3935 f->stream_id_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3936 f->stream_id_3 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3937
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3938 *ll = cl;
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 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3941 }
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 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3945 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
3946 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3947 ngx_chain_t *cl, **ll;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3948 ngx_http_grpc_frame_t *f;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3949
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3950 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3951 "grpc send ping ack");
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 for (cl = ctx->out, ll = &ctx->out; cl; cl = cl->next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3954 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3955 }
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 cl = ngx_http_grpc_get_buf(r, ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3958 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3959 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3960 }
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 f = (ngx_http_grpc_frame_t *) cl->buf->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3963 cl->buf->last += sizeof(ngx_http_grpc_frame_t);
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 f->length_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3966 f->length_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3967 f->length_2 = 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3968 f->type = NGX_HTTP_V2_PING_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3969 f->flags = NGX_HTTP_V2_ACK_FLAG;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3970 f->stream_id_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3971 f->stream_id_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3972 f->stream_id_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3973 f->stream_id_3 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3974
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3975 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
3976
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3977 *ll = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3978
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3979 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3980 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3981
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3982
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3983 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3984 ngx_http_grpc_send_window_update(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3985 ngx_http_grpc_ctx_t *ctx)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3986 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3987 size_t n;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3988 ngx_chain_t *cl, **ll;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3989 ngx_http_grpc_frame_t *f;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3990
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3991 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3992 "grpc send window update: %uz %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3993 ctx->connection->recv_window, ctx->recv_window);
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 for (cl = ctx->out, ll = &ctx->out; cl; cl = cl->next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3996 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3997 }
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 cl = ngx_http_grpc_get_buf(r, ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4000 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4001 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4002 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4003
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4004 f = (ngx_http_grpc_frame_t *) cl->buf->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4005 cl->buf->last += sizeof(ngx_http_grpc_frame_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4006
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4007 f->length_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4008 f->length_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4009 f->length_2 = 4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4010 f->type = NGX_HTTP_V2_WINDOW_UPDATE_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4011 f->flags = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4012 f->stream_id_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4013 f->stream_id_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4014 f->stream_id_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4015 f->stream_id_3 = 0;
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 n = NGX_HTTP_V2_MAX_WINDOW - ctx->connection->recv_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4018 ctx->connection->recv_window = NGX_HTTP_V2_MAX_WINDOW;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4019
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4020 *cl->buf->last++ = (u_char) ((n >> 24) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4021 *cl->buf->last++ = (u_char) ((n >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4022 *cl->buf->last++ = (u_char) ((n >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4023 *cl->buf->last++ = (u_char) (n & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4024
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4025 f = (ngx_http_grpc_frame_t *) cl->buf->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4026 cl->buf->last += sizeof(ngx_http_grpc_frame_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4027
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4028 f->length_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4029 f->length_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4030 f->length_2 = 4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4031 f->type = NGX_HTTP_V2_WINDOW_UPDATE_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4032 f->flags = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4033 f->stream_id_0 = (u_char) ((ctx->id >> 24) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4034 f->stream_id_1 = (u_char) ((ctx->id >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4035 f->stream_id_2 = (u_char) ((ctx->id >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4036 f->stream_id_3 = (u_char) (ctx->id & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4037
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4038 n = NGX_HTTP_V2_MAX_WINDOW - ctx->recv_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4039 ctx->recv_window = NGX_HTTP_V2_MAX_WINDOW;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4040
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4041 *cl->buf->last++ = (u_char) ((n >> 24) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4042 *cl->buf->last++ = (u_char) ((n >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4043 *cl->buf->last++ = (u_char) ((n >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4044 *cl->buf->last++ = (u_char) (n & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4045
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4046 *ll = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4047
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4048 return NGX_OK;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4052 static ngx_chain_t *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4053 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
4054 {
7305
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4055 u_char *start;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4056 ngx_buf_t *b;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4057 ngx_chain_t *cl;
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 cl = ngx_chain_get_free_buf(r->pool, &ctx->free);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4060 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4061 return NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4062 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4063
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4064 b = cl->buf;
7305
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4065 start = b->start;
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4066
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4067 if (start == NULL) {
7233
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 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4070 * each buffer is large enough to hold two window update
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4071 * frames in a row
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4072 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4073
7305
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4074 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
4075 if (start == NULL) {
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4076 return NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4077 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4078
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
7305
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4081 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
4082
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4083 b->start = start;
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4084 b->pos = start;
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4085 b->last = start;
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4086 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
4087
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4088 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
4089 b->temporary = 1;
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4090 b->flush = 1;
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
4091
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4092 return cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4093 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4094
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4095
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4096 static ngx_http_grpc_ctx_t *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4097 ngx_http_grpc_get_ctx(ngx_http_request_t *r)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4098 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4099 ngx_http_grpc_ctx_t *ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4100 ngx_http_upstream_t *u;
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 ctx = ngx_http_get_module_ctx(r, ngx_http_grpc_module);
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 if (ctx->connection == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4105 u = r->upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4106
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4107 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
4108 return NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4109 }
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4112 return ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4113 }
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 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4117 ngx_http_grpc_get_connection_data(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4118 ngx_http_grpc_ctx_t *ctx, ngx_peer_connection_t *pc)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4119 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4120 ngx_connection_t *c;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4121 ngx_pool_cleanup_t *cln;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4122
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4123 c = pc->connection;
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 if (pc->cached) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4126
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4127 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4128 * for cached connections, connection data can be found
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4129 * in the cleanup handler
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 for (cln = c->pool->cleanup; cln; cln = cln->next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4133 if (cln->handler == ngx_http_grpc_cleanup) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4134 ctx->connection = cln->data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4135 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4136 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4137 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4138
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4139 if (ctx->connection == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4140 ngx_log_error(NGX_LOG_ERR, c->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4141 "no connection data found for "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4142 "keepalive http2 connection");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4143 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4144 }
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 ctx->send_window = ctx->connection->init_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4147 ctx->recv_window = NGX_HTTP_V2_MAX_WINDOW;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4148
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4149 ctx->connection->last_stream_id += 2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4150 ctx->id = ctx->connection->last_stream_id;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4151
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4152 return NGX_OK;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4155 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
4156 if (cln == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4157 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4160 cln->handler = ngx_http_grpc_cleanup;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4161 ctx->connection = cln->data;
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 ctx->connection->init_window = NGX_HTTP_V2_DEFAULT_WINDOW;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4164 ctx->connection->send_window = NGX_HTTP_V2_DEFAULT_WINDOW;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4165 ctx->connection->recv_window = NGX_HTTP_V2_MAX_WINDOW;
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 ctx->send_window = NGX_HTTP_V2_DEFAULT_WINDOW;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4168 ctx->recv_window = NGX_HTTP_V2_MAX_WINDOW;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4169
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4170 ctx->id = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4171 ctx->connection->last_stream_id = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4172
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4173 return NGX_OK;
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
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 static void
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4178 ngx_http_grpc_cleanup(void *data)
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 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4181 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4182 "grpc cleanup");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4183 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4184 return;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4185 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4186
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4187
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4188 static void
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4189 ngx_http_grpc_abort_request(ngx_http_request_t *r)
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 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4192 "abort grpc request");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4193 return;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4194 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4195
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 static void
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4198 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
4199 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4200 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4201 "finalize grpc request");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4202 return;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4205
7234
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4206 static ngx_int_t
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4207 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
4208 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
4209 {
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4210 ngx_table_elt_t *te;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4211
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4212 te = r->headers_in.te;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4213
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4214 if (te == NULL) {
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4215 v->not_found = 1;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4216 return NGX_OK;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4217 }
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4218
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4219 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
4220 (u_char *) "trailers", 8 - 1)
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4221 == NULL)
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4222 {
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4223 v->not_found = 1;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4224 return NGX_OK;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4225 }
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4226
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4227 v->valid = 1;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4228 v->no_cacheable = 0;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4229 v->not_found = 0;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4230
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4231 v->data = (u_char *) "trailers";
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4232 v->len = sizeof("trailers") - 1;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4233
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4234 return NGX_OK;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4235 }
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4236
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4237
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4238 static ngx_int_t
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4239 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
4240 {
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4241 ngx_http_variable_t *var, *v;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4242
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4243 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
4244 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
4245 if (var == NULL) {
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4246 return NGX_ERROR;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4247 }
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4248
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4249 var->get_handler = v->get_handler;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4250 var->data = v->data;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4251 }
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4252
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4253 return NGX_OK;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4254 }
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4255
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4256
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4257 static void *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4258 ngx_http_grpc_create_loc_conf(ngx_conf_t *cf)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4259 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4260 ngx_http_grpc_loc_conf_t *conf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4261
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4262 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
4263 if (conf == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4264 return NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4265 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4266
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4267 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4268 * set by ngx_pcalloc():
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4269 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4270 * conf->upstream.ignore_headers = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4271 * conf->upstream.next_upstream = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4272 * conf->upstream.hide_headers_hash = { NULL, 0 };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4273 * conf->upstream.ssl_name = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4274 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4275 * conf->headers_source = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4276 * conf->headers.lengths = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4277 * conf->headers.values = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4278 * conf->headers.hash = { NULL, 0 };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4279 * conf->host = { 0, NULL };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4280 * conf->host_set = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4281 * conf->ssl = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4282 * conf->ssl_protocols = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4283 * conf->ssl_ciphers = { 0, NULL };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4284 * conf->ssl_trusted_certificate = { 0, NULL };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4285 * conf->ssl_crl = { 0, NULL };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4286 * conf->ssl_certificate = { 0, NULL };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4287 * conf->ssl_certificate_key = { 0, NULL };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4288 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4289
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4290 conf->upstream.local = NGX_CONF_UNSET_PTR;
7371
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7350
diff changeset
4291 conf->upstream.socket_keepalive = NGX_CONF_UNSET;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4292 conf->upstream.next_upstream_tries = NGX_CONF_UNSET_UINT;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4293 conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4294 conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4295 conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4296 conf->upstream.next_upstream_timeout = NGX_CONF_UNSET_MSEC;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4297
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4298 conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4299
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4300 conf->upstream.hide_headers = NGX_CONF_UNSET_PTR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4301 conf->upstream.pass_headers = NGX_CONF_UNSET_PTR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4302
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4303 conf->upstream.intercept_errors = NGX_CONF_UNSET;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4304
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4305 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4306 conf->upstream.ssl_session_reuse = NGX_CONF_UNSET;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4307 conf->upstream.ssl_server_name = NGX_CONF_UNSET;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4308 conf->upstream.ssl_verify = NGX_CONF_UNSET;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4309 conf->ssl_verify_depth = NGX_CONF_UNSET_UINT;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4310 conf->ssl_passwords = NGX_CONF_UNSET_PTR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4311 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4312
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4313 /* the hardcoded values */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4314 conf->upstream.cyclic_temp_file = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4315 conf->upstream.buffering = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4316 conf->upstream.ignore_client_abort = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4317 conf->upstream.send_lowat = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4318 conf->upstream.bufs.num = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4319 conf->upstream.busy_buffers_size = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4320 conf->upstream.max_temp_file_size = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4321 conf->upstream.temp_file_write_size = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4322 conf->upstream.pass_request_headers = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4323 conf->upstream.pass_request_body = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4324 conf->upstream.force_ranges = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4325 conf->upstream.pass_trailers = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4326 conf->upstream.preserve_output = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4327
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4328 ngx_str_set(&conf->upstream.module, "grpc");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4329
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4330 return conf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4331 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4332
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4333
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4334 static char *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4335 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
4336 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4337 ngx_http_grpc_loc_conf_t *prev = parent;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4338 ngx_http_grpc_loc_conf_t *conf = child;
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 ngx_int_t rc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4341 ngx_hash_init_t hash;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4342 ngx_http_core_loc_conf_t *clcf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4343
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4344 ngx_conf_merge_ptr_value(conf->upstream.local,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4345 prev->upstream.local, NULL);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4346
7371
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7350
diff changeset
4347 ngx_conf_merge_value(conf->upstream.socket_keepalive,
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7350
diff changeset
4348 prev->upstream.socket_keepalive, 0);
8b68d50090e4 Upstream: proxy_socket_keepalive and friends.
Vladimir Homutov <vl@nginx.com>
parents: 7350
diff changeset
4349
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4350 ngx_conf_merge_uint_value(conf->upstream.next_upstream_tries,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4351 prev->upstream.next_upstream_tries, 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4352
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4353 ngx_conf_merge_msec_value(conf->upstream.connect_timeout,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4354 prev->upstream.connect_timeout, 60000);
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 ngx_conf_merge_msec_value(conf->upstream.send_timeout,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4357 prev->upstream.send_timeout, 60000);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4358
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4359 ngx_conf_merge_msec_value(conf->upstream.read_timeout,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4360 prev->upstream.read_timeout, 60000);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4361
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4362 ngx_conf_merge_msec_value(conf->upstream.next_upstream_timeout,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4363 prev->upstream.next_upstream_timeout, 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4364
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4365 ngx_conf_merge_size_value(conf->upstream.buffer_size,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4366 prev->upstream.buffer_size,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4367 (size_t) ngx_pagesize);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4368
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4369 ngx_conf_merge_bitmask_value(conf->upstream.ignore_headers,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4370 prev->upstream.ignore_headers,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4371 NGX_CONF_BITMASK_SET);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4372
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4373 ngx_conf_merge_bitmask_value(conf->upstream.next_upstream,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4374 prev->upstream.next_upstream,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4375 (NGX_CONF_BITMASK_SET
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4376 |NGX_HTTP_UPSTREAM_FT_ERROR
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4377 |NGX_HTTP_UPSTREAM_FT_TIMEOUT));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4378
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4379 if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4380 conf->upstream.next_upstream = NGX_CONF_BITMASK_SET
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4381 |NGX_HTTP_UPSTREAM_FT_OFF;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4384 ngx_conf_merge_value(conf->upstream.intercept_errors,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4385 prev->upstream.intercept_errors, 0);
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 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4388
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4389 ngx_conf_merge_value(conf->upstream.ssl_session_reuse,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4390 prev->upstream.ssl_session_reuse, 1);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4391
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4392 ngx_conf_merge_bitmask_value(conf->ssl_protocols, prev->ssl_protocols,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4393 (NGX_CONF_BITMASK_SET|NGX_SSL_TLSv1
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4394 |NGX_SSL_TLSv1_1|NGX_SSL_TLSv1_2));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4395
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4396 ngx_conf_merge_str_value(conf->ssl_ciphers, prev->ssl_ciphers,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4397 "DEFAULT");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4398
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4399 if (conf->upstream.ssl_name == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4400 conf->upstream.ssl_name = prev->upstream.ssl_name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4401 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4402
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4403 ngx_conf_merge_value(conf->upstream.ssl_server_name,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4404 prev->upstream.ssl_server_name, 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4405 ngx_conf_merge_value(conf->upstream.ssl_verify,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4406 prev->upstream.ssl_verify, 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4407 ngx_conf_merge_uint_value(conf->ssl_verify_depth,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4408 prev->ssl_verify_depth, 1);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4409 ngx_conf_merge_str_value(conf->ssl_trusted_certificate,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4410 prev->ssl_trusted_certificate, "");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4411 ngx_conf_merge_str_value(conf->ssl_crl, prev->ssl_crl, "");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4412
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4413 ngx_conf_merge_str_value(conf->ssl_certificate,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4414 prev->ssl_certificate, "");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4415 ngx_conf_merge_str_value(conf->ssl_certificate_key,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4416 prev->ssl_certificate_key, "");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4417 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
4418
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4419 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
4420 return NGX_CONF_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4423 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4424
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4425 hash.max_size = 512;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4426 hash.bucket_size = ngx_align(64, ngx_cacheline_size);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4427 hash.name = "grpc_headers_hash";
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4428
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4429 if (ngx_http_upstream_hide_headers_hash(cf, &conf->upstream,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4430 &prev->upstream, ngx_http_grpc_hide_headers, &hash)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4431 != NGX_OK)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4432 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4433 return NGX_CONF_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4434 }
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 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
4437
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4438 if (clcf->noname
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4439 && 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
4440 {
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4441 conf->upstream.upstream = prev->upstream.upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4442 conf->host = prev->host;
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4443
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4444 conf->grpc_lengths = prev->grpc_lengths;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4445 conf->grpc_values = prev->grpc_values;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4446
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4447 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4448 conf->upstream.ssl = prev->upstream.ssl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4449 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4450 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4451
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4452 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
4453 && (conf->upstream.upstream || conf->grpc_lengths))
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4454 {
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4455 clcf->handler = ngx_http_grpc_handler;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4456 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4457
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4458 if (conf->headers_source == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4459 conf->headers = prev->headers;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4460 conf->headers_source = prev->headers_source;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4461 conf->host_set = prev->host_set;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4462 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4463
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4464 rc = ngx_http_grpc_init_headers(cf, conf, &conf->headers,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4465 ngx_http_grpc_headers);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4466 if (rc != NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4467 return NGX_CONF_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4468 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4469
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4470 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4471 * special handling to preserve conf->headers in the "http" section
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4472 * to inherit it to all servers
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4473 */
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 if (prev->headers.hash.buckets == NULL
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4476 && conf->headers_source == prev->headers_source)
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 prev->headers = conf->headers;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4479 prev->host_set = conf->host_set;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4480 }
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 return NGX_CONF_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4483 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4484
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 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4487 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
4488 ngx_http_grpc_headers_t *headers, ngx_keyval_t *default_headers)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4489 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4490 u_char *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4491 size_t size;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4492 uintptr_t *code;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4493 ngx_uint_t i;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4494 ngx_array_t headers_names, headers_merged;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4495 ngx_keyval_t *src, *s, *h;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4496 ngx_hash_key_t *hk;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4497 ngx_hash_init_t hash;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4498 ngx_http_script_compile_t sc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4499 ngx_http_script_copy_code_t *copy;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4500
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4501 if (headers->hash.buckets) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4502 return NGX_OK;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4505 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
4506 != NGX_OK)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4507 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4508 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4511 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
4512 != NGX_OK)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4513 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4514 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4515 }
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 headers->lengths = ngx_array_create(cf->pool, 64, 1);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4518 if (headers->lengths == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4519 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4520 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4521
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4522 headers->values = ngx_array_create(cf->pool, 512, 1);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4523 if (headers->values == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4524 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4525 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4526
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4527 if (conf->headers_source) {
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 src = conf->headers_source->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4530 for (i = 0; i < conf->headers_source->nelts; i++) {
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 if (src[i].key.len == 4
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4533 && ngx_strncasecmp(src[i].key.data, (u_char *) "Host", 4) == 0)
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 conf->host_set = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4536 }
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 s = ngx_array_push(&headers_merged);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4539 if (s == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4540 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4541 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4542
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4543 *s = src[i];
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4544 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4545 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4546
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4547 h = default_headers;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4548
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4549 while (h->key.len) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4550
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4551 src = headers_merged.elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4552 for (i = 0; i < headers_merged.nelts; i++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4553 if (ngx_strcasecmp(h->key.data, src[i].key.data) == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4554 goto next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4555 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4556 }
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 s = ngx_array_push(&headers_merged);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4559 if (s == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4560 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4563 *s = *h;
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 next:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4566
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4567 h++;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4568 }
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 src = headers_merged.elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4572 for (i = 0; i < headers_merged.nelts; i++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4573
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4574 hk = ngx_array_push(&headers_names);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4575 if (hk == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4576 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4577 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4578
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4579 hk->key = src[i].key;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4580 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
4581 hk->value = (void *) 1;
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 if (src[i].value.len == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4584 continue;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4587 copy = ngx_array_push_n(headers->lengths,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4588 sizeof(ngx_http_script_copy_code_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4589 if (copy == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4590 return NGX_ERROR;
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
7271
9e25a5380a21 Silenced -Wcast-function-type warnings (closes #1546).
Sergey Kandaurov <pluknet@nginx.com>
parents: 7249
diff changeset
4593 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
4594 ngx_http_script_copy_len_code;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4595 copy->len = src[i].key.len;
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 size = (sizeof(ngx_http_script_copy_code_t)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4598 + src[i].key.len + sizeof(uintptr_t) - 1)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4599 & ~(sizeof(uintptr_t) - 1);
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 copy = ngx_array_push_n(headers->values, size);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4602 if (copy == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4603 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4606 copy->code = ngx_http_script_copy_code;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4607 copy->len = src[i].key.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4608
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4609 p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4610 ngx_memcpy(p, src[i].key.data, src[i].key.len);
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 ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4613
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4614 sc.cf = cf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4615 sc.source = &src[i].value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4616 sc.flushes = &headers->flushes;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4617 sc.lengths = &headers->lengths;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4618 sc.values = &headers->values;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4619
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4620 if (ngx_http_script_compile(&sc) != NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4621 return NGX_ERROR;
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 code = ngx_array_push_n(headers->lengths, sizeof(uintptr_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4625 if (code == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4626 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4629 *code = (uintptr_t) NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4630
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4631 code = ngx_array_push_n(headers->values, sizeof(uintptr_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4632 if (code == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4633 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4634 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4635
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4636 *code = (uintptr_t) NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4637 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4638
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4639 code = ngx_array_push_n(headers->lengths, sizeof(uintptr_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4640 if (code == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4641 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4642 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4643
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4644 *code = (uintptr_t) NULL;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4647 hash.hash = &headers->hash;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4648 hash.key = ngx_hash_key_lc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4649 hash.max_size = 512;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4650 hash.bucket_size = 64;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4651 hash.name = "grpc_headers_hash";
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4652 hash.pool = cf->pool;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4653 hash.temp_pool = NULL;
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 return ngx_hash_init(&hash, headers_names.elts, headers_names.nelts);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4656 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4657
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 static char *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4660 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
4661 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4662 ngx_http_grpc_loc_conf_t *glcf = conf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4663
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4664 size_t add;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4665 ngx_str_t *value, *url;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4666 ngx_url_t u;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4667 ngx_uint_t n;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4668 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
4669 ngx_http_script_compile_t sc;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4670
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4671 if (glcf->upstream.upstream || glcf->grpc_lengths) {
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4672 return "is duplicate";
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
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4675 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
4676
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4677 clcf->handler = ngx_http_grpc_handler;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4678
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4679 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
4680 clcf->auto_redirect = 1;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4681 }
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4682
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4683 value = cf->args->elts;
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4684
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4685 url = &value[1];
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4686
7619
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4687 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
4688
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4689 if (n) {
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4690
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4691 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
4692
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4693 sc.cf = cf;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4694 sc.source = url;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4695 sc.lengths = &glcf->grpc_lengths;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4696 sc.values = &glcf->grpc_values;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4697 sc.variables = n;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4698 sc.complete_lengths = 1;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4699 sc.complete_values = 1;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4700
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4701 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
4702 return NGX_CONF_ERROR;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4703 }
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4704
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4705 #if (NGX_HTTP_SSL)
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4706 glcf->ssl = 1;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4707 #endif
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4708
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4709 return NGX_CONF_OK;
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4710 }
6439ef81e37d gRPC: variables support in the "grpc_pass" directive.
Vladimir Homutov <vl@nginx.com>
parents: 7473
diff changeset
4711
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4712 if (ngx_strncasecmp(url->data, (u_char *) "grpc://", 7) == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4713 add = 7;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4714
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4715 } else if (ngx_strncasecmp(url->data, (u_char *) "grpcs://", 8) == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4716
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4717 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4718 glcf->ssl = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4719
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4720 add = 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4721 #else
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4722 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4723 "grpcs protocol requires SSL support");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4724 return NGX_CONF_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4725 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4726
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4727 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4728 add = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4729 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4730
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4731 ngx_memzero(&u, sizeof(ngx_url_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4732
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4733 u.url.len = url->len - add;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4734 u.url.data = url->data + add;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4735 u.no_resolve = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4736
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4737 glcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4738 if (glcf->upstream.upstream == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4739 return NGX_CONF_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4740 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4741
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4742 if (u.family != AF_UNIX) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4743
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4744 if (u.no_port) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4745 glcf->host = u.host;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4746
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4747 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4748 glcf->host.len = u.host.len + 1 + u.port_text.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4749 glcf->host.data = u.host.data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4750 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4751
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4752 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4753 ngx_str_set(&glcf->host, "localhost");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4754 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4755
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4756 return NGX_CONF_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4757 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4758
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4759
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4760 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4761
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4762 static char *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4763 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
4764 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4765 ngx_http_grpc_loc_conf_t *glcf = conf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4766
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4767 ngx_str_t *value;
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 if (glcf->ssl_passwords != NGX_CONF_UNSET_PTR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4770 return "is duplicate";
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4771 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4772
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4773 value = cf->args->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4774
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4775 glcf->ssl_passwords = ngx_ssl_read_password_file(cf, &value[1]);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4776
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4777 if (glcf->ssl_passwords == NULL) {
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 }
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 return NGX_CONF_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4782 }
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 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4786 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
4787 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4788 ngx_pool_cleanup_t *cln;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4789
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4790 glcf->upstream.ssl = ngx_pcalloc(cf->pool, sizeof(ngx_ssl_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4791 if (glcf->upstream.ssl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4792 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4793 }
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 glcf->upstream.ssl->log = cf->log;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4796
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4797 if (ngx_ssl_create(glcf->upstream.ssl, glcf->ssl_protocols, NULL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4798 != NGX_OK)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4799 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4800 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4801 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4802
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4803 cln = ngx_pool_cleanup_add(cf->pool, 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4804 if (cln == NULL) {
7473
8981dbb12254 SSL: fixed potential leak on memory allocation errors.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7379
diff changeset
4805 ngx_ssl_cleanup_ctx(glcf->upstream.ssl);
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4806 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4807 }
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 cln->handler = ngx_ssl_cleanup_ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4810 cln->data = glcf->upstream.ssl;
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 if (glcf->ssl_certificate.len) {
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 (glcf->ssl_certificate_key.len == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4815 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4816 "no \"grpc_ssl_certificate_key\" is defined "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4817 "for certificate \"%V\"", &glcf->ssl_certificate);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4818 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4819 }
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 if (ngx_ssl_certificate(cf, glcf->upstream.ssl, &glcf->ssl_certificate,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4822 &glcf->ssl_certificate_key, glcf->ssl_passwords)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4823 != NGX_OK)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4824 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4825 return NGX_ERROR;
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 }
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 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
4830 != NGX_OK)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4831 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4832 return NGX_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 if (glcf->upstream.ssl_verify) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4836 if (glcf->ssl_trusted_certificate.len == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4837 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4838 "no grpc_ssl_trusted_certificate for grpc_ssl_verify");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4839 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4840 }
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 if (ngx_ssl_trusted_certificate(cf, glcf->upstream.ssl,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4843 &glcf->ssl_trusted_certificate,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4844 glcf->ssl_verify_depth)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4845 != NGX_OK)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4846 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4847 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4850 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
4851 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4852 }
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
7320
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7305
diff changeset
4855 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
4856 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
4857 != NGX_OK)
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7305
diff changeset
4858 {
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7305
diff changeset
4859 return NGX_ERROR;
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7305
diff changeset
4860 }
696df3ac27ac SSL: save sessions for upstream peers using a callback function.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7305
diff changeset
4861
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4862 #ifdef TLSEXT_TYPE_application_layer_protocol_negotiation
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4863
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4864 if (SSL_CTX_set_alpn_protos(glcf->upstream.ssl->ctx,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4865 (u_char *) "\x02h2", 3)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4866 != 0)
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 ngx_ssl_error(NGX_LOG_EMERG, cf->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4869 "SSL_CTX_set_alpn_protos() failed");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4870 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4871 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4872
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4873 #endif
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 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4876 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4877
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4878 #endif