annotate src/http/modules/ngx_http_grpc_module.c @ 7233:2713b2dbf5bb

The gRPC proxy module. The module allows passing requests to upstream gRPC servers. The module is built by default as long as HTTP/2 support is compiled in. Example configuration: grpc_pass 127.0.0.1:9000; Alternatively, the "grpc://" scheme can be used: grpc_pass grpc://127.0.0.1:9000; Keepalive support is available via the upstream keepalive module. Note that keepalive connections won't currently work with grpc-go as it fails to handle SETTINGS_HEADER_TABLE_SIZE. To use with SSL: grpc_pass grpcs://127.0.0.1:9000; SSL connections use ALPN "h2" when available. At least grpc-go works fine without ALPN, so if ALPN is not available we just establish a connection without it. Tested with grpc-c++ and grpc-go.
author Maxim Dounin <mdounin@mdounin.ru>
date Sat, 17 Mar 2018 23:04:24 +0300
parents
children c693daca57f7
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
30 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
31 ngx_uint_t ssl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
32 ngx_uint_t ssl_protocols;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
33 ngx_str_t ssl_ciphers;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
34 ngx_uint_t ssl_verify_depth;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
35 ngx_str_t ssl_trusted_certificate;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
36 ngx_str_t ssl_crl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
37 ngx_str_t ssl_certificate;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
38 ngx_str_t ssl_certificate_key;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
39 ngx_array_t *ssl_passwords;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
40 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
41 } ngx_http_grpc_loc_conf_t;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
42
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
43
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
44 typedef enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
45 ngx_http_grpc_st_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
46 ngx_http_grpc_st_length_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
47 ngx_http_grpc_st_length_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
48 ngx_http_grpc_st_type,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
49 ngx_http_grpc_st_flags,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
50 ngx_http_grpc_st_stream_id,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
51 ngx_http_grpc_st_stream_id_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
52 ngx_http_grpc_st_stream_id_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
53 ngx_http_grpc_st_stream_id_4,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
54 ngx_http_grpc_st_payload,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
55 ngx_http_grpc_st_padding
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
56 } ngx_http_grpc_state_e;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
57
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
58
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
59 typedef struct {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
60 size_t init_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
61 size_t send_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
62 size_t recv_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
63 ngx_uint_t last_stream_id;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
64 } ngx_http_grpc_conn_t;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
65
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
66
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
67 typedef struct {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
68 ngx_http_grpc_state_e state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
69 ngx_uint_t frame_state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
70 ngx_uint_t fragment_state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
71
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
72 ngx_chain_t *in;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
73 ngx_chain_t *out;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
74 ngx_chain_t *free;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
75 ngx_chain_t *busy;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
76
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
77 ngx_http_grpc_conn_t *connection;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
78
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
79 ngx_uint_t id;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
80
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
81 ssize_t send_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
82 size_t recv_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
83
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
84 size_t rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
85 ngx_uint_t stream_id;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
86 u_char type;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
87 u_char flags;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
88 u_char padding;
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 ngx_uint_t error;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
91 ngx_uint_t window_update;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
92
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
93 ngx_uint_t setting_id;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
94 ngx_uint_t setting_value;
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 u_char ping_data[8];
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
97
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
98 ngx_uint_t index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
99 ngx_str_t name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
100 ngx_str_t 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 *field_end;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
103 size_t field_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
104 size_t field_rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
105 u_char field_state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
106
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
107 unsigned literal:1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
108 unsigned field_huffman:1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
109
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
110 unsigned header_sent:1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
111 unsigned output_closed:1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
112 unsigned parsing_headers:1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
113 unsigned end_stream:1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
114 unsigned status: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 ngx_http_request_t *request;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
117 } ngx_http_grpc_ctx_t;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
118
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
119
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
120 typedef struct {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
121 u_char length_0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
122 u_char length_1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
123 u_char length_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
124 u_char type;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
125 u_char flags;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
126 u_char stream_id_0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
127 u_char stream_id_1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
128 u_char stream_id_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
129 u_char stream_id_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
130 } ngx_http_grpc_frame_t;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
131
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
132
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
133 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
134 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
135 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
136 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
137 static ngx_int_t ngx_http_grpc_filter_init(void *data);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
138 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
139
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
140 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
141 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
142 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
143 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
144 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
145 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
146 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
147 ngx_str_t *s);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
148 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
149 ngx_str_t *s);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
150 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
151 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
152 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
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_window_update(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_settings(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_parse_ping(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
159 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
160
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
161 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
162 ngx_http_grpc_ctx_t *ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
163 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
164 ngx_http_grpc_ctx_t *ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
165 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
166 ngx_http_grpc_ctx_t *ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
167
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
168 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
169 ngx_http_grpc_ctx_t *ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
170 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
171 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
172 ngx_http_grpc_ctx_t *ctx, ngx_peer_connection_t *pc);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
173 static void ngx_http_grpc_cleanup(void *data);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
174
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
175 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
176 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
177 ngx_int_t rc);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
178
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
179 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
180 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
181 void *parent, void *child);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
182 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
183 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
184 ngx_keyval_t *default_headers);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
185
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
186 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
187 void *conf);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
188
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
189 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
190 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
191 ngx_command_t *cmd, void *conf);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
192 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
193 ngx_http_grpc_loc_conf_t *glcf);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
194 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
195
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
196
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
197 static ngx_conf_bitmask_t ngx_http_grpc_next_upstream_masks[] = {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
198 { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
199 { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
200 { ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
201 { ngx_string("non_idempotent"), NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
202 { ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
203 { ngx_string("http_502"), NGX_HTTP_UPSTREAM_FT_HTTP_502 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
204 { ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
205 { ngx_string("http_504"), NGX_HTTP_UPSTREAM_FT_HTTP_504 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
206 { ngx_string("http_403"), NGX_HTTP_UPSTREAM_FT_HTTP_403 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
207 { ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
208 { ngx_string("http_429"), NGX_HTTP_UPSTREAM_FT_HTTP_429 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
209 { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
210 { ngx_null_string, 0 }
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
214 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
215
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
216 static ngx_conf_bitmask_t ngx_http_grpc_ssl_protocols[] = {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
217 { ngx_string("SSLv2"), NGX_SSL_SSLv2 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
218 { ngx_string("SSLv3"), NGX_SSL_SSLv3 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
219 { ngx_string("TLSv1"), NGX_SSL_TLSv1 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
220 { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
221 { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
222 { ngx_string("TLSv1.3"), NGX_SSL_TLSv1_3 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
223 { ngx_null_string, 0 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
224 };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
225
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
226 #endif
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 static ngx_command_t ngx_http_grpc_commands[] = {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
230
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
231 { ngx_string("grpc_pass"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
232 NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
233 ngx_http_grpc_pass,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
234 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
235 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
236 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
237
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
238 { ngx_string("grpc_bind"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
239 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
240 ngx_http_upstream_bind_set_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
241 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
242 offsetof(ngx_http_grpc_loc_conf_t, upstream.local),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
243 NULL },
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 { ngx_string("grpc_connect_timeout"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
246 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
247 ngx_conf_set_msec_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
248 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
249 offsetof(ngx_http_grpc_loc_conf_t, upstream.connect_timeout),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
250 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
251
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
252 { ngx_string("grpc_send_timeout"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
253 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
254 ngx_conf_set_msec_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
255 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
256 offsetof(ngx_http_grpc_loc_conf_t, upstream.send_timeout),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
257 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
258
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
259 { ngx_string("grpc_intercept_errors"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
260 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
261 ngx_conf_set_flag_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
262 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
263 offsetof(ngx_http_grpc_loc_conf_t, upstream.intercept_errors),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
264 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
265
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
266 { ngx_string("grpc_buffer_size"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
267 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
268 ngx_conf_set_size_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
269 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
270 offsetof(ngx_http_grpc_loc_conf_t, upstream.buffer_size),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
271 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
272
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
273 { ngx_string("grpc_read_timeout"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
274 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
275 ngx_conf_set_msec_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
276 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
277 offsetof(ngx_http_grpc_loc_conf_t, upstream.read_timeout),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
278 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
279
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
280 { ngx_string("grpc_next_upstream"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
281 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
282 ngx_conf_set_bitmask_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
283 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
284 offsetof(ngx_http_grpc_loc_conf_t, upstream.next_upstream),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
285 &ngx_http_grpc_next_upstream_masks },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
286
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
287 { ngx_string("grpc_next_upstream_tries"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
288 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
289 ngx_conf_set_num_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
290 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
291 offsetof(ngx_http_grpc_loc_conf_t, upstream.next_upstream_tries),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
292 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
293
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
294 { ngx_string("grpc_next_upstream_timeout"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
295 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
296 ngx_conf_set_msec_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
297 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
298 offsetof(ngx_http_grpc_loc_conf_t, upstream.next_upstream_timeout),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
299 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
300
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
301 { ngx_string("grpc_set_header"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
302 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
303 ngx_conf_set_keyval_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
304 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
305 offsetof(ngx_http_grpc_loc_conf_t, headers_source),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
306 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
307
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
308 { ngx_string("grpc_pass_header"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
309 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
310 ngx_conf_set_str_array_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
311 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
312 offsetof(ngx_http_grpc_loc_conf_t, upstream.pass_headers),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
313 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
314
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
315 { ngx_string("grpc_hide_header"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
316 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
317 ngx_conf_set_str_array_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
318 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
319 offsetof(ngx_http_grpc_loc_conf_t, upstream.hide_headers),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
320 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
321
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
322 { ngx_string("grpc_ignore_headers"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
323 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
324 ngx_conf_set_bitmask_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
325 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
326 offsetof(ngx_http_grpc_loc_conf_t, upstream.ignore_headers),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
327 &ngx_http_upstream_ignore_headers_masks },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
328
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
329 #if (NGX_HTTP_SSL)
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_ssl_session_reuse"),
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_FLAG,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
333 ngx_conf_set_flag_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.ssl_session_reuse),
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_ssl_protocols"),
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_1MORE,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
340 ngx_conf_set_bitmask_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, ssl_protocols),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
343 &ngx_http_grpc_ssl_protocols },
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_ssl_ciphers"),
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_TAKE1,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
347 ngx_conf_set_str_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, ssl_ciphers),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
350 NULL },
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 { ngx_string("grpc_ssl_name"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
353 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
354 ngx_http_set_complex_value_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
355 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
356 offsetof(ngx_http_grpc_loc_conf_t, upstream.ssl_name),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
357 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
358
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
359 { ngx_string("grpc_ssl_server_name"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
360 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
361 ngx_conf_set_flag_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
362 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
363 offsetof(ngx_http_grpc_loc_conf_t, upstream.ssl_server_name),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
364 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
365
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
366 { ngx_string("grpc_ssl_verify"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
367 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
368 ngx_conf_set_flag_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
369 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
370 offsetof(ngx_http_grpc_loc_conf_t, upstream.ssl_verify),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
371 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
372
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
373 { ngx_string("grpc_ssl_verify_depth"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
374 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
375 ngx_conf_set_num_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
376 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
377 offsetof(ngx_http_grpc_loc_conf_t, ssl_verify_depth),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
378 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
379
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
380 { ngx_string("grpc_ssl_trusted_certificate"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
381 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
382 ngx_conf_set_str_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
383 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
384 offsetof(ngx_http_grpc_loc_conf_t, ssl_trusted_certificate),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
385 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
386
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
387 { ngx_string("grpc_ssl_crl"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
388 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
389 ngx_conf_set_str_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
390 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
391 offsetof(ngx_http_grpc_loc_conf_t, ssl_crl),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
392 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
393
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
394 { ngx_string("grpc_ssl_certificate"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
395 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
396 ngx_conf_set_str_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
397 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
398 offsetof(ngx_http_grpc_loc_conf_t, ssl_certificate),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
399 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
400
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
401 { ngx_string("grpc_ssl_certificate_key"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
402 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
403 ngx_conf_set_str_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
404 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
405 offsetof(ngx_http_grpc_loc_conf_t, ssl_certificate_key),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
406 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
407
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
408 { ngx_string("grpc_ssl_password_file"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
409 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
410 ngx_http_grpc_ssl_password_file,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
411 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
412 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
413 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
414
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
415 #endif
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_null_command
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
418 };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
419
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
420
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
421 static ngx_http_module_t ngx_http_grpc_module_ctx = {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
422 NULL, /* preconfiguration */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
423 NULL, /* postconfiguration */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
424
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
425 NULL, /* create main configuration */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
426 NULL, /* init main configuration */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
427
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
428 NULL, /* create server configuration */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
429 NULL, /* merge server configuration */
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_http_grpc_create_loc_conf, /* create location configuration */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
432 ngx_http_grpc_merge_loc_conf /* merge location configuration */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
433 };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
434
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
435
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
436 ngx_module_t ngx_http_grpc_module = {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
437 NGX_MODULE_V1,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
438 &ngx_http_grpc_module_ctx, /* module context */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
439 ngx_http_grpc_commands, /* module directives */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
440 NGX_HTTP_MODULE, /* module type */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
441 NULL, /* init master */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
442 NULL, /* init module */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
443 NULL, /* init process */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
444 NULL, /* init thread */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
445 NULL, /* exit thread */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
446 NULL, /* exit process */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
447 NULL, /* exit master */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
448 NGX_MODULE_V1_PADDING
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
449 };
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
452 static u_char ngx_http_grpc_connection_start[] =
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
453 "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
454
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
455 "\x00\x00\x12\x04\x00\x00\x00\x00\x00" /* settings frame */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
456 "\x00\x01\x00\x00\x00\x00" /* header table size */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
457 "\x00\x02\x00\x00\x00\x00" /* disable push */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
458 "\x00\x04\x7f\xff\xff\xff" /* initial window */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
459
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
460 "\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
461 "\x7f\xff\x00\x00";
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
462
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
463
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
464 static ngx_keyval_t ngx_http_grpc_headers[] = {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
465 { ngx_string("Content-Length"), ngx_string("$content_length") },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
466 { ngx_string("Host"), ngx_string("") },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
467 { ngx_string("Connection"), ngx_string("") },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
468 { ngx_string("Transfer-Encoding"), ngx_string("") },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
469 { ngx_string("TE"), ngx_string("") },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
470 { ngx_string("Keep-Alive"), ngx_string("") },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
471 { ngx_string("Expect"), ngx_string("") },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
472 { ngx_string("Upgrade"), ngx_string("") },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
473 { ngx_null_string, ngx_null_string }
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
476
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
477 static ngx_str_t ngx_http_grpc_hide_headers[] = {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
478 ngx_string("Date"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
479 ngx_string("Server"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
480 ngx_string("X-Accel-Expires"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
481 ngx_string("X-Accel-Redirect"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
482 ngx_string("X-Accel-Limit-Rate"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
483 ngx_string("X-Accel-Buffering"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
484 ngx_string("X-Accel-Charset"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
485 ngx_null_string
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
488
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
489 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
490 ngx_http_grpc_handler(ngx_http_request_t *r)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
491 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
492 ngx_int_t rc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
493 ngx_http_upstream_t *u;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
494 ngx_http_grpc_ctx_t *ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
495 ngx_http_grpc_loc_conf_t *glcf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
496
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
497 if (ngx_http_upstream_create(r) != NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
498 return NGX_HTTP_INTERNAL_SERVER_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
501 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
502
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
503 u = r->upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
504
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
505 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
506 u->ssl = (glcf->upstream.ssl != NULL);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
507
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
508 if (u->ssl) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
509 ngx_str_set(&u->schema, "grpcs://");
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 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
512 ngx_str_set(&u->schema, "grpc://");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
513 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
514 #else
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
515 ngx_str_set(&u->schema, "grpc://");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
516 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
517
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
518 u->output.tag = (ngx_buf_tag_t) &ngx_http_grpc_module;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
519
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
520 u->conf = &glcf->upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
521
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
522 u->create_request = ngx_http_grpc_create_request;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
523 u->reinit_request = ngx_http_grpc_reinit_request;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
524 u->process_header = ngx_http_grpc_process_header;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
525 u->abort_request = ngx_http_grpc_abort_request;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
526 u->finalize_request = ngx_http_grpc_finalize_request;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
527
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
528 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_grpc_ctx_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
529 if (ctx == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
530 return NGX_HTTP_INTERNAL_SERVER_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
531 }
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 ctx->request = r;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
534
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
535 ngx_http_set_ctx(r, ctx, ngx_http_grpc_module);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
536
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
537 u->input_filter_init = ngx_http_grpc_filter_init;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
538 u->input_filter = ngx_http_grpc_filter;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
539 u->input_filter_ctx = ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
540
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
541 r->request_body_no_buffering = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
542
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
543 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
544
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
545 if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
546 return rc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
547 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
548
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
549 return NGX_DONE;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
550 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
551
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
552
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
553 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
554 ngx_http_grpc_create_request(ngx_http_request_t *r)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
555 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
556 u_char *p, *tmp, *key_tmp, *val_tmp, *headers_frame;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
557 size_t len, tmp_len, key_len, val_len, uri_len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
558 uintptr_t escape;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
559 ngx_buf_t *b;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
560 ngx_uint_t i, next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
561 ngx_chain_t *cl, *body;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
562 ngx_list_part_t *part;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
563 ngx_table_elt_t *header;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
564 ngx_http_upstream_t *u;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
565 ngx_http_grpc_frame_t *f;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
566 ngx_http_script_code_pt code;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
567 ngx_http_grpc_loc_conf_t *glcf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
568 ngx_http_script_engine_t e, le;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
569 ngx_http_script_len_code_pt lcode;
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 = r->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 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
574
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
575 len = sizeof(ngx_http_grpc_connection_start) - 1
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
576 + sizeof(ngx_http_grpc_frame_t); /* headers frame */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
577
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
578 /* :method header */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
579
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
580 if (r->method == NGX_HTTP_GET || r->method == NGX_HTTP_POST) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
581 len += 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
582 tmp_len = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
583
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
584 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
585 len += 1 + NGX_HTTP_V2_INT_OCTETS + r->method_name.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
586 tmp_len = r->method_name.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
587 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
588
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
589 /* :scheme header */
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 len += 1;
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 /* :path header */
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 if (r->valid_unparsed_uri) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
596 escape = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
597 uri_len = r->unparsed_uri.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
598
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
599 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
600 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
601 NGX_ESCAPE_URI);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
602 uri_len = r->uri.len + escape + sizeof("?") - 1 + r->args.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
603 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
604
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
605 len += 1 + NGX_HTTP_V2_INT_OCTETS + uri_len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
606
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
607 if (tmp_len < uri_len) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
608 tmp_len = uri_len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
609 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
610
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
611 /* :authority header */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
612
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
613 if (!glcf->host_set) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
614 len += 1 + NGX_HTTP_V2_INT_OCTETS + glcf->host.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
615
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
616 if (tmp_len < glcf->host.len) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
617 tmp_len = glcf->host.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
618 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
619 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
620
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
621 /* other headers */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
622
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
623 ngx_http_script_flush_no_cacheable_variables(r, glcf->headers.flushes);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
624 ngx_memzero(&le, sizeof(ngx_http_script_engine_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
625
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
626 le.ip = glcf->headers.lengths->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
627 le.request = r;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
628 le.flushed = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
629
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
630 while (*(uintptr_t *) le.ip) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
631
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
632 lcode = *(ngx_http_script_len_code_pt *) le.ip;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
633 key_len = lcode(&le);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
634
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
635 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
636 lcode = *(ngx_http_script_len_code_pt *) le.ip;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
637 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
638 le.ip += sizeof(uintptr_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
639
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
640 if (val_len == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
641 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
642 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
643
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
644 len += 1 + NGX_HTTP_V2_INT_OCTETS + key_len
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
645 + NGX_HTTP_V2_INT_OCTETS + val_len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
646
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
647 if (tmp_len < key_len) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
648 tmp_len = key_len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
649 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
650
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
651 if (tmp_len < val_len) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
652 tmp_len = val_len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
653 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
654 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
655
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
656 if (glcf->upstream.pass_request_headers) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
657 part = &r->headers_in.headers.part;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
658 header = part->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
659
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
660 for (i = 0; /* void */; i++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
661
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
662 if (i >= part->nelts) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
663 if (part->next == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
664 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
665 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
666
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
667 part = part->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
668 header = part->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
669 i = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
670 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
671
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
672 if (ngx_hash_find(&glcf->headers.hash, header[i].hash,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
673 header[i].lowcase_key, header[i].key.len))
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
674 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
675 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
676 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
677
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
678 len += 1 + NGX_HTTP_V2_INT_OCTETS + header[i].key.len
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
679 + NGX_HTTP_V2_INT_OCTETS + header[i].value.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
680
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
681 if (tmp_len < header[i].key.len) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
682 tmp_len = header[i].key.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
683 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
684
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
685 if (tmp_len < header[i].value.len) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
686 tmp_len = header[i].value.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
687 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
688 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
689 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
690
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
691 /* continuation frames */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
692
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
693 len += sizeof(ngx_http_grpc_frame_t)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
694 * (len / NGX_HTTP_V2_DEFAULT_FRAME_SIZE);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
695
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
696
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
697 b = ngx_create_temp_buf(r->pool, len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
698 if (b == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
699 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
700 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
701
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
702 cl = ngx_alloc_chain_link(r->pool);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
703 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
704 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
705 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
706
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
707 cl->buf = b;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
708 cl->next = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
709
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
710 tmp = ngx_palloc(r->pool, tmp_len * 3);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
711 if (tmp == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
712 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
713 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
714
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
715 key_tmp = tmp + tmp_len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
716 val_tmp = tmp + 2 * tmp_len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
717
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
718 /* connection preface */
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 b->last = ngx_copy(b->last, ngx_http_grpc_connection_start,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
721 sizeof(ngx_http_grpc_connection_start) - 1);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
722
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
723 /* headers frame */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
724
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
725 headers_frame = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
726
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
727 f = (ngx_http_grpc_frame_t *) b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
728 b->last += sizeof(ngx_http_grpc_frame_t);
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 f->length_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
731 f->length_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
732 f->length_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
733 f->type = NGX_HTTP_V2_HEADERS_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
734 f->flags = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
735 f->stream_id_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
736 f->stream_id_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
737 f->stream_id_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
738 f->stream_id_3 = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
739
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
740 if (r->method == NGX_HTTP_GET) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
741 *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
742
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
743 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
744 "grpc header: \":method: GET\"");
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 } else if (r->method == NGX_HTTP_POST) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
747 *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
748
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
749 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
750 "grpc header: \":method: POST\"");
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 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
753 *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
754 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
755 r->method_name.len, tmp);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
756
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
757 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
758 "grpc header: \":method: %V\"", &r->method_name);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
759 }
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 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
762 if (glcf->ssl) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
763 *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
764
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
765 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
766 "grpc header: \":scheme: https\"");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
767 } else
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
768 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
769 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
770 *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
771
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
772 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
773 "grpc header: \":scheme: http\"");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
774 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
775
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
776 if (r->valid_unparsed_uri) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
777
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
778 if (r->unparsed_uri.len == 1 && r->unparsed_uri.data[0] == '/') {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
779 *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
780
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
781 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
782 *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
783 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
784 r->unparsed_uri.len, tmp);
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
787 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
788 "grpc header: \":path: %V\"", &r->unparsed_uri);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
789
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
790 } else if (escape || r->args.len > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
791 p = val_tmp;
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 (escape) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
794 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
795 NGX_ESCAPE_URI);
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 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
798 p = ngx_copy(p, r->uri.data, r->uri.len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
799 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
800
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
801 if (r->args.len > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
802 *p++ = '?';
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
803 p = ngx_copy(p, r->args.data, r->args.len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
804 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
805
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
806 *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
807 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
808
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
809 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
810 "grpc header: \":path: %*s\"", p - val_tmp, val_tmp);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
811
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
812 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
813 *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
814 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
815 r->uri.len, tmp);
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 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
818 "grpc header: \":path: %V\"", &r->uri);
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
821 if (!glcf->host_set) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
822 *b->last++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_AUTHORITY_INDEX);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
823 b->last = ngx_http_v2_write_value(b->last, glcf->host.data,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
824 glcf->host.len, tmp);
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 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
827 "grpc header: \":authority: %V\"", &glcf->host);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
828 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
829
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
830 ngx_memzero(&e, sizeof(ngx_http_script_engine_t));
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 e.ip = glcf->headers.values->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
833 e.request = r;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
834 e.flushed = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
835
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
836 le.ip = glcf->headers.lengths->elts;
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 while (*(uintptr_t *) le.ip) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
839
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
840 lcode = *(ngx_http_script_len_code_pt *) le.ip;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
841 key_len = lcode(&le);
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 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
844 lcode = *(ngx_http_script_len_code_pt *) le.ip;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
845 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
846 le.ip += sizeof(uintptr_t);
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 if (val_len == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
849 e.skip = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
850
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
851 while (*(uintptr_t *) e.ip) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
852 code = *(ngx_http_script_code_pt *) e.ip;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
853 code((ngx_http_script_engine_t *) &e);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
854 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
855 e.ip += sizeof(uintptr_t);
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 e.skip = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
858
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
859 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
860 }
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++ = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
863
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
864 e.pos = key_tmp;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
865
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
866 code = *(ngx_http_script_code_pt *) e.ip;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
867 code((ngx_http_script_engine_t *) &e);
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 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
870
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
871 e.pos = val_tmp;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
872
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
873 while (*(uintptr_t *) e.ip) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
874 code = *(ngx_http_script_code_pt *) e.ip;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
875 code((ngx_http_script_engine_t *) &e);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
876 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
877 e.ip += sizeof(uintptr_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
878
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
879 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
880
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
881 #if (NGX_DEBUG)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
882 if (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
883 ngx_strlow(key_tmp, key_tmp, key_len);
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_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
886 "grpc header: \"%*s: %*s\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
887 key_len, key_tmp, val_len, val_tmp);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
888 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
889 #endif
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
892 if (glcf->upstream.pass_request_headers) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
893 part = &r->headers_in.headers.part;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
894 header = part->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
895
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
896 for (i = 0; /* void */; i++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
897
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
898 if (i >= part->nelts) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
899 if (part->next == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
900 break;
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 part = part->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
904 header = part->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
905 i = 0;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
908 if (ngx_hash_find(&glcf->headers.hash, header[i].hash,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
909 header[i].lowcase_key, header[i].key.len))
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
910 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
911 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
912 }
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 *b->last++ = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
915
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
916 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
917 header[i].key.len, tmp);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
918
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
919 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
920 header[i].value.len, tmp);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
921
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
922 #if (NGX_DEBUG)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
923 if (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
924 ngx_strlow(tmp, header[i].key.data, header[i].key.len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
925
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
926 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
927 "grpc header: \"%*s: %V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
928 header[i].key.len, tmp, &header[i].value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
929 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
930 #endif
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 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
933
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
934 /* update headers frame length */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
935
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
936 len = b->last - headers_frame - sizeof(ngx_http_grpc_frame_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
937
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
938 if (len > NGX_HTTP_V2_DEFAULT_FRAME_SIZE) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
939 len = NGX_HTTP_V2_DEFAULT_FRAME_SIZE;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
940 next = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
941
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
942 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
943 next = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
944 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
945
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
946 f = (ngx_http_grpc_frame_t *) headers_frame;
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 f->length_0 = (u_char) ((len >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
949 f->length_1 = (u_char) ((len >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
950 f->length_2 = (u_char) (len & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
951
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
952 /* create additional continuation frames */
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 p = headers_frame;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
955
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
956 while (next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
957 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
958 len = b->last - p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
959
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
960 ngx_memmove(p + sizeof(ngx_http_grpc_frame_t), p, len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
961 b->last += sizeof(ngx_http_grpc_frame_t);
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 (len > NGX_HTTP_V2_DEFAULT_FRAME_SIZE) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
964 len = NGX_HTTP_V2_DEFAULT_FRAME_SIZE;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
965 next = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
966
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
967 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
968 next = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
969 }
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 f = (ngx_http_grpc_frame_t *) p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
972
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
973 f->length_0 = (u_char) ((len >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
974 f->length_1 = (u_char) ((len >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
975 f->length_2 = (u_char) (len & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
976 f->type = NGX_HTTP_V2_CONTINUATION_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
977 f->flags = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
978 f->stream_id_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
979 f->stream_id_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
980 f->stream_id_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
981 f->stream_id_3 = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
982 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
983
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
984 f->flags |= NGX_HTTP_V2_END_HEADERS_FLAG;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
985
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
986 #if (NGX_DEBUG)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
987 if (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
988 u_char buf[512];
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
989 size_t n, m;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
990
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
991 n = ngx_min(b->last - b->pos, 256);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
992 m = ngx_hex_dump(buf, b->pos, n) - buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
993
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
994 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
995 "grpc header: %*s%s, len: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
996 m, buf, b->last - b->pos > 256 ? "..." : "",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
997 b->last - b->pos);
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 #endif
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 if (r->request_body_no_buffering) {
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 u->request_bufs = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1004
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1005 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1006
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1007 body = u->request_bufs;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1008 u->request_bufs = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1009
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1010 if (body == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1011 f = (ngx_http_grpc_frame_t *) headers_frame;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1012 f->flags |= NGX_HTTP_V2_END_STREAM_FLAG;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1013 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1014
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1015 while (body) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1016 b = ngx_alloc_buf(r->pool);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1017 if (b == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1018 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1019 }
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 ngx_memcpy(b, body->buf, sizeof(ngx_buf_t));
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 cl->next = ngx_alloc_chain_link(r->pool);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1024 if (cl->next == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1025 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1028 cl = cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1029 cl->buf = b;
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 body = body->next;
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 b->last_buf = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1035 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1036
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1037 u->output.output_filter = ngx_http_grpc_body_output_filter;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1038 u->output.filter_ctx = r;
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 b->flush = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1041 cl->next = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1042
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1043 return NGX_OK;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1046
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1047 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1048 ngx_http_grpc_reinit_request(ngx_http_request_t *r)
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 ngx_http_grpc_ctx_t *ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1051
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1052 ctx = ngx_http_get_module_ctx(r, ngx_http_grpc_module);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1053
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1054 if (ctx == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1055 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1056 }
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 ctx->state = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1059 ctx->header_sent = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1060 ctx->output_closed = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1061 ctx->parsing_headers = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1062 ctx->end_stream = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1063 ctx->status = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1064 ctx->connection = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1065
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1066 return NGX_OK;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1069
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1070 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1071 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
1072 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1073 ngx_http_request_t *r = data;
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 off_t file_pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1076 u_char *p, *pos, *start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1077 size_t len, limit;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1078 ngx_buf_t *b;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1079 ngx_int_t rc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1080 ngx_uint_t next, last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1081 ngx_chain_t *cl, *out, **ll;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1082 ngx_http_grpc_ctx_t *ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1083 ngx_http_grpc_frame_t *f;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1084
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1085 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1086 "grpc output filter");
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 ctx = ngx_http_grpc_get_ctx(r);
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 if (ctx == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1091 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1092 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1093
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1094 if (in) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1095 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
1096 return NGX_ERROR;
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 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1099
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1100 out = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1101 ll = &out;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1102
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1103 if (!ctx->header_sent) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1104 /* first buffer contains headers */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1105
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1106 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1107 "grpc output header");
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 ctx->header_sent = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1110
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1111 if (ctx->id != 1) {
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 * keepalive connection: skip connection preface,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1114 * update stream identifiers
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1115 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1116
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1117 b = ctx->in->buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1118 b->pos += sizeof(ngx_http_grpc_connection_start) - 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1119
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1120 p = b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1121
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1122 while (p < b->last) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1123 f = (ngx_http_grpc_frame_t *) p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1124 p += sizeof(ngx_http_grpc_frame_t);
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->stream_id_0 = (u_char) ((ctx->id >> 24) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1127 f->stream_id_1 = (u_char) ((ctx->id >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1128 f->stream_id_2 = (u_char) ((ctx->id >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1129 f->stream_id_3 = (u_char) (ctx->id & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1130
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1131 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
1132 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1133 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1134
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1135 if (ctx->in->buf->last_buf) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1136 ctx->output_closed = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1137 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1138
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1139 *ll = ctx->in;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1140 ll = &ctx->in->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1141
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1142 ctx->in = ctx->in->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1143 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1144
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1145 if (ctx->out) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1146 /* queued control frames */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1147
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1148 *ll = ctx->out;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1149
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1150 for (cl = ctx->out, ll = &cl->next; cl; cl = cl->next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1151 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1152 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1153
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1154 ctx->out = NULL;
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 f = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1158 last = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1159
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1160 limit = ngx_max(0, ctx->send_window);
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 if (limit > ctx->connection->send_window) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1163 limit = ctx->connection->send_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1164 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1165
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1166 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1167 "grpc output limit: %uz w:%z:%uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1168 limit, ctx->send_window, ctx->connection->send_window);
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 #if (NGX_SUPPRESS_WARN)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1171 file_pos = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1172 pos = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1173 cl = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1174 #endif
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 in = ctx->in;
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 while (in && limit > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1179
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1180 ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1181 "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
1182 "file: %O, size: %O",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1183 in->buf->last_buf,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1184 in->buf->in_file,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1185 in->buf->start, in->buf->pos,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1186 in->buf->last - in->buf->pos,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1187 in->buf->file_pos,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1188 in->buf->file_last - in->buf->file_pos);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1189
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1190 if (ngx_buf_special(in->buf)) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1191 goto next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1192 }
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 if (in->buf->in_file) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1195 file_pos = in->buf->file_pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1196
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1197 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1198 pos = in->buf->pos;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1201 next = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1202
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1203 do {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1204
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1205 cl = ngx_http_grpc_get_buf(r, ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1206 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1207 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1208 }
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 b = cl->buf;
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 f = (ngx_http_grpc_frame_t *) b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1213 b->last += sizeof(ngx_http_grpc_frame_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1214
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1215 *ll = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1216 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1217
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1218 cl = ngx_chain_get_free_buf(r->pool, &ctx->free);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1219 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1220 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1221 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1222
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1223 b = cl->buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1224 start = b->start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1225
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1226 ngx_memcpy(b, in->buf, sizeof(ngx_buf_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1227
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1228 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1229 * restore b->start to preserve memory allocated in the buffer,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1230 * to reuse it later for headers and control frames
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1231 */
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 b->start = start;
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 (in->buf->in_file) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1236 b->file_pos = file_pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1237 file_pos += ngx_min(NGX_HTTP_V2_DEFAULT_FRAME_SIZE, limit);
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 (file_pos >= in->buf->file_last) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1240 file_pos = in->buf->file_last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1241 next = 1;
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 b->file_last = file_pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1245 len = (ngx_uint_t) (file_pos - b->file_pos);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1246
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1247 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1248 b->pos = pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1249 pos += ngx_min(NGX_HTTP_V2_DEFAULT_FRAME_SIZE, limit);
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 if (pos >= in->buf->last) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1252 pos = in->buf->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1253 next = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1254 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1255
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1256 b->last = pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1257 len = (ngx_uint_t) (pos - b->pos);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1258 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1259
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1260 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
1261 b->shadow = in->buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1262 b->last_shadow = next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1263
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1264 b->last_buf = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1265 b->last_in_chain = 0;
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 *ll = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1268 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1269
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1270 f->length_0 = (u_char) ((len >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1271 f->length_1 = (u_char) ((len >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1272 f->length_2 = (u_char) (len & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1273 f->type = NGX_HTTP_V2_DATA_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1274 f->flags = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1275 f->stream_id_0 = (u_char) ((ctx->id >> 24) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1276 f->stream_id_1 = (u_char) ((ctx->id >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1277 f->stream_id_2 = (u_char) ((ctx->id >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1278 f->stream_id_3 = (u_char) (ctx->id & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1279
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1280 limit -= len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1281 ctx->send_window -= len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1282 ctx->connection->send_window -= len;
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 } while (!next && limit > 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1285
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1286 if (!next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1287 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1288 * 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
1289 * preserve position for future use
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1290 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1291
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1292 if (in->buf->in_file) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1293 in->buf->file_pos = file_pos;
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 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1296 in->buf->pos = pos;
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 break;
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 next:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1303
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1304 if (in->buf->last_buf) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1305 last = 1;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1308 in = in->next;
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 ctx->in = in;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1312
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1313 if (last) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1314
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1315 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1316 "grpc output last");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1317
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1318 ctx->output_closed = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1319
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1320 if (f) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1321 f->flags |= NGX_HTTP_V2_END_STREAM_FLAG;
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 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1324 cl = ngx_http_grpc_get_buf(r, ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1325 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1326 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1327 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1328
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1329 b = cl->buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1330
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1331 f = (ngx_http_grpc_frame_t *) b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1332 b->last += sizeof(ngx_http_grpc_frame_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1333
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1334 f->length_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1335 f->length_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1336 f->length_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1337 f->type = NGX_HTTP_V2_DATA_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1338 f->flags = NGX_HTTP_V2_END_STREAM_FLAG;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1339 f->stream_id_0 = (u_char) ((ctx->id >> 24) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1340 f->stream_id_1 = (u_char) ((ctx->id >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1341 f->stream_id_2 = (u_char) ((ctx->id >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1342 f->stream_id_3 = (u_char) (ctx->id & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1343
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1344 *ll = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1345 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1346 }
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 cl->buf->last_buf = 1;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1351 *ll = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1352
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1353 #if (NGX_DEBUG)
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 for (cl = out; cl; cl = cl->next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1356 ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1357 "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
1358 "file: %O, size: %O",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1359 cl->buf->last_buf,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1360 cl->buf->in_file,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1361 cl->buf->start, cl->buf->pos,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1362 cl->buf->last - cl->buf->pos,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1363 cl->buf->file_pos,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1364 cl->buf->file_last - cl->buf->file_pos);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1365 }
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 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1368 "grpc output limit: %uz w:%z:%uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1369 limit, ctx->send_window, ctx->connection->send_window);
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 #endif
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 rc = ngx_chain_writer(&r->upstream->writer, out);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1374
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1375 ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &out,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1376 (ngx_buf_tag_t) &ngx_http_grpc_body_output_filter);
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 for (cl = ctx->free; cl; cl = cl->next) {
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 /* mark original buffers as sent */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1381
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1382 if (cl->buf->shadow) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1383 if (cl->buf->last_shadow) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1384 b = cl->buf->shadow;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1385 b->pos = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1386 }
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 cl->buf->shadow = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1389 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1390 }
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 if (rc == NGX_OK && ctx->in) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1393 rc = NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1394 }
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 return rc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1397 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1398
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 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1401 ngx_http_grpc_process_header(ngx_http_request_t *r)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1402 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1403 ngx_str_t *status_line;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1404 ngx_int_t rc, status;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1405 ngx_buf_t *b;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1406 ngx_table_elt_t *h;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1407 ngx_http_upstream_t *u;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1408 ngx_http_grpc_ctx_t *ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1409 ngx_http_upstream_header_t *hh;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1410 ngx_http_upstream_main_conf_t *umcf;
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 u = r->upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1413 b = &u->buffer;
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 #if (NGX_DEBUG)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1416 if (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1417 u_char buf[512];
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1418 size_t n, m;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1419
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1420 n = ngx_min(b->last - b->pos, 256);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1421 m = ngx_hex_dump(buf, b->pos, n) - buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1422
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1423 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1424 "grpc response: %*s%s, len: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1425 m, buf, b->last - b->pos > 256 ? "..." : "",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1426 b->last - b->pos);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1427 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1428 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1429
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1430 ctx = ngx_http_grpc_get_ctx(r);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1431
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1432 if (ctx == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1433 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1434 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1435
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1436 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
1437
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1438 for ( ;; ) {
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 if (ctx->state < ngx_http_grpc_st_payload) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1441
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1442 rc = ngx_http_grpc_parse_frame(r, ctx, b);
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 if (rc == NGX_AGAIN) {
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 * there can be a lot of window update frames,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1448 * 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
1449 * started parsing headers yet
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1450 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1451
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1452 if (!ctx->parsing_headers) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1453 b->pos = b->start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1454 b->last = b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1455 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1456
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1457 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1458 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1459
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1460 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1461 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
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
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 * RFC 7540 says that implementations MUST discard frames
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1466 * that have unknown or unsupported types. However, extension
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1467 * frames that appear in the middle of a header block are
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1468 * not permitted. Also, for obvious reasons CONTINUATION frames
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1469 * cannot appear before headers, and DATA frames are not expected
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1470 * to appear before all headers are parsed.
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1471 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1472
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1473 if (ctx->type == NGX_HTTP_V2_DATA_FRAME
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1474 || (ctx->type == NGX_HTTP_V2_CONTINUATION_FRAME
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1475 && !ctx->parsing_headers)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1476 || (ctx->type != NGX_HTTP_V2_CONTINUATION_FRAME
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1477 && ctx->parsing_headers))
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 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1480 "upstream sent unexpected http2 frame: %d",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1481 ctx->type);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1482 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1483 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1484
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1485 if (ctx->stream_id && ctx->stream_id != ctx->id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1486 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1487 "upstream sent frame for unknown stream %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1488 ctx->stream_id);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1489 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1490 }
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 /* frame payload */
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 if (ctx->type == NGX_HTTP_V2_RST_STREAM_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1496
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1497 rc = ngx_http_grpc_parse_rst_stream(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1498
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1499 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1500 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1501 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1502
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1503 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1504 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1505 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1506
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1507 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1508 "upstream rejected request with error %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1509 ctx->error);
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 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1512 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1513
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1514 if (ctx->type == NGX_HTTP_V2_GOAWAY_FRAME) {
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 rc = ngx_http_grpc_parse_goaway(r, ctx, b);
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 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1519 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1520 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1521
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1522 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1523 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
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
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 stream_id is lower than one we use, our
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1528 * request won't be processed and needs to be retried.
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1529 * 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
1530 * we can continue normally (except we can't use this
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1531 * connection for additional requests). If there is
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1532 * a real error, the connection will be closed.
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1533 */
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 if (ctx->stream_id < ctx->id) {
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 /* TODO: we can retry non-idempotent requests */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1538
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1539 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1540 "upstream sent goaway with error %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1541 ctx->error);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1542
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1543 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1544 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1545
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1546 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1547 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1548
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1549 if (ctx->type == NGX_HTTP_V2_WINDOW_UPDATE_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1550
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1551 rc = ngx_http_grpc_parse_window_update(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1552
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1553 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1554 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1555 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1556
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1557 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1558 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1559 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1560
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1561 if (ctx->in) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1562 ngx_post_event(u->peer.connection->write, &ngx_posted_events);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1563 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1564
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1565 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1566 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1567
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1568 if (ctx->type == NGX_HTTP_V2_SETTINGS_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1569
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1570 rc = ngx_http_grpc_parse_settings(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1571
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1572 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1573 return NGX_AGAIN;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1576 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1577 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1578 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1579
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1580 if (ctx->in) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1581 ngx_post_event(u->peer.connection->write, &ngx_posted_events);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1582 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1583
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1584 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1585 }
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 if (ctx->type == NGX_HTTP_V2_PING_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1588
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1589 rc = ngx_http_grpc_parse_ping(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1590
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1591 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1592 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1593 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1594
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1595 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1596 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1599 ngx_post_event(u->peer.connection->write, &ngx_posted_events);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1600 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1601 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1602
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1603 if (ctx->type == NGX_HTTP_V2_PUSH_PROMISE_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1604 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1605 "upstream sent unexpected push promise frame");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1606 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1607 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1608
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1609 if (ctx->type != NGX_HTTP_V2_HEADERS_FRAME
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1610 && ctx->type != NGX_HTTP_V2_CONTINUATION_FRAME)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1611 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1612 /* priority, unknown frames */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1613
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1614 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1615 ctx->rest -= b->last - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1616 b->pos = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1617 return NGX_AGAIN;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1620 b->pos += ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1621 ctx->rest = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1622 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1623
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1624 continue;
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 /* headers */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1628
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1629 for ( ;; ) {
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 rc = ngx_http_grpc_parse_header(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1632
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1633 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1634 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1635 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1636
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1637 if (rc == NGX_OK) {
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 /* a header line has been parsed successfully */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1640
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1641 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1642 "grpc header: \"%V: %V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1643 &ctx->name, &ctx->value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1644
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1645 if (ctx->name.len && ctx->name.data[0] == ':') {
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 if (ctx->name.len != sizeof(":status") - 1
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1648 || ngx_strncmp(ctx->name.data, ":status",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1649 sizeof(":status") - 1)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1650 != 0)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1651 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1652 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1653 "upstream sent invalid header \"%V: %V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1654 &ctx->name, &ctx->value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1655 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1656 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1657
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1658 if (ctx->status) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1659 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1660 "upstream sent duplicate :status header");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1661 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1662 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1663
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1664 status_line = &ctx->value;
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 if (status_line->len != 3) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1667 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1668 "upstream sent invalid :status \"%V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1669 status_line);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1670 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1673 status = ngx_atoi(status_line->data, 3);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1674
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1675 if (status == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1676 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1677 "upstream sent invalid :status \"%V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1678 status_line);
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 if (status < NGX_HTTP_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1683 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1684 "upstream sent unexpected :status \"%V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1685 status_line);
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 u->headers_in.status_n = status;
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 if (u->state && u->state->status == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1692 u->state->status = status;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1693 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1694
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1695 ctx->status = 1;
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 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1698
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1699 } else if (!ctx->status) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1700 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1701 "upstream sent no :status header");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1702 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1703 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1704
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1705 h = ngx_list_push(&u->headers_in.headers);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1706 if (h == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1707 return NGX_ERROR;
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 h->key = ctx->name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1711 h->value = ctx->value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1712 h->lowcase_key = h->key.data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1713 h->hash = ngx_hash_key(h->key.data, h->key.len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1714
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1715 hh = ngx_hash_find(&umcf->headers_in_hash, h->hash,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1716 h->lowcase_key, h->key.len);
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 if (hh && hh->handler(r, h, hh->offset) != NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1719 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1722 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1723 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1724
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1725 if (rc == NGX_HTTP_PARSE_HEADER_DONE) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1726
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1727 /* a whole header has been parsed successfully */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1728
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1729 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1730 "grpc header done");
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 (ctx->end_stream
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1733 && ctx->in == NULL
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1734 && ctx->out == NULL
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1735 && ctx->output_closed
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1736 && b->last == b->pos)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1737 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1738 u->keepalive = 1;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1741 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1742 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1743
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1744 /* there was error while a header line parsing */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1745
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1746 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1747 "upstream sent invalid header");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1748
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1749 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1752 /* rc == NGX_AGAIN */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1753
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1754 if (ctx->rest == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1755 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1756 continue;
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 return NGX_AGAIN;
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
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 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1765 ngx_http_grpc_filter_init(void *data)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1766 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1767 ngx_http_grpc_ctx_t *ctx = data;
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 ngx_http_request_t *r;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1770 ngx_http_upstream_t *u;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1771
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1772 r = ctx->request;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1773 u = r->upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1774
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1775 u->length = 1;
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 if (ctx->end_stream) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1778 u->length = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1779 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1780
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1781 return NGX_OK;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1785 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1786 ngx_http_grpc_filter(void *data, ssize_t bytes)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1787 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1788 ngx_http_grpc_ctx_t *ctx = data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1789
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1790 ngx_int_t rc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1791 ngx_buf_t *b, *buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1792 ngx_chain_t *cl, **ll;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1793 ngx_table_elt_t *h;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1794 ngx_http_request_t *r;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1795 ngx_http_upstream_t *u;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1796
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1797 r = ctx->request;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1798 u = r->upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1799 b = &u->buffer;
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 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1802 "grpc filter bytes:%z", bytes);
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 b->pos = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1805 b->last += bytes;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1806
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1807 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
1808 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1809 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1810
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1811 for ( ;; ) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1812
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1813 if (ctx->state < ngx_http_grpc_st_payload) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1814
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1815 rc = ngx_http_grpc_parse_frame(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1816
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1817 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1818 return NGX_AGAIN;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1821 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1822 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1823 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1824
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1825 if ((ctx->type == NGX_HTTP_V2_CONTINUATION_FRAME
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1826 && !ctx->parsing_headers)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1827 || (ctx->type != NGX_HTTP_V2_CONTINUATION_FRAME
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1828 && ctx->parsing_headers))
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1829 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1830 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1831 "upstream sent unexpected http2 frame: %d",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1832 ctx->type);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1833 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1834 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1835
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1836 if (ctx->type == NGX_HTTP_V2_DATA_FRAME) {
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 if (ctx->stream_id != ctx->id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1839 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1840 "upstream sent data frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1841 "for unknown stream %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1842 ctx->stream_id);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1843 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1844 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1845
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1846 if (ctx->rest > ctx->recv_window) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1847 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1848 "upstream violated stream flow control, "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1849 "received %uz data frame with window %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1850 ctx->rest, ctx->recv_window);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1851 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1852 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1853
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1854 if (ctx->rest > ctx->connection->recv_window) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1855 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1856 "upstream violated connection flow control, "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1857 "received %uz data frame with window %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1858 ctx->rest, ctx->connection->recv_window);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1859 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1860 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1861
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1862 ctx->recv_window -= ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1863 ctx->connection->recv_window -= ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1864
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1865 if (ctx->connection->recv_window < NGX_HTTP_V2_MAX_WINDOW / 4
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1866 || ctx->recv_window < NGX_HTTP_V2_MAX_WINDOW / 4)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1867 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1868 if (ngx_http_grpc_send_window_update(r, ctx) != NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1869 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1870 }
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 ngx_post_event(u->peer.connection->write,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1873 &ngx_posted_events);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1874 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1875 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1876
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1877 if (ctx->stream_id && ctx->stream_id != ctx->id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1878 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1879 "upstream sent frame for unknown stream %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1880 ctx->stream_id);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1881 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1882 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1883
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1884 ctx->padding = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1885 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1886
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1887 if (ctx->state == ngx_http_grpc_st_padding) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1888
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1889 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1890 ctx->rest -= b->last - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1891 b->pos = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1892 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1893 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1894
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1895 b->pos += ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1896 ctx->rest = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1897 ctx->state = ngx_http_grpc_st_start;
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 if (ctx->flags & NGX_HTTP_V2_END_STREAM_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1900 u->length = 0;
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 if (ctx->in == NULL
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1903 && ctx->out == NULL
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1904 && ctx->output_closed
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1905 && b->last == b->pos)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1906 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1907 u->keepalive = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1908 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1909
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1910 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1911 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1912
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1913 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1914 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1915
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1916 /* frame payload */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1917
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1918 if (ctx->type == NGX_HTTP_V2_RST_STREAM_FRAME) {
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 rc = ngx_http_grpc_parse_rst_stream(r, ctx, b);
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 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1923 return NGX_AGAIN;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1926 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1927 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1928 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1929
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1930 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1931 "upstream rejected request with error %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1932 ctx->error);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1933
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1934 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1935 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1936
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1937 if (ctx->type == NGX_HTTP_V2_GOAWAY_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1938
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1939 rc = ngx_http_grpc_parse_goaway(r, ctx, b);
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 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1942 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1943 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1944
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1945 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1946 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1949 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1950 * If stream_id is lower than one we use, our
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1951 * request won't be processed and needs to be retried.
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1952 * 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
1953 * we can continue normally (except we can't use this
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1954 * connection for additional requests). If there is
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1955 * a real error, the connection will be closed.
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1956 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1957
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1958 if (ctx->stream_id < ctx->id) {
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 /* TODO: we can retry non-idempotent requests */
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 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1963 "upstream sent goaway with error %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1964 ctx->error);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1965
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1966 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1967 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1968
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1969 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1970 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1971
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1972 if (ctx->type == NGX_HTTP_V2_WINDOW_UPDATE_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1973
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1974 rc = ngx_http_grpc_parse_window_update(r, ctx, b);
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 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1977 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1978 }
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 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1981 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1984 if (ctx->in) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1985 ngx_post_event(u->peer.connection->write, &ngx_posted_events);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1986 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1987
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1988 continue;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1991 if (ctx->type == NGX_HTTP_V2_SETTINGS_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1992
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1993 rc = ngx_http_grpc_parse_settings(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1994
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1995 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1996 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1997 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1998
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1999 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2000 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2001 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2002
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2003 if (ctx->in) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2004 ngx_post_event(u->peer.connection->write, &ngx_posted_events);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2005 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2006
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2007 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2008 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2009
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2010 if (ctx->type == NGX_HTTP_V2_PING_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2011
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2012 rc = ngx_http_grpc_parse_ping(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2013
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2014 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2015 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2016 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2017
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2018 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2019 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2020 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2021
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2022 ngx_post_event(u->peer.connection->write, &ngx_posted_events);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2023 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2024 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2025
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2026 if (ctx->type == NGX_HTTP_V2_PUSH_PROMISE_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2027 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2028 "upstream sent unexpected push promise frame");
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_HEADERS_FRAME
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2033 || ctx->type == NGX_HTTP_V2_CONTINUATION_FRAME)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2034 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2035 for ( ;; ) {
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 rc = ngx_http_grpc_parse_header(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2038
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2039 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2040 break;
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 (rc == NGX_OK) {
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 /* a header line has been parsed successfully */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2046
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2047 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2048 "grpc trailer: \"%V: %V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2049 &ctx->name, &ctx->value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2050
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2051 if (ctx->name.len && ctx->name.data[0] == ':') {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2052 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2053 "upstream sent invalid "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2054 "trailer \"%V: %V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2055 &ctx->name, &ctx->value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2056 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2057 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2058
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2059 h = ngx_list_push(&u->headers_in.trailers);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2060 if (h == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2061 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2062 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2063
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2064 h->key = ctx->name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2065 h->value = ctx->value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2066 h->lowcase_key = h->key.data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2067 h->hash = ngx_hash_key(h->key.data, h->key.len);
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 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2070 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2071
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2072 if (rc == NGX_HTTP_PARSE_HEADER_DONE) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2073
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2074 /* a whole header has been parsed successfully */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2075
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2076 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2077 "grpc trailer done");
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 if (ctx->end_stream) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2080 u->length = 0;
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 if (ctx->in == NULL
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2083 && ctx->out == NULL
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2084 && ctx->output_closed
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2085 && b->last == b->pos)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2086 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2087 u->keepalive = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2088 }
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 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2091 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2092
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2093 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2094 "upstream sent trailer without "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2095 "end stream flag");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2096 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2097 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2098
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2099 /* there was error while a header line parsing */
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 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2102 "upstream sent invalid trailer");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2103
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2104 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2105 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2106
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2107 /* rc == NGX_AGAIN */
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 if (ctx->rest == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2110 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2111 continue;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2114 return NGX_AGAIN;
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 if (ctx->type != NGX_HTTP_V2_DATA_FRAME) {
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 /* priority, unknown frames */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2120
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2121 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2122 ctx->rest -= b->last - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2123 b->pos = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2124 return NGX_AGAIN;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2127 b->pos += ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2128 ctx->rest = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2129 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2130
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2131 continue;
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 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2135 * data frame:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2136 *
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 * |Pad Length? (8)|
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 * | Data (*) ...
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2141 * +---------------------------------------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2142 * | Padding (*) ...
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2143 * +---------------------------------------------------------------+
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2146 if (ctx->flags & NGX_HTTP_V2_PADDED_FLAG) {
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 if (ctx->rest == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2149 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2150 "upstream sent too short http2 frame");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2151 return NGX_ERROR;
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 (b->pos == b->last) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2155 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2156 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2157
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2158 ctx->flags &= ~NGX_HTTP_V2_PADDED_FLAG;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2159 ctx->padding = *b->pos++;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2160 ctx->rest -= 1;
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->padding > ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2163 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2164 "upstream sent http2 frame with too long "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2165 "padding: %d in frame %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2166 ctx->padding, ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2167 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2168 }
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 continue;
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 if (ctx->rest == ctx->padding) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2174 goto done;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2177 if (b->pos == b->last) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2178 return NGX_AGAIN;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2181 cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2182 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2183 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2184 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2185
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2186 *ll = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2187 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2188
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2189 buf = cl->buf;
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 buf->flush = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2192 buf->memory = 1;
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 buf->pos = b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2195 buf->tag = u->output.tag;
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 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2198 "grpc output buf %p", buf->pos);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2199
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2200 if (b->last - b->pos < (ssize_t) ctx->rest - ctx->padding) {
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 ctx->rest -= b->last - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2203 b->pos = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2204 buf->last = b->pos;
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 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2207 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2208
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2209 b->pos += ctx->rest - ctx->padding;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2210 buf->last = b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2211 ctx->rest = ctx->padding;
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 done:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2214
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2215 if (ctx->padding) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2216 ctx->state = ngx_http_grpc_st_padding;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2217 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2218 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2219
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2220 ctx->state = ngx_http_grpc_st_start;
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 (ctx->flags & NGX_HTTP_V2_END_STREAM_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2223 u->length = 0;
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 if (ctx->in == NULL
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2226 && ctx->out == NULL
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2227 && ctx->output_closed
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2228 && b->last == b->pos)
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 u->keepalive = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2231 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2232
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2233 break;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2237 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2238 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2239
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2240
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2241 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2242 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
2243 ngx_buf_t *b)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2244 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2245 u_char ch, *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2246 ngx_http_grpc_state_e state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2247
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2248 state = ctx->state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2249
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2250 for (p = b->pos; p < b->last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2251 ch = *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2252
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2253 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2254 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2255 "grpc frame byte: %02Xd, s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2256 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2257
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2258 switch (state) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2259
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2260 case ngx_http_grpc_st_start:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2261 ctx->rest = ch << 16;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2262 state = ngx_http_grpc_st_length_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2263 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2264
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2265 case ngx_http_grpc_st_length_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2266 ctx->rest |= ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2267 state = ngx_http_grpc_st_length_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2268 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2269
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2270 case ngx_http_grpc_st_length_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2271 ctx->rest |= ch;
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 if (ctx->rest > NGX_HTTP_V2_DEFAULT_FRAME_SIZE) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2274 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2275 "upstream sent too large http2 frame: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2276 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2277 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2278 }
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 state = ngx_http_grpc_st_type;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2281 break;
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 case ngx_http_grpc_st_type:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2284 ctx->type = ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2285 state = ngx_http_grpc_st_flags;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2286 break;
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 case ngx_http_grpc_st_flags:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2289 ctx->flags = ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2290 state = ngx_http_grpc_st_stream_id;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2291 break;
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 case ngx_http_grpc_st_stream_id:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2294 ctx->stream_id = (ch & 0x7f) << 24;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2295 state = ngx_http_grpc_st_stream_id_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2296 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2297
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2298 case ngx_http_grpc_st_stream_id_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2299 ctx->stream_id |= ch << 16;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2300 state = ngx_http_grpc_st_stream_id_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2301 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2302
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2303 case ngx_http_grpc_st_stream_id_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2304 ctx->stream_id |= ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2305 state = ngx_http_grpc_st_stream_id_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2306 break;
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 case ngx_http_grpc_st_stream_id_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2309 ctx->stream_id |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2310
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2311 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2312 "grpc frame: %d, len: %uz, f:%d, i:%ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2313 ctx->type, ctx->rest, ctx->flags, ctx->stream_id);
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 b->pos = p + 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2316
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2317 ctx->state = ngx_http_grpc_st_payload;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2318 ctx->frame_state = 0;
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 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2321
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2322 /* suppress warning */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2323 case ngx_http_grpc_st_payload:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2324 case ngx_http_grpc_st_padding:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2325 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2326 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2327 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2328
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2329 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2330 ctx->state = state;
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 return NGX_AGAIN;
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
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 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2337 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
2338 ngx_buf_t *b)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2339 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2340 u_char ch, *p, *last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2341 size_t min;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2342 ngx_int_t rc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2343 enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2344 sw_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2345 sw_padding_length,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2346 sw_dependency,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2347 sw_dependency_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2348 sw_dependency_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2349 sw_dependency_4,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2350 sw_weight,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2351 sw_fragment,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2352 sw_padding
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2353 } state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2354
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2355 state = ctx->frame_state;
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 if (state == sw_start) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2358
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2359 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2360 "grpc parse header: start");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2361
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2362 if (ctx->type == NGX_HTTP_V2_HEADERS_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2363 ctx->parsing_headers = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2364 ctx->fragment_state = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2365
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2366 min = (ctx->flags & NGX_HTTP_V2_PADDED_FLAG ? 1 : 0)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2367 + (ctx->flags & NGX_HTTP_V2_PRIORITY_FLAG ? 5 : 0);
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 if (ctx->rest < min) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2370 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2371 "upstream sent headers frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2372 "with invalid length: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2373 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2374 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2377 if (ctx->flags & NGX_HTTP_V2_END_STREAM_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2378 ctx->end_stream = 1;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2381 if (ctx->flags & NGX_HTTP_V2_PADDED_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2382 state = sw_padding_length;
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 } else if (ctx->flags & NGX_HTTP_V2_PRIORITY_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2385 state = sw_dependency;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2386
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2387 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2388 state = sw_fragment;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2391 } else if (ctx->type == NGX_HTTP_V2_CONTINUATION_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2392 state = sw_fragment;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2393 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2394
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2395 ctx->padding = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2396 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2397
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2398 if (state < sw_fragment) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2399
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2400 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2401 last = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2402
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2403 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2404 last = b->pos + ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2405 }
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 for (p = b->pos; p < last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2408 ch = *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2409
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2410 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2411 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2412 "grpc header byte: %02Xd s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2413 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2414
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2415 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2416 * headers frame:
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 * |Pad Length? (8)|
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 * |E| Stream Dependency? (31) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2422 * +-+-------------+----------------------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2423 * | Weight? (8) |
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 * | Header Block Fragment (*) ...
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2426 * +--------------------------------------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2427 * | Padding (*) ...
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2431 switch (state) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2432
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2433 case sw_padding_length:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2434
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2435 ctx->padding = ch;
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 if (ctx->flags & NGX_HTTP_V2_PRIORITY_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2438 state = sw_dependency;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2439 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2440 }
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 goto fragment;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2443
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2444 case sw_dependency:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2445 state = sw_dependency_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2446 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2447
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2448 case sw_dependency_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2449 state = sw_dependency_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2450 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2451
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2452 case sw_dependency_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2453 state = sw_dependency_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2454 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2455
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2456 case sw_dependency_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2457 state = sw_weight;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2458 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2459
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2460 case sw_weight:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2461 goto fragment;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2462
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2463 /* suppress warning */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2464 case sw_start:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2465 case sw_fragment:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2466 case sw_padding:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2467 break;
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 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2470
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2471 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2472 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2473
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2474 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2475 return NGX_AGAIN;
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 fragment:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2478
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2479 p++;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2480 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2481 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2482
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2483 if (ctx->padding > ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2484 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2485 "upstream sent http2 frame with too long "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2486 "padding: %d in frame %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2487 ctx->padding, ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2488 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2489 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2490
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2491 state = sw_fragment;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2492 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2493 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2494
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2495 if (state == sw_fragment) {
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 rc = ngx_http_grpc_parse_fragment(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2498
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2499 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2500 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2501 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2502
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2503 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2504 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2507 if (rc == NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2508 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2509 }
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 /* rc == NGX_DONE */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2512
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2513 state = sw_padding;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2514 ctx->frame_state = state;
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 if (state == sw_padding) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2518
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2519 if (b->last - b->pos < (ssize_t) ctx->rest) {
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 ctx->rest -= b->last - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2522 b->pos = b->last;
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 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2525 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2526
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2527 b->pos += ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2528 ctx->rest = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2529
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2530 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2531
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2532 if (ctx->flags & NGX_HTTP_V2_END_HEADERS_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2533
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2534 if (ctx->fragment_state) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2535 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2536 "upstream sent truncated http2 header");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2537 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2538 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2539
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2540 ctx->parsing_headers = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2541
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2542 return NGX_HTTP_PARSE_HEADER_DONE;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2545 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2546 }
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 /* unreachable */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2549
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2550 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2551 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2552
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2553
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2554 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2555 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
2556 ngx_buf_t *b)
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 u_char ch, *p, *last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2559 size_t size;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2560 ngx_uint_t index, size_update;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2561 enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2562 sw_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2563 sw_index,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2564 sw_name_length,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2565 sw_name_length_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2566 sw_name_length_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2567 sw_name_length_4,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2568 sw_name,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2569 sw_name_bytes,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2570 sw_value_length,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2571 sw_value_length_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2572 sw_value_length_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2573 sw_value_length_4,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2574 sw_value,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2575 sw_value_bytes
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2576 } state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2577
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2578 /* header block fragment */
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 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2581 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2582 "grpc header fragment %p:%p rest:%uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2583 b->pos, b->last, ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2584 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2585
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2586 if (b->last - b->pos < (ssize_t) ctx->rest - ctx->padding) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2587 last = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2588
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2589 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2590 last = b->pos + ctx->rest - ctx->padding;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2591 }
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 state = ctx->fragment_state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2594
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2595 for (p = b->pos; p < last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2596 ch = *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2597
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2598 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2599 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2600 "grpc header byte: %02Xd s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2601 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2602
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2603 switch (state) {
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 case sw_start:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2606 ctx->index = 0;
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 if ((ch & 0x80) == 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2609 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2610 * indexed header:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2611 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2612 * 0 1 2 3 4 5 6 7
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2613 * +---+---+---+---+---+---+---+---+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2614 * | 1 | Index (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2615 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2616 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2617
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2618 index = ch & ~0x80;
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 if (index == 0 || index > 61) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2621 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2622 "upstream sent invalid http2 "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2623 "table index: %ui", index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2624 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2625 }
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 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2628 "grpc indexed header: %ui", index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2629
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2630 ctx->index = index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2631 ctx->literal = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2632
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2633 goto done;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2634
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2635 } else if ((ch & 0xc0) == 0x40) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2636 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2637 * literal header with incremental indexing:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2638 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2639 * 0 1 2 3 4 5 6 7
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2640 * +---+---+---+---+---+---+---+---+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2641 * | 0 | 1 | Index (6+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2642 * +---+---+-----------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2643 * | H | Value Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2644 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2645 * | Value String (Length octets) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2646 * +-------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2647 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2648 * 0 1 2 3 4 5 6 7
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 * | 0 | 1 | 0 |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2651 * +---+---+-----------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2652 * | H | Name Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2653 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2654 * | Name String (Length octets) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2655 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2656 * | H | Value Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2657 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2658 * | Value String (Length octets) |
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2662 index = ch & ~0xc0;
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 if (index > 61) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2665 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2666 "upstream sent invalid http2 "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2667 "table index: %ui", index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2668 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2669 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2670
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2671 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2672 "grpc literal header: %ui", index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2673
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2674 if (index == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2675 state = sw_name_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2676 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2677 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2678
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2679 ctx->index = index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2680 ctx->literal = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2681
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2682 state = sw_value_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2683 break;
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 } else if ((ch & 0xe0) == 0x20) {
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 * dynamic table size update:
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 * 0 1 2 3 4 5 6 7
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2690 * +---+---+---+---+---+---+---+---+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2691 * | 0 | 0 | 1 | Max size (5+) |
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 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2694
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2695 size_update = ch & ~0xe0;
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 (size_update > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2698 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2699 "upstream sent invalid http2 "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2700 "dynamic table size update: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2701 size_update);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2702 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2703 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2704
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2705 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2706 "grpc table size update: %ui", size_update);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2707
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2708 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2709
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2710 } else if ((ch & 0xf0) == 0x10) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2711 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2712 * literal header field never indexed:
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 * 0 1 2 3 4 5 6 7
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 * | 0 | 0 | 0 | 1 | Index (4+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2717 * +---+---+-----------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2718 * | H | Value Length (7+) |
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 * | Value String (Length octets) |
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 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2723 * 0 1 2 3 4 5 6 7
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2724 * +---+---+---+---+---+---+---+---+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2725 * | 0 | 0 | 0 | 1 | 0 |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2726 * +---+---+-----------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2727 * | H | Name Length (7+) |
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 * | Name String (Length octets) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2730 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2731 * | H | Value Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2732 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2733 * | Value String (Length octets) |
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 */
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 index = ch & ~0xf0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2738
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2739 if (index == 0x0f) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2740 ctx->index = index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2741 ctx->literal = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2742 state = sw_index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2743 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2744 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2745
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2746 if (index == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2747 state = sw_name_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2748 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2749 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2750
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2751 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2752 "grpc literal header never indexed: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2753 index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2754
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2755 ctx->index = index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2756 ctx->literal = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2757
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2758 state = sw_value_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2759 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2760
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2761 } else if ((ch & 0xf0) == 0x00) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2762 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2763 * literal header field without indexing:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2764 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2765 * 0 1 2 3 4 5 6 7
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2766 * +---+---+---+---+---+---+---+---+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2767 * | 0 | 0 | 0 | 0 | Index (4+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2768 * +---+---+-----------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2769 * | H | Value Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2770 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2771 * | Value String (Length octets) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2772 * +-------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2773 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2774 * 0 1 2 3 4 5 6 7
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 * | 0 | 0 | 0 | 0 | 0 |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2777 * +---+---+-----------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2778 * | H | Name Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2779 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2780 * | Name String (Length octets) |
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 * | H | Value Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2783 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2784 * | Value String (Length octets) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2785 * +-------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2786 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2787
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2788 index = ch & ~0xf0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2789
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2790 if (index == 0x0f) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2791 ctx->index = index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2792 ctx->literal = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2793 state = sw_index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2794 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2795 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2796
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2797 if (index == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2798 state = sw_name_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2799 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2800 }
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 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2803 "grpc literal header without indexing: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2804 index);
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 ctx->index = index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2807 ctx->literal = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2808
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2809 state = sw_value_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2810 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2811 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2812
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2813 /* not reached */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2814
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2815 return NGX_ERROR;
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 case sw_index:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2818 ctx->index = ctx->index + (ch & ~0x80);
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 if (ch & 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2821 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2822 "upstream sent http2 table index "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2823 "with continuation flag");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2824 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2825 }
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 if (ctx->index > 61) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2828 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2829 "upstream sent invalid http2 "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2830 "table index: %ui", ctx->index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2831 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2834 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2835 "grpc header index: %ui", ctx->index);
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 state = sw_value_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2838 break;
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 case sw_name_length:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2841 ctx->field_huffman = ch & 0x80 ? 1 : 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2842 ctx->field_length = ch & ~0x80;
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 if (ctx->field_length == 0x7f) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2845 state = sw_name_length_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2846 break;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2849 if (ctx->field_length == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2850 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2851 "upstream sent zero http2 "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2852 "header name length");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2853 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2854 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2855
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2856 state = sw_name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2857 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2858
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2859 case sw_name_length_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2860 ctx->field_length += ch & ~0x80;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2861
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2862 if (ch & 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2863 state = sw_name_length_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2864 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2865 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2866
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2867 state = sw_name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2868 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2869
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2870 case sw_name_length_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2871 ctx->field_length += (ch & ~0x80) << 7;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2872
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2873 if (ch & 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2874 state = sw_name_length_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2875 break;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2878 state = sw_name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2879 break;
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 case sw_name_length_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2882 ctx->field_length += (ch & ~0x80) << 14;
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 if (ch & 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2885 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2886 "upstream sent too large http2 "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2887 "header name length");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2888 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2889 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2890
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2891 state = sw_name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2892 break;
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 case sw_name:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2895 ctx->name.len = ctx->field_huffman ?
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2896 ctx->field_length * 8 / 5 : ctx->field_length;
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 ctx->name.data = ngx_pnalloc(r->pool, ctx->name.len + 1);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2899 if (ctx->name.data == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2900 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2901 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2902
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2903 ctx->field_end = ctx->name.data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2904 ctx->field_rest = ctx->field_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2905 ctx->field_state = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2906
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2907 state = sw_name_bytes;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2908
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2909 /* fall through */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2910
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2911 case sw_name_bytes:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2912
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2913 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2914 "grpc name: len:%uz h:%d last:%uz, rest:%uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2915 ctx->field_length,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2916 ctx->field_huffman,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2917 last - p,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2918 ctx->rest - (p - b->pos));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2919
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2920 size = ngx_min(last - p, (ssize_t) ctx->field_rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2921 ctx->field_rest -= size;
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 if (ctx->field_huffman) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2924 if (ngx_http_v2_huff_decode(&ctx->field_state, p, size,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2925 &ctx->field_end,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2926 ctx->field_rest == 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2927 r->connection->log)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2928 != NGX_OK)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2929 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2930 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2931 "upstream sent invalid encoded header");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2932 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2933 }
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 ctx->name.len = ctx->field_end - ctx->name.data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2936 ctx->name.data[ctx->name.len] = '\0';
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2937
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2938 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2939 ngx_memcpy(ctx->field_end, p, size);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2940 ctx->name.data[ctx->name.len] = '\0';
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2941 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2942
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2943 p += size - 1;
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 if (ctx->field_rest == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2946 state = sw_value_length;
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
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 case sw_value_length:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2952 ctx->field_huffman = ch & 0x80 ? 1 : 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2953 ctx->field_length = ch & ~0x80;
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 if (ctx->field_length == 0x7f) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2956 state = sw_value_length_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2957 break;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2960 if (ctx->field_length == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2961 ngx_str_set(&ctx->value, "");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2962 goto done;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2963 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2964
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2965 state = sw_value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2966 break;
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 case sw_value_length_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2969 ctx->field_length += ch & ~0x80;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2970
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2971 if (ch & 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2972 state = sw_value_length_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2973 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2974 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2975
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2976 state = sw_value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2977 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2978
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2979 case sw_value_length_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2980 ctx->field_length += (ch & ~0x80) << 7;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2981
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2982 if (ch & 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2983 state = sw_value_length_4;
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 state = sw_value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2988 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2989
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2990 case sw_value_length_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2991 ctx->field_length += (ch & ~0x80) << 14;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2992
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2993 if (ch & 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2994 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2995 "upstream sent too large http2 "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2996 "header value length");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2997 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3000 state = sw_value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3001 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3002
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3003 case sw_value:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3004 ctx->value.len = ctx->field_huffman ?
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3005 ctx->field_length * 8 / 5 : ctx->field_length;
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 ctx->value.data = ngx_pnalloc(r->pool, ctx->value.len + 1);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3008 if (ctx->value.data == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3009 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3010 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3011
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3012 ctx->field_end = ctx->value.data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3013 ctx->field_rest = ctx->field_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3014 ctx->field_state = 0;
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 state = sw_value_bytes;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3017
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3018 /* fall through */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3019
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3020 case sw_value_bytes:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3021
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3022 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3023 "grpc value: len:%uz h:%d last:%uz, rest:%uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3024 ctx->field_length,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3025 ctx->field_huffman,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3026 last - p,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3027 ctx->rest - (p - b->pos));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3028
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3029 size = ngx_min(last - p, (ssize_t) ctx->field_rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3030 ctx->field_rest -= size;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3031
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3032 if (ctx->field_huffman) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3033 if (ngx_http_v2_huff_decode(&ctx->field_state, p, size,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3034 &ctx->field_end,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3035 ctx->field_rest == 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3036 r->connection->log)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3037 != NGX_OK)
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 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3040 "upstream sent invalid encoded header");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3041 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3042 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3043
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3044 ctx->value.len = ctx->field_end - ctx->value.data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3045 ctx->value.data[ctx->value.len] = '\0';
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3046
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3047 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3048 ngx_memcpy(ctx->field_end, p, size);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3049 ctx->value.data[ctx->value.len] = '\0';
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3050 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3051
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3052 p += size - 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3053
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3054 if (ctx->field_rest == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3055 goto done;
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
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3061 continue;
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 done:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3064
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3065 p++;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3066 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3067 ctx->fragment_state = sw_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3068 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3069
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3070 if (ctx->index) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3071 ctx->name = *ngx_http_v2_get_static_name(ctx->index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3072 }
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 (ctx->index && !ctx->literal) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3075 ctx->value = *ngx_http_v2_get_static_value(ctx->index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3076 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3077
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3078 if (!ctx->index) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3079 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
3080 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3081 "upstream sent invalid header: \"%V: %V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3082 &ctx->name, &ctx->value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3083 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3084 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3085 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3086
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3087 if (!ctx->index || ctx->literal) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3088 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
3089 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3090 "upstream sent invalid header: \"%V: %V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3091 &ctx->name, &ctx->value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3092 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3093 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3094 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3095
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3096 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3097 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3098
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3099 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3100 ctx->fragment_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3101 b->pos = p;
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 if (ctx->rest > ctx->padding) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3104 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3105 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3106
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3107 return NGX_DONE;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3108 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3109
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3110
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3111 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3112 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
3113 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3114 u_char ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3115 ngx_uint_t i;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3116
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3117 for (i = 0; i < s->len; i++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3118 ch = s->data[i];
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 if (ch == ':' && i > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3121 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3122 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3123
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3124 if (ch >= 'A' && ch <= 'Z') {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3125 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3126 }
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 if (ch == '\0' || ch == CR || ch == LF) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3129 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3130 }
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 return NGX_OK;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3136
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3137 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3138 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
3139 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3140 u_char ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3141 ngx_uint_t i;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3142
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3143 for (i = 0; i < s->len; i++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3144 ch = s->data[i];
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3145
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3146 if (ch == '\0' || ch == CR || ch == LF) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3147 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3151 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3152 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3153
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 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3156 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
3157 ngx_buf_t *b)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3158 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3159 u_char ch, *p, *last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3160 enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3161 sw_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3162 sw_error_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3163 sw_error_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3164 sw_error_4
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3165 } state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3166
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3167 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3168 last = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3169
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3170 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3171 last = b->pos + ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3172 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3173
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3174 state = ctx->frame_state;
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 if (state == sw_start) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3177 if (ctx->rest != 4) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3178 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3179 "upstream sent rst stream frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3180 "with invalid length: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3181 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3182 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3183 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3184 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3185
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3186 for (p = b->pos; p < last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3187 ch = *p;
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 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3190 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3191 "grpc rst byte: %02Xd s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3192 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3193
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3194 switch (state) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3195
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3196 case sw_start:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3197 ctx->error = ch << 24;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3198 state = sw_error_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3199 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3200
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3201 case sw_error_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3202 ctx->error |= ch << 16;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3203 state = sw_error_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3204 break;
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 case sw_error_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3207 ctx->error |= ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3208 state = sw_error_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3209 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3210
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3211 case sw_error_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3212 ctx->error |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3213 state = sw_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3214
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3215 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3216 "grpc error: %ui", ctx->error);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3217
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3218 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3219 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3220 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3221
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3222 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3223 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3224 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3225
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3226 if (ctx->rest > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3227 return NGX_AGAIN;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3230 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3231 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3232
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 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3235 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
3236 ngx_buf_t *b)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3237 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3238 u_char ch, *p, *last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3239 enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3240 sw_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3241 sw_last_stream_id_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3242 sw_last_stream_id_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3243 sw_last_stream_id_4,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3244 sw_error,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3245 sw_error_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3246 sw_error_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3247 sw_error_4,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3248 sw_debug
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3249 } state;
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 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3252 last = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3253
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3254 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3255 last = b->pos + ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3256 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3257
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3258 state = ctx->frame_state;
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 (state == sw_start) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3261
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3262 if (ctx->stream_id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3263 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3264 "upstream sent goaway frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3265 "with non-zero stream id: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3266 ctx->stream_id);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3267 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3268 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3269
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3270 if (ctx->rest < 8) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3271 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3272 "upstream sent goaway frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3273 "with invalid length: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3274 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3275 return NGX_ERROR;
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 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3278
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3279 for (p = b->pos; p < last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3280 ch = *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3281
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3282 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3283 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3284 "grpc goaway byte: %02Xd s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3285 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3286
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3287 switch (state) {
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 case sw_start:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3290 ctx->stream_id = (ch & 0x7f) << 24;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3291 state = sw_last_stream_id_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3292 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3293
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3294 case sw_last_stream_id_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3295 ctx->stream_id |= ch << 16;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3296 state = sw_last_stream_id_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3297 break;
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 case sw_last_stream_id_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3300 ctx->stream_id |= ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3301 state = sw_last_stream_id_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3302 break;
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 case sw_last_stream_id_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3305 ctx->stream_id |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3306 state = sw_error;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3307 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3308
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3309 case sw_error:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3310 ctx->error = ch << 24;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3311 state = sw_error_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3312 break;
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 case sw_error_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3315 ctx->error |= ch << 16;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3316 state = sw_error_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3317 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3318
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3319 case sw_error_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3320 ctx->error |= ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3321 state = sw_error_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3322 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3323
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3324 case sw_error_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3325 ctx->error |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3326 state = sw_debug;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3327 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3328
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3329 case sw_debug:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3330 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3331 }
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3334 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3335 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3336 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3337
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3338 if (ctx->rest > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3339 return NGX_AGAIN;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3342 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3343 "grpc goaway: %ui, stream %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3344 ctx->error, ctx->stream_id);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3345
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3346 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3347
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3348 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3349 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3350
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3351
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3352 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3353 ngx_http_grpc_parse_window_update(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3354 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3355 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3356 u_char ch, *p, *last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3357 enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3358 sw_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3359 sw_size_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3360 sw_size_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3361 sw_size_4
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3362 } state;
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 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3365 last = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3366
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3367 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3368 last = b->pos + ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3369 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3370
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3371 state = ctx->frame_state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3372
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3373 if (state == sw_start) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3374 if (ctx->rest != 4) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3375 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3376 "upstream sent window update frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3377 "with invalid length: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3378 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3379 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3380 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3381 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3382
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3383 for (p = b->pos; p < last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3384 ch = *p;
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 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3387 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3388 "grpc window update byte: %02Xd s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3389 #endif
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 switch (state) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3392
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3393 case sw_start:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3394 ctx->window_update = (ch & 0x7f) << 24;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3395 state = sw_size_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3396 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3397
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3398 case sw_size_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3399 ctx->window_update |= ch << 16;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3400 state = sw_size_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3401 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3402
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3403 case sw_size_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3404 ctx->window_update |= ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3405 state = sw_size_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3406 break;
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 case sw_size_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3409 ctx->window_update |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3410 state = sw_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3411 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3412 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3413 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3414
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3415 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3416 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3417 b->pos = p;
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 if (ctx->rest > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3420 return NGX_AGAIN;
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 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3424
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3425 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3426 "grpc window update: %ui", ctx->window_update);
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 if (ctx->stream_id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3429
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3430 if (ctx->window_update > (size_t) NGX_HTTP_V2_MAX_WINDOW
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3431 - ctx->send_window)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3432 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3433 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3434 "upstream sent too large window update");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3435 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3436 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3437
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3438 ctx->send_window += ctx->window_update;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3439
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3440 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3441
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3442 if (ctx->window_update > NGX_HTTP_V2_MAX_WINDOW
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3443 - ctx->connection->send_window)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3444 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3445 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3446 "upstream sent too large window update");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3447 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3448 }
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 ctx->connection->send_window += ctx->window_update;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3453 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3454 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3455
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3456
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3457 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3458 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
3459 ngx_buf_t *b)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3460 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3461 u_char ch, *p, *last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3462 ssize_t window_update;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3463 enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3464 sw_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3465 sw_id,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3466 sw_id_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3467 sw_value,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3468 sw_value_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3469 sw_value_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3470 sw_value_4
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3471 } state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3472
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3473 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3474 last = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3475
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3476 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3477 last = b->pos + ctx->rest;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3480 state = ctx->frame_state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3481
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3482 if (state == sw_start) {
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 if (ctx->stream_id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3485 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3486 "upstream sent settings frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3487 "with non-zero stream id: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3488 ctx->stream_id);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3489 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3490 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3491
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3492 if (ctx->flags & NGX_HTTP_V2_ACK_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3493 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3494 "grpc settings ack");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3495
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3496 if (ctx->rest != 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3497 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3498 "upstream sent settings frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3499 "with ack flag and non-zero length: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3500 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3501 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3502 }
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 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3505
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3506 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3507 }
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 if (ctx->rest % 6 != 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3510 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3511 "upstream sent settings frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3512 "with invalid length: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3513 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3514 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3515 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3516 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3517
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3518 for (p = b->pos; p < last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3519 ch = *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3520
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3521 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3522 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3523 "grpc settings byte: %02Xd s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3524 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3525
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3526 switch (state) {
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 case sw_start:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3529 case sw_id:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3530 ctx->setting_id = ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3531 state = sw_id_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3532 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3533
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3534 case sw_id_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3535 ctx->setting_id |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3536 state = sw_value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3537 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3538
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3539 case sw_value:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3540 ctx->setting_value = ch << 24;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3541 state = sw_value_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3542 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3543
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3544 case sw_value_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3545 ctx->setting_value |= ch << 16;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3546 state = sw_value_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3547 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3548
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3549 case sw_value_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3550 ctx->setting_value |= ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3551 state = sw_value_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3552 break;
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 case sw_value_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3555 ctx->setting_value |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3556 state = sw_id;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3557
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3558 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3559 "grpc setting: %ui %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3560 ctx->setting_id, ctx->setting_value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3561
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 * The following settings are defined by the protocol:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3564 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3565 * SETTINGS_HEADER_TABLE_SIZE, SETTINGS_ENABLE_PUSH,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3566 * SETTINGS_MAX_CONCURRENT_STREAMS, SETTINGS_INITIAL_WINDOW_SIZE,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3567 * SETTINGS_MAX_FRAME_SIZE, SETTINGS_MAX_HEADER_LIST_SIZE
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3568 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3569 * Only SETTINGS_INITIAL_WINDOW_SIZE seems to be needed in
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3570 * a simple client.
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 if (ctx->setting_id == 0x04) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3574 /* SETTINGS_INITIAL_WINDOW_SIZE */
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 (ctx->setting_value > NGX_HTTP_V2_MAX_WINDOW) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3577 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3578 "upstream sent settings frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3579 "with too large initial window size: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3580 ctx->setting_value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3581 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3582 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3583
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3584 window_update = ctx->setting_value
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3585 - ctx->connection->init_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3586 ctx->connection->init_window = ctx->setting_value;
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 if (ctx->send_window > 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3589 && window_update > (ssize_t) NGX_HTTP_V2_MAX_WINDOW
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3590 - ctx->send_window)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3591 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3592 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3593 "upstream sent settings frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3594 "with too large initial window size: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3595 ctx->setting_value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3596 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3599 ctx->send_window += window_update;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3600 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3601
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3602 break;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3606 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3607 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3608 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3609
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3610 if (ctx->rest > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3611 return NGX_AGAIN;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3614 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3615
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3616 return ngx_http_grpc_send_settings_ack(r, ctx);
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
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 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3621 ngx_http_grpc_parse_ping(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3622 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3623 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3624 u_char ch, *p, *last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3625 enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3626 sw_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3627 sw_data_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3628 sw_data_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3629 sw_data_4,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3630 sw_data_5,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3631 sw_data_6,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3632 sw_data_7,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3633 sw_data_8
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3634 } state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3635
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3636 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3637 last = b->last;
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 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3640 last = b->pos + ctx->rest;
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 state = ctx->frame_state;
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 if (state == sw_start) {
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 if (ctx->stream_id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3648 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3649 "upstream sent ping frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3650 "with non-zero stream id: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3651 ctx->stream_id);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3652 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3653 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3654
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3655 if (ctx->rest != 8) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3656 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3657 "upstream sent ping frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3658 "with invalid length: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3659 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3660 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3661 }
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 (ctx->flags & NGX_HTTP_V2_ACK_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3664 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3665 "upstream sent ping frame with ack flag");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3666 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3667 }
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 for (p = b->pos; p < last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3671 ch = *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3672
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3673 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3674 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3675 "grpc ping byte: %02Xd s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3676 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3677
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3678 if (state < sw_data_8) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3679 ctx->ping_data[state] = ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3680 state++;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3681
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3682 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3683 ctx->ping_data[7] = ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3684 state = sw_start;
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 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3687 "grpc ping");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3688 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3689 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3690
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3691 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3692 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3693 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3694
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3695 if (ctx->rest > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3696 return NGX_AGAIN;
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 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3700
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3701 return ngx_http_grpc_send_ping_ack(r, ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3702 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3703
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3704
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3705 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3706 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
3707 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3708 ngx_chain_t *cl, **ll;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3709 ngx_http_grpc_frame_t *f;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3710
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3711 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3712 "grpc send settings ack");
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 (cl = ctx->out, ll = &ctx->out; cl; cl = cl->next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3715 ll = &cl->next;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3718 cl = ngx_http_grpc_get_buf(r, ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3719 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3720 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3723 f = (ngx_http_grpc_frame_t *) cl->buf->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3724 cl->buf->last += sizeof(ngx_http_grpc_frame_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3725
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3726 f->length_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3727 f->length_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3728 f->length_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3729 f->type = NGX_HTTP_V2_SETTINGS_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3730 f->flags = NGX_HTTP_V2_ACK_FLAG;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3731 f->stream_id_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3732 f->stream_id_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3733 f->stream_id_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3734 f->stream_id_3 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3735
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3736 *ll = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3737
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3738 return NGX_OK;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3741
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3742 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3743 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
3744 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3745 ngx_chain_t *cl, **ll;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3746 ngx_http_grpc_frame_t *f;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3747
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3748 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3749 "grpc send ping ack");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3750
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3751 for (cl = ctx->out, ll = &ctx->out; cl; cl = cl->next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3752 ll = &cl->next;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3755 cl = ngx_http_grpc_get_buf(r, ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3756 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3757 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3760 f = (ngx_http_grpc_frame_t *) cl->buf->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3761 cl->buf->last += sizeof(ngx_http_grpc_frame_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3762
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3763 f->length_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3764 f->length_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3765 f->length_2 = 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3766 f->type = NGX_HTTP_V2_PING_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3767 f->flags = NGX_HTTP_V2_ACK_FLAG;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3768 f->stream_id_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3769 f->stream_id_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3770 f->stream_id_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3771 f->stream_id_3 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3772
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3773 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
3774
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3775 *ll = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3776
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3777 return NGX_OK;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3781 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3782 ngx_http_grpc_send_window_update(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3783 ngx_http_grpc_ctx_t *ctx)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3784 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3785 size_t n;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3786 ngx_chain_t *cl, **ll;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3787 ngx_http_grpc_frame_t *f;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3788
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3789 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3790 "grpc send window update: %uz %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3791 ctx->connection->recv_window, ctx->recv_window);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3792
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3793 for (cl = ctx->out, ll = &ctx->out; cl; cl = cl->next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3794 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3795 }
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 cl = ngx_http_grpc_get_buf(r, ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3798 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3799 return NGX_ERROR;
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 f = (ngx_http_grpc_frame_t *) cl->buf->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3803 cl->buf->last += sizeof(ngx_http_grpc_frame_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3804
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3805 f->length_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3806 f->length_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3807 f->length_2 = 4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3808 f->type = NGX_HTTP_V2_WINDOW_UPDATE_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3809 f->flags = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3810 f->stream_id_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3811 f->stream_id_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3812 f->stream_id_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3813 f->stream_id_3 = 0;
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 n = NGX_HTTP_V2_MAX_WINDOW - ctx->connection->recv_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3816 ctx->connection->recv_window = NGX_HTTP_V2_MAX_WINDOW;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3817
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3818 *cl->buf->last++ = (u_char) ((n >> 24) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3819 *cl->buf->last++ = (u_char) ((n >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3820 *cl->buf->last++ = (u_char) ((n >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3821 *cl->buf->last++ = (u_char) (n & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3822
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3823 f = (ngx_http_grpc_frame_t *) cl->buf->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3824 cl->buf->last += sizeof(ngx_http_grpc_frame_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3825
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3826 f->length_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3827 f->length_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3828 f->length_2 = 4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3829 f->type = NGX_HTTP_V2_WINDOW_UPDATE_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3830 f->flags = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3831 f->stream_id_0 = (u_char) ((ctx->id >> 24) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3832 f->stream_id_1 = (u_char) ((ctx->id >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3833 f->stream_id_2 = (u_char) ((ctx->id >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3834 f->stream_id_3 = (u_char) (ctx->id & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3835
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3836 n = NGX_HTTP_V2_MAX_WINDOW - ctx->recv_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3837 ctx->recv_window = NGX_HTTP_V2_MAX_WINDOW;
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 *cl->buf->last++ = (u_char) ((n >> 24) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3840 *cl->buf->last++ = (u_char) ((n >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3841 *cl->buf->last++ = (u_char) ((n >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3842 *cl->buf->last++ = (u_char) (n & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3843
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3844 *ll = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3845
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3846 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3847 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3848
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3849
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3850 static ngx_chain_t *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3851 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
3852 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3853 ngx_buf_t *b;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3854 ngx_chain_t *cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3855
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3856 cl = ngx_chain_get_free_buf(r->pool, &ctx->free);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3857 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3858 return NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3859 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3860
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3861 b = cl->buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3862
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3863 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
3864 b->temporary = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3865 b->flush = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3866
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3867 if (b->start == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3868
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3869 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3870 * each buffer is large enough to hold two window update
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3871 * frames in a row
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3872 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3873
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3874 b->start = ngx_palloc(r->pool, 2 * sizeof(ngx_http_grpc_frame_t) + 8);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3875 if (b->start == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3876 return NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3877 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3878
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3879 b->pos = b->start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3880 b->last = b->start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3881
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3882 b->end = b->start + 2 * sizeof(ngx_http_grpc_frame_t) + 8;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3885 return cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3886 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3887
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3888
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3889 static ngx_http_grpc_ctx_t *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3890 ngx_http_grpc_get_ctx(ngx_http_request_t *r)
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 ngx_http_grpc_ctx_t *ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3893 ngx_http_upstream_t *u;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3894
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3895 ctx = ngx_http_get_module_ctx(r, ngx_http_grpc_module);
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->connection == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3898 u = r->upstream;
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 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
3901 return NULL;
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 }
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 return ctx;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3908
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3909 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3910 ngx_http_grpc_get_connection_data(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3911 ngx_http_grpc_ctx_t *ctx, ngx_peer_connection_t *pc)
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_connection_t *c;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3914 ngx_pool_cleanup_t *cln;
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 c = pc->connection;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3917
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3918 if (pc->cached) {
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 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3921 * for cached connections, connection data can be found
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3922 * in the cleanup handler
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 for (cln = c->pool->cleanup; cln; cln = cln->next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3926 if (cln->handler == ngx_http_grpc_cleanup) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3927 ctx->connection = cln->data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3928 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3929 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3930 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3931
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3932 if (ctx->connection == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3933 ngx_log_error(NGX_LOG_ERR, c->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3934 "no connection data found for "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3935 "keepalive http2 connection");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3936 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3939 ctx->send_window = ctx->connection->init_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3940 ctx->recv_window = NGX_HTTP_V2_MAX_WINDOW;
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 ctx->connection->last_stream_id += 2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3943 ctx->id = ctx->connection->last_stream_id;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3944
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3945 return NGX_OK;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3948 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
3949 if (cln == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3950 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3951 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3952
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3953 cln->handler = ngx_http_grpc_cleanup;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3954 ctx->connection = cln->data;
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 ctx->connection->init_window = NGX_HTTP_V2_DEFAULT_WINDOW;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3957 ctx->connection->send_window = NGX_HTTP_V2_DEFAULT_WINDOW;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3958 ctx->connection->recv_window = NGX_HTTP_V2_MAX_WINDOW;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3959
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3960 ctx->send_window = NGX_HTTP_V2_DEFAULT_WINDOW;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3961 ctx->recv_window = NGX_HTTP_V2_MAX_WINDOW;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3962
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3963 ctx->id = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3964 ctx->connection->last_stream_id = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3965
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3966 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3967 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3968
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3969
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3970 static void
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3971 ngx_http_grpc_cleanup(void *data)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3972 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3973 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3974 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3975 "grpc cleanup");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3976 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3977 return;
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
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 static void
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3982 ngx_http_grpc_abort_request(ngx_http_request_t *r)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3983 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3984 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3985 "abort grpc request");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3986 return;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3987 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3988
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3989
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3990 static void
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3991 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
3992 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3993 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3994 "finalize grpc request");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3995 return;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3996 }
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 static void *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4000 ngx_http_grpc_create_loc_conf(ngx_conf_t *cf)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4001 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4002 ngx_http_grpc_loc_conf_t *conf;
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 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
4005 if (conf == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4006 return NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4007 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4008
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4009 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4010 * set by ngx_pcalloc():
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4011 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4012 * conf->upstream.ignore_headers = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4013 * conf->upstream.next_upstream = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4014 * conf->upstream.hide_headers_hash = { NULL, 0 };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4015 * conf->upstream.ssl_name = NULL;
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 * conf->headers_source = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4018 * conf->headers.lengths = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4019 * conf->headers.values = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4020 * conf->headers.hash = { NULL, 0 };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4021 * conf->host = { 0, NULL };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4022 * conf->host_set = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4023 * conf->ssl = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4024 * conf->ssl_protocols = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4025 * conf->ssl_ciphers = { 0, NULL };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4026 * conf->ssl_trusted_certificate = { 0, NULL };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4027 * conf->ssl_crl = { 0, NULL };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4028 * conf->ssl_certificate = { 0, NULL };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4029 * conf->ssl_certificate_key = { 0, NULL };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4030 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4031
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4032 conf->upstream.local = NGX_CONF_UNSET_PTR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4033 conf->upstream.next_upstream_tries = NGX_CONF_UNSET_UINT;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4034 conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4035 conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4036 conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4037 conf->upstream.next_upstream_timeout = NGX_CONF_UNSET_MSEC;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4038
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4039 conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE;
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 conf->upstream.hide_headers = NGX_CONF_UNSET_PTR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4042 conf->upstream.pass_headers = NGX_CONF_UNSET_PTR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4043
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4044 conf->upstream.intercept_errors = NGX_CONF_UNSET;
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 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4047 conf->upstream.ssl_session_reuse = NGX_CONF_UNSET;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4048 conf->upstream.ssl_server_name = NGX_CONF_UNSET;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4049 conf->upstream.ssl_verify = NGX_CONF_UNSET;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4050 conf->ssl_verify_depth = NGX_CONF_UNSET_UINT;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4051 conf->ssl_passwords = NGX_CONF_UNSET_PTR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4052 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4053
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4054 /* the hardcoded values */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4055 conf->upstream.cyclic_temp_file = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4056 conf->upstream.buffering = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4057 conf->upstream.ignore_client_abort = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4058 conf->upstream.send_lowat = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4059 conf->upstream.bufs.num = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4060 conf->upstream.busy_buffers_size = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4061 conf->upstream.max_temp_file_size = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4062 conf->upstream.temp_file_write_size = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4063 conf->upstream.pass_request_headers = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4064 conf->upstream.pass_request_body = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4065 conf->upstream.force_ranges = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4066 conf->upstream.pass_trailers = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4067 conf->upstream.preserve_output = 1;
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 ngx_str_set(&conf->upstream.module, "grpc");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4070
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4071 return conf;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4074
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4075 static char *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4076 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
4077 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4078 ngx_http_grpc_loc_conf_t *prev = parent;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4079 ngx_http_grpc_loc_conf_t *conf = child;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4080
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4081 ngx_int_t rc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4082 ngx_hash_init_t hash;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4083 ngx_http_core_loc_conf_t *clcf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4084
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4085 ngx_conf_merge_ptr_value(conf->upstream.local,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4086 prev->upstream.local, NULL);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4087
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4088 ngx_conf_merge_uint_value(conf->upstream.next_upstream_tries,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4089 prev->upstream.next_upstream_tries, 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4090
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4091 ngx_conf_merge_msec_value(conf->upstream.connect_timeout,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4092 prev->upstream.connect_timeout, 60000);
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 ngx_conf_merge_msec_value(conf->upstream.send_timeout,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4095 prev->upstream.send_timeout, 60000);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4096
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4097 ngx_conf_merge_msec_value(conf->upstream.read_timeout,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4098 prev->upstream.read_timeout, 60000);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4099
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4100 ngx_conf_merge_msec_value(conf->upstream.next_upstream_timeout,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4101 prev->upstream.next_upstream_timeout, 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4102
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4103 ngx_conf_merge_size_value(conf->upstream.buffer_size,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4104 prev->upstream.buffer_size,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4105 (size_t) ngx_pagesize);
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 ngx_conf_merge_bitmask_value(conf->upstream.ignore_headers,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4108 prev->upstream.ignore_headers,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4109 NGX_CONF_BITMASK_SET);
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 ngx_conf_merge_bitmask_value(conf->upstream.next_upstream,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4112 prev->upstream.next_upstream,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4113 (NGX_CONF_BITMASK_SET
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4114 |NGX_HTTP_UPSTREAM_FT_ERROR
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4115 |NGX_HTTP_UPSTREAM_FT_TIMEOUT));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4116
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4117 if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4118 conf->upstream.next_upstream = NGX_CONF_BITMASK_SET
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4119 |NGX_HTTP_UPSTREAM_FT_OFF;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4120 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4121
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4122 ngx_conf_merge_value(conf->upstream.intercept_errors,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4123 prev->upstream.intercept_errors, 0);
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 (NGX_HTTP_SSL)
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 ngx_conf_merge_value(conf->upstream.ssl_session_reuse,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4128 prev->upstream.ssl_session_reuse, 1);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4129
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4130 ngx_conf_merge_bitmask_value(conf->ssl_protocols, prev->ssl_protocols,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4131 (NGX_CONF_BITMASK_SET|NGX_SSL_TLSv1
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4132 |NGX_SSL_TLSv1_1|NGX_SSL_TLSv1_2));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4133
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4134 ngx_conf_merge_str_value(conf->ssl_ciphers, prev->ssl_ciphers,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4135 "DEFAULT");
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 if (conf->upstream.ssl_name == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4138 conf->upstream.ssl_name = prev->upstream.ssl_name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4139 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4140
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4141 ngx_conf_merge_value(conf->upstream.ssl_server_name,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4142 prev->upstream.ssl_server_name, 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4143 ngx_conf_merge_value(conf->upstream.ssl_verify,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4144 prev->upstream.ssl_verify, 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4145 ngx_conf_merge_uint_value(conf->ssl_verify_depth,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4146 prev->ssl_verify_depth, 1);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4147 ngx_conf_merge_str_value(conf->ssl_trusted_certificate,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4148 prev->ssl_trusted_certificate, "");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4149 ngx_conf_merge_str_value(conf->ssl_crl, prev->ssl_crl, "");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4150
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4151 ngx_conf_merge_str_value(conf->ssl_certificate,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4152 prev->ssl_certificate, "");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4153 ngx_conf_merge_str_value(conf->ssl_certificate_key,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4154 prev->ssl_certificate_key, "");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4155 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
4156
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4157 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
4158 return NGX_CONF_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4161 #endif
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 hash.max_size = 512;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4164 hash.bucket_size = ngx_align(64, ngx_cacheline_size);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4165 hash.name = "grpc_headers_hash";
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 if (ngx_http_upstream_hide_headers_hash(cf, &conf->upstream,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4168 &prev->upstream, ngx_http_grpc_hide_headers, &hash)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4169 != NGX_OK)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4170 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4171 return NGX_CONF_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4174 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
4175
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4176 if (clcf->noname && conf->upstream.upstream == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4177 conf->upstream.upstream = prev->upstream.upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4178 conf->host = prev->host;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4179 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4180 conf->upstream.ssl = prev->upstream.ssl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4181 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4182 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4183
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4184 if (clcf->lmt_excpt && clcf->handler == NULL && conf->upstream.upstream) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4185 clcf->handler = ngx_http_grpc_handler;
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 if (conf->headers_source == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4189 conf->headers = prev->headers;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4190 conf->headers_source = prev->headers_source;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4191 conf->host_set = prev->host_set;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4192 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4193
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4194 rc = ngx_http_grpc_init_headers(cf, conf, &conf->headers,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4195 ngx_http_grpc_headers);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4196 if (rc != NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4197 return NGX_CONF_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4198 }
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 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4201 * special handling to preserve conf->headers in the "http" section
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4202 * to inherit it to all servers
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 if (prev->headers.hash.buckets == NULL
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4206 && conf->headers_source == prev->headers_source)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4207 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4208 prev->headers = conf->headers;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4209 prev->host_set = conf->host_set;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4210 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4211
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4212 return NGX_CONF_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4213 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4214
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4215
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4216 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4217 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
4218 ngx_http_grpc_headers_t *headers, ngx_keyval_t *default_headers)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4219 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4220 u_char *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4221 size_t size;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4222 uintptr_t *code;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4223 ngx_uint_t i;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4224 ngx_array_t headers_names, headers_merged;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4225 ngx_keyval_t *src, *s, *h;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4226 ngx_hash_key_t *hk;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4227 ngx_hash_init_t hash;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4228 ngx_http_script_compile_t sc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4229 ngx_http_script_copy_code_t *copy;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4230
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4231 if (headers->hash.buckets) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4232 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4233 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4234
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4235 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
4236 != NGX_OK)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4237 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4238 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4239 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4240
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4241 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
4242 != NGX_OK)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4243 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4244 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4245 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4246
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4247 headers->lengths = ngx_array_create(cf->pool, 64, 1);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4248 if (headers->lengths == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4249 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4250 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4251
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4252 headers->values = ngx_array_create(cf->pool, 512, 1);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4253 if (headers->values == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4254 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4255 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4256
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4257 if (conf->headers_source) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4258
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4259 src = conf->headers_source->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4260 for (i = 0; i < conf->headers_source->nelts; i++) {
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 if (src[i].key.len == 4
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4263 && ngx_strncasecmp(src[i].key.data, (u_char *) "Host", 4) == 0)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4264 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4265 conf->host_set = 1;
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 s = ngx_array_push(&headers_merged);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4269 if (s == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4270 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4271 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4272
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4273 *s = src[i];
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 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4276
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4277 h = default_headers;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4278
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4279 while (h->key.len) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4280
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4281 src = headers_merged.elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4282 for (i = 0; i < headers_merged.nelts; i++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4283 if (ngx_strcasecmp(h->key.data, src[i].key.data) == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4284 goto next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4285 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4286 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4287
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4288 s = ngx_array_push(&headers_merged);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4289 if (s == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4290 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4291 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4292
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4293 *s = *h;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4294
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4295 next:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4296
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4297 h++;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4298 }
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4301 src = headers_merged.elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4302 for (i = 0; i < headers_merged.nelts; i++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4303
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4304 hk = ngx_array_push(&headers_names);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4305 if (hk == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4306 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4307 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4308
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4309 hk->key = src[i].key;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4310 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
4311 hk->value = (void *) 1;
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 if (src[i].value.len == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4314 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4315 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4316
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4317 copy = ngx_array_push_n(headers->lengths,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4318 sizeof(ngx_http_script_copy_code_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4319 if (copy == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4320 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4321 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4322
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4323 copy->code = (ngx_http_script_code_pt) ngx_http_script_copy_len_code;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4324 copy->len = src[i].key.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4325
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4326 size = (sizeof(ngx_http_script_copy_code_t)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4327 + src[i].key.len + sizeof(uintptr_t) - 1)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4328 & ~(sizeof(uintptr_t) - 1);
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 copy = ngx_array_push_n(headers->values, size);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4331 if (copy == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4332 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4335 copy->code = ngx_http_script_copy_code;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4336 copy->len = src[i].key.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4337
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4338 p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4339 ngx_memcpy(p, src[i].key.data, src[i].key.len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4340
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4341 ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4342
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4343 sc.cf = cf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4344 sc.source = &src[i].value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4345 sc.flushes = &headers->flushes;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4346 sc.lengths = &headers->lengths;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4347 sc.values = &headers->values;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4348
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4349 if (ngx_http_script_compile(&sc) != NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4350 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4351 }
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 code = ngx_array_push_n(headers->lengths, sizeof(uintptr_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4354 if (code == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4355 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4356 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4357
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4358 *code = (uintptr_t) NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4359
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4360 code = ngx_array_push_n(headers->values, sizeof(uintptr_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4361 if (code == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4362 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4363 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4364
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4365 *code = (uintptr_t) NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4366 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4367
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4368 code = ngx_array_push_n(headers->lengths, sizeof(uintptr_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4369 if (code == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4370 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4371 }
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 *code = (uintptr_t) NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4374
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4375
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4376 hash.hash = &headers->hash;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4377 hash.key = ngx_hash_key_lc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4378 hash.max_size = 512;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4379 hash.bucket_size = 64;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4380 hash.name = "grpc_headers_hash";
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4381 hash.pool = cf->pool;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4382 hash.temp_pool = NULL;
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 return ngx_hash_init(&hash, headers_names.elts, headers_names.nelts);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4385 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4386
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4387
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4388 static char *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4389 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
4390 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4391 ngx_http_grpc_loc_conf_t *glcf = conf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4392
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4393 size_t add;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4394 ngx_str_t *value, *url;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4395 ngx_url_t u;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4396 ngx_http_core_loc_conf_t *clcf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4397
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4398 if (glcf->upstream.upstream) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4399 return "is duplicate";
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4400 }
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 value = cf->args->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4403 url = &value[1];
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4404
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4405 if (ngx_strncasecmp(url->data, (u_char *) "grpc://", 7) == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4406 add = 7;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4407
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4408 } else if (ngx_strncasecmp(url->data, (u_char *) "grpcs://", 8) == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4409
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4410 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4411 glcf->ssl = 1;
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 add = 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4414 #else
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4415 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4416 "grpcs protocol requires SSL support");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4417 return NGX_CONF_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4418 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4419
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4420 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4421 add = 0;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4424 ngx_memzero(&u, sizeof(ngx_url_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4425
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4426 u.url.len = url->len - add;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4427 u.url.data = url->data + add;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4428 u.no_resolve = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4429
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4430 glcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4431 if (glcf->upstream.upstream == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4432 return NGX_CONF_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4433 }
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 if (u.family != AF_UNIX) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4436
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4437 if (u.no_port) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4438 glcf->host = u.host;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4439
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4440 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4441 glcf->host.len = u.host.len + 1 + u.port_text.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4442 glcf->host.data = u.host.data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4443 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4444
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4445 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4446 ngx_str_set(&glcf->host, "localhost");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4447 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4448
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4449 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
4450
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4451 clcf->handler = ngx_http_grpc_handler;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4452
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4453 if (clcf->name.data[clcf->name.len - 1] == '/') {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4454 clcf->auto_redirect = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4455 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4456
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4457 return NGX_CONF_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4458 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4459
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4460
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4461 #if (NGX_HTTP_SSL)
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 static char *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4464 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
4465 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4466 ngx_http_grpc_loc_conf_t *glcf = conf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4467
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4468 ngx_str_t *value;
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 if (glcf->ssl_passwords != NGX_CONF_UNSET_PTR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4471 return "is duplicate";
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4472 }
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 value = cf->args->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4475
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4476 glcf->ssl_passwords = ngx_ssl_read_password_file(cf, &value[1]);
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 if (glcf->ssl_passwords == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4479 return NGX_CONF_ERROR;
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_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
4488 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4489 ngx_pool_cleanup_t *cln;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4490
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4491 glcf->upstream.ssl = ngx_pcalloc(cf->pool, sizeof(ngx_ssl_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4492 if (glcf->upstream.ssl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4493 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4494 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4495
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4496 glcf->upstream.ssl->log = cf->log;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4497
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4498 if (ngx_ssl_create(glcf->upstream.ssl, glcf->ssl_protocols, NULL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4499 != NGX_OK)
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 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4502 }
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 cln = ngx_pool_cleanup_add(cf->pool, 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4505 if (cln == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4506 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4509 cln->handler = ngx_ssl_cleanup_ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4510 cln->data = glcf->upstream.ssl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4511
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4512 if (glcf->ssl_certificate.len) {
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 if (glcf->ssl_certificate_key.len == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4515 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4516 "no \"grpc_ssl_certificate_key\" is defined "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4517 "for certificate \"%V\"", &glcf->ssl_certificate);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4518 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4519 }
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 if (ngx_ssl_certificate(cf, glcf->upstream.ssl, &glcf->ssl_certificate,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4522 &glcf->ssl_certificate_key, glcf->ssl_passwords)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4523 != NGX_OK)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4524 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4525 return NGX_ERROR;
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 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4528
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4529 if (ngx_ssl_ciphers(cf, glcf->upstream.ssl, &glcf->ssl_ciphers, 0)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4530 != NGX_OK)
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 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4533 }
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 if (glcf->upstream.ssl_verify) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4536 if (glcf->ssl_trusted_certificate.len == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4537 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4538 "no grpc_ssl_trusted_certificate for grpc_ssl_verify");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4539 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4540 }
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 if (ngx_ssl_trusted_certificate(cf, glcf->upstream.ssl,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4543 &glcf->ssl_trusted_certificate,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4544 glcf->ssl_verify_depth)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4545 != NGX_OK)
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 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4550 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
4551 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4552 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4553 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4554
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4555 #ifdef TLSEXT_TYPE_application_layer_protocol_negotiation
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 if (SSL_CTX_set_alpn_protos(glcf->upstream.ssl->ctx,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4558 (u_char *) "\x02h2", 3)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4559 != 0)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4560 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4561 ngx_ssl_error(NGX_LOG_EMERG, cf->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4562 "SSL_CTX_set_alpn_protos() failed");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4563 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4566 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4567
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4568 return NGX_OK;
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 #endif