annotate src/http/modules/ngx_http_grpc_module.c @ 7726:f388c0ad3477 quic

Added processing of client transport parameters. note: + parameters are available in SSL connection since they are obtained by ssl stack quote: During connection establishment, both endpoints make authenticated declarations of their transport parameters. These declarations are made unilaterally by each endpoint. and really, we send our parameters before we read client's. no handling of incoming parameters is made by this patch.
author Vladimir Homutov <vl@nginx.com>
date Sat, 21 Mar 2020 20:51:59 +0300
parents 6439ef81e37d
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