annotate src/http/modules/ngx_http_grpc_module.c @ 7305:6cfd45d4c754

gRPC: clearing buffers in ngx_http_grpc_get_buf(). We copy input buffers to our buffers, so various flags might be unexpectedly set in buffers returned by ngx_chain_get_free_buf(). In particular, the b->in_file flag might be set when the body was written to a file in a different context. With sendfile enabled this in turn might result in protocol corruption if such a buffer was reused for a control frame. Make sure to clear buffers and set only fields we really need to be set.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 02 Jul 2018 19:02:08 +0300
parents 9e25a5380a21
children 696df3ac27ac
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
7234
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
179 static ngx_int_t ngx_http_grpc_internal_trailers_variable(
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
180 ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data);
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
181
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
182 static ngx_int_t ngx_http_grpc_add_variables(ngx_conf_t *cf);
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
183 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
184 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
185 void *parent, void *child);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
186 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
187 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
188 ngx_keyval_t *default_headers);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
189
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
190 static 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
191 void *conf);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
192
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
193 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
194 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
195 ngx_command_t *cmd, void *conf);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
196 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
197 ngx_http_grpc_loc_conf_t *glcf);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
198 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
199
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
200
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
201 static ngx_conf_bitmask_t ngx_http_grpc_next_upstream_masks[] = {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
202 { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
203 { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
204 { ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
205 { ngx_string("non_idempotent"), NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
206 { ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
207 { ngx_string("http_502"), NGX_HTTP_UPSTREAM_FT_HTTP_502 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
208 { ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
209 { ngx_string("http_504"), NGX_HTTP_UPSTREAM_FT_HTTP_504 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
210 { ngx_string("http_403"), NGX_HTTP_UPSTREAM_FT_HTTP_403 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
211 { ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
212 { ngx_string("http_429"), NGX_HTTP_UPSTREAM_FT_HTTP_429 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
213 { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
214 { ngx_null_string, 0 }
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
217
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
218 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
219
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
220 static ngx_conf_bitmask_t ngx_http_grpc_ssl_protocols[] = {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
221 { ngx_string("SSLv2"), NGX_SSL_SSLv2 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
222 { ngx_string("SSLv3"), NGX_SSL_SSLv3 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
223 { ngx_string("TLSv1"), NGX_SSL_TLSv1 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
224 { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
225 { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
226 { ngx_string("TLSv1.3"), NGX_SSL_TLSv1_3 },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
227 { ngx_null_string, 0 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
228 };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
229
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
230 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
231
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
232
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
233 static ngx_command_t ngx_http_grpc_commands[] = {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
234
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
235 { ngx_string("grpc_pass"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
236 NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
237 ngx_http_grpc_pass,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
238 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
239 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
240 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
241
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
242 { ngx_string("grpc_bind"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
243 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
244 ngx_http_upstream_bind_set_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
245 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
246 offsetof(ngx_http_grpc_loc_conf_t, upstream.local),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
247 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
248
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
249 { ngx_string("grpc_connect_timeout"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
250 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
251 ngx_conf_set_msec_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
252 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
253 offsetof(ngx_http_grpc_loc_conf_t, upstream.connect_timeout),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
254 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
255
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
256 { ngx_string("grpc_send_timeout"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
257 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
258 ngx_conf_set_msec_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
259 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
260 offsetof(ngx_http_grpc_loc_conf_t, upstream.send_timeout),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
261 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
262
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
263 { ngx_string("grpc_intercept_errors"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
264 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
265 ngx_conf_set_flag_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
266 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
267 offsetof(ngx_http_grpc_loc_conf_t, upstream.intercept_errors),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
268 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
269
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
270 { ngx_string("grpc_buffer_size"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
271 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
272 ngx_conf_set_size_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
273 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
274 offsetof(ngx_http_grpc_loc_conf_t, upstream.buffer_size),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
275 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
276
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
277 { ngx_string("grpc_read_timeout"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
278 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
279 ngx_conf_set_msec_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
280 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
281 offsetof(ngx_http_grpc_loc_conf_t, upstream.read_timeout),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
282 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
283
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
284 { ngx_string("grpc_next_upstream"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
285 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
286 ngx_conf_set_bitmask_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
287 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
288 offsetof(ngx_http_grpc_loc_conf_t, upstream.next_upstream),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
289 &ngx_http_grpc_next_upstream_masks },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
290
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
291 { ngx_string("grpc_next_upstream_tries"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
292 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
293 ngx_conf_set_num_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
294 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
295 offsetof(ngx_http_grpc_loc_conf_t, upstream.next_upstream_tries),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
296 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
297
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
298 { ngx_string("grpc_next_upstream_timeout"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
299 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
300 ngx_conf_set_msec_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
301 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
302 offsetof(ngx_http_grpc_loc_conf_t, upstream.next_upstream_timeout),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
303 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
304
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
305 { ngx_string("grpc_set_header"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
306 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
307 ngx_conf_set_keyval_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
308 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
309 offsetof(ngx_http_grpc_loc_conf_t, headers_source),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
310 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
311
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
312 { ngx_string("grpc_pass_header"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
313 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
314 ngx_conf_set_str_array_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
315 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
316 offsetof(ngx_http_grpc_loc_conf_t, upstream.pass_headers),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
317 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
318
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
319 { ngx_string("grpc_hide_header"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
320 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
321 ngx_conf_set_str_array_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
322 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
323 offsetof(ngx_http_grpc_loc_conf_t, upstream.hide_headers),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
324 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
325
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
326 { ngx_string("grpc_ignore_headers"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
327 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
328 ngx_conf_set_bitmask_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
329 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
330 offsetof(ngx_http_grpc_loc_conf_t, upstream.ignore_headers),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
331 &ngx_http_upstream_ignore_headers_masks },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
332
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
333 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
334
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
335 { ngx_string("grpc_ssl_session_reuse"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
336 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
337 ngx_conf_set_flag_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
338 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
339 offsetof(ngx_http_grpc_loc_conf_t, upstream.ssl_session_reuse),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
340 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
341
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
342 { ngx_string("grpc_ssl_protocols"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
343 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
344 ngx_conf_set_bitmask_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
345 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
346 offsetof(ngx_http_grpc_loc_conf_t, ssl_protocols),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
347 &ngx_http_grpc_ssl_protocols },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
348
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
349 { ngx_string("grpc_ssl_ciphers"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
350 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
351 ngx_conf_set_str_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
352 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
353 offsetof(ngx_http_grpc_loc_conf_t, ssl_ciphers),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
354 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
355
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
356 { ngx_string("grpc_ssl_name"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
357 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
358 ngx_http_set_complex_value_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
359 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
360 offsetof(ngx_http_grpc_loc_conf_t, upstream.ssl_name),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
361 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
362
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
363 { ngx_string("grpc_ssl_server_name"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
364 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
365 ngx_conf_set_flag_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
366 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
367 offsetof(ngx_http_grpc_loc_conf_t, upstream.ssl_server_name),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
368 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
369
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
370 { ngx_string("grpc_ssl_verify"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
371 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
372 ngx_conf_set_flag_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
373 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
374 offsetof(ngx_http_grpc_loc_conf_t, upstream.ssl_verify),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
375 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
376
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
377 { ngx_string("grpc_ssl_verify_depth"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
378 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
379 ngx_conf_set_num_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
380 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
381 offsetof(ngx_http_grpc_loc_conf_t, ssl_verify_depth),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
382 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
383
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
384 { ngx_string("grpc_ssl_trusted_certificate"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
385 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
386 ngx_conf_set_str_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
387 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
388 offsetof(ngx_http_grpc_loc_conf_t, ssl_trusted_certificate),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
389 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
390
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
391 { ngx_string("grpc_ssl_crl"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
392 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
393 ngx_conf_set_str_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
394 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
395 offsetof(ngx_http_grpc_loc_conf_t, ssl_crl),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
396 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
397
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
398 { ngx_string("grpc_ssl_certificate"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
399 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
400 ngx_conf_set_str_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
401 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
402 offsetof(ngx_http_grpc_loc_conf_t, ssl_certificate),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
403 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
404
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
405 { ngx_string("grpc_ssl_certificate_key"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
406 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
407 ngx_conf_set_str_slot,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
408 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
409 offsetof(ngx_http_grpc_loc_conf_t, ssl_certificate_key),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
410 NULL },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
411
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
412 { ngx_string("grpc_ssl_password_file"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
413 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
414 ngx_http_grpc_ssl_password_file,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
415 NGX_HTTP_LOC_CONF_OFFSET,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
416 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
417 NULL },
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 #endif
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 ngx_null_command
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
422 };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
423
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
424
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
425 static ngx_http_module_t ngx_http_grpc_module_ctx = {
7234
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
426 ngx_http_grpc_add_variables, /* preconfiguration */
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
427 NULL, /* postconfiguration */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
428
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
429 NULL, /* create main configuration */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
430 NULL, /* init main configuration */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
431
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
432 NULL, /* create server configuration */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
433 NULL, /* merge server configuration */
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 ngx_http_grpc_create_loc_conf, /* create location configuration */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
436 ngx_http_grpc_merge_loc_conf /* merge location configuration */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
437 };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
438
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
439
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
440 ngx_module_t ngx_http_grpc_module = {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
441 NGX_MODULE_V1,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
442 &ngx_http_grpc_module_ctx, /* module context */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
443 ngx_http_grpc_commands, /* module directives */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
444 NGX_HTTP_MODULE, /* module type */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
445 NULL, /* init master */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
446 NULL, /* init module */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
447 NULL, /* init process */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
448 NULL, /* init thread */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
449 NULL, /* exit thread */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
450 NULL, /* exit process */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
451 NULL, /* exit master */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
452 NGX_MODULE_V1_PADDING
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
453 };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
454
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
455
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
456 static u_char ngx_http_grpc_connection_start[] =
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
457 "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
458
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
459 "\x00\x00\x12\x04\x00\x00\x00\x00\x00" /* settings frame */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
460 "\x00\x01\x00\x00\x00\x00" /* header table size */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
461 "\x00\x02\x00\x00\x00\x00" /* disable push */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
462 "\x00\x04\x7f\xff\xff\xff" /* initial window */
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 "\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
465 "\x7f\xff\x00\x00";
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
466
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
467
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
468 static ngx_keyval_t ngx_http_grpc_headers[] = {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
469 { ngx_string("Content-Length"), ngx_string("$content_length") },
7234
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
470 { ngx_string("TE"), ngx_string("$grpc_internal_trailers") },
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
471 { ngx_string("Host"), ngx_string("") },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
472 { ngx_string("Connection"), ngx_string("") },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
473 { ngx_string("Transfer-Encoding"), ngx_string("") },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
474 { ngx_string("Keep-Alive"), ngx_string("") },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
475 { ngx_string("Expect"), ngx_string("") },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
476 { ngx_string("Upgrade"), ngx_string("") },
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
477 { ngx_null_string, ngx_null_string }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
478 };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
479
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
480
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
481 static ngx_str_t ngx_http_grpc_hide_headers[] = {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
482 ngx_string("Date"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
483 ngx_string("Server"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
484 ngx_string("X-Accel-Expires"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
485 ngx_string("X-Accel-Redirect"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
486 ngx_string("X-Accel-Limit-Rate"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
487 ngx_string("X-Accel-Buffering"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
488 ngx_string("X-Accel-Charset"),
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
489 ngx_null_string
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
490 };
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
7234
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
493 static ngx_http_variable_t ngx_http_grpc_vars[] = {
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
494
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
495 { ngx_string("grpc_internal_trailers"), NULL,
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
496 ngx_http_grpc_internal_trailers_variable, 0,
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
497 NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 },
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
498
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
499 ngx_http_null_variable
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
500 };
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
501
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
502
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
503 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
504 ngx_http_grpc_handler(ngx_http_request_t *r)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
505 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
506 ngx_int_t rc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
507 ngx_http_upstream_t *u;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
508 ngx_http_grpc_ctx_t *ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
509 ngx_http_grpc_loc_conf_t *glcf;
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 if (ngx_http_upstream_create(r) != NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
512 return NGX_HTTP_INTERNAL_SERVER_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
515 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
516
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
517 u = r->upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
518
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
519 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
520 u->ssl = (glcf->upstream.ssl != NULL);
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 if (u->ssl) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
523 ngx_str_set(&u->schema, "grpcs://");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
524
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
525 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
526 ngx_str_set(&u->schema, "grpc://");
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 #else
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
529 ngx_str_set(&u->schema, "grpc://");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
530 #endif
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 u->output.tag = (ngx_buf_tag_t) &ngx_http_grpc_module;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
533
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
534 u->conf = &glcf->upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
535
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
536 u->create_request = ngx_http_grpc_create_request;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
537 u->reinit_request = ngx_http_grpc_reinit_request;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
538 u->process_header = ngx_http_grpc_process_header;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
539 u->abort_request = ngx_http_grpc_abort_request;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
540 u->finalize_request = ngx_http_grpc_finalize_request;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
541
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
542 ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_grpc_ctx_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
543 if (ctx == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
544 return NGX_HTTP_INTERNAL_SERVER_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
545 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
546
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
547 ctx->request = r;
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 ngx_http_set_ctx(r, ctx, ngx_http_grpc_module);
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 u->input_filter_init = ngx_http_grpc_filter_init;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
552 u->input_filter = ngx_http_grpc_filter;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
553 u->input_filter_ctx = ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
554
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
555 r->request_body_no_buffering = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
556
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
557 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
558
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
559 if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
560 return rc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
561 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
562
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
563 return NGX_DONE;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
564 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
565
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
566
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
567 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
568 ngx_http_grpc_create_request(ngx_http_request_t *r)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
569 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
570 u_char *p, *tmp, *key_tmp, *val_tmp, *headers_frame;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
571 size_t len, tmp_len, key_len, val_len, uri_len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
572 uintptr_t escape;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
573 ngx_buf_t *b;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
574 ngx_uint_t i, next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
575 ngx_chain_t *cl, *body;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
576 ngx_list_part_t *part;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
577 ngx_table_elt_t *header;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
578 ngx_http_upstream_t *u;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
579 ngx_http_grpc_frame_t *f;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
580 ngx_http_script_code_pt code;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
581 ngx_http_grpc_loc_conf_t *glcf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
582 ngx_http_script_engine_t e, le;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
583 ngx_http_script_len_code_pt lcode;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
584
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
585 u = r->upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
586
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
587 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
588
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
589 len = sizeof(ngx_http_grpc_connection_start) - 1
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
590 + sizeof(ngx_http_grpc_frame_t); /* headers frame */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
591
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
592 /* :method header */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
593
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
594 if (r->method == NGX_HTTP_GET || r->method == NGX_HTTP_POST) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
595 len += 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
596 tmp_len = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
597
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
598 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
599 len += 1 + NGX_HTTP_V2_INT_OCTETS + r->method_name.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
600 tmp_len = r->method_name.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
601 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
602
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
603 /* :scheme header */
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;
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 /* :path header */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
608
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
609 if (r->valid_unparsed_uri) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
610 escape = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
611 uri_len = r->unparsed_uri.len;
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 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
614 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
615 NGX_ESCAPE_URI);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
616 uri_len = r->uri.len + escape + sizeof("?") - 1 + r->args.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
617 }
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 len += 1 + NGX_HTTP_V2_INT_OCTETS + uri_len;
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 if (tmp_len < uri_len) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
622 tmp_len = uri_len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
623 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
624
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
625 /* :authority header */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
626
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
627 if (!glcf->host_set) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
628 len += 1 + NGX_HTTP_V2_INT_OCTETS + glcf->host.len;
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 if (tmp_len < glcf->host.len) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
631 tmp_len = glcf->host.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
632 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
633 }
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 /* other headers */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
636
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
637 ngx_http_script_flush_no_cacheable_variables(r, glcf->headers.flushes);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
638 ngx_memzero(&le, sizeof(ngx_http_script_engine_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 le.ip = glcf->headers.lengths->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
641 le.request = r;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
642 le.flushed = 1;
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 while (*(uintptr_t *) le.ip) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
645
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
646 lcode = *(ngx_http_script_len_code_pt *) le.ip;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
647 key_len = lcode(&le);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
648
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
649 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
650 lcode = *(ngx_http_script_len_code_pt *) le.ip;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
651 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
652 le.ip += sizeof(uintptr_t);
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 if (val_len == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
655 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
656 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
657
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
658 len += 1 + NGX_HTTP_V2_INT_OCTETS + key_len
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
659 + NGX_HTTP_V2_INT_OCTETS + val_len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
660
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
661 if (tmp_len < key_len) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
662 tmp_len = key_len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
663 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
664
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
665 if (tmp_len < val_len) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
666 tmp_len = val_len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
667 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
668 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
669
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
670 if (glcf->upstream.pass_request_headers) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
671 part = &r->headers_in.headers.part;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
672 header = part->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
673
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
674 for (i = 0; /* void */; i++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
675
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
676 if (i >= part->nelts) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
677 if (part->next == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
678 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
679 }
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 part = part->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
682 header = part->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
683 i = 0;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
686 if (ngx_hash_find(&glcf->headers.hash, header[i].hash,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
687 header[i].lowcase_key, header[i].key.len))
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 continue;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
692 len += 1 + NGX_HTTP_V2_INT_OCTETS + header[i].key.len
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
693 + NGX_HTTP_V2_INT_OCTETS + header[i].value.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
694
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
695 if (tmp_len < header[i].key.len) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
696 tmp_len = header[i].key.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
697 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
698
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
699 if (tmp_len < header[i].value.len) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
700 tmp_len = header[i].value.len;
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 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
703 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
704
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
705 /* continuation frames */
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 len += sizeof(ngx_http_grpc_frame_t)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
708 * (len / NGX_HTTP_V2_DEFAULT_FRAME_SIZE);
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
711 b = ngx_create_temp_buf(r->pool, len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
712 if (b == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
713 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
716 cl = ngx_alloc_chain_link(r->pool);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
717 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
718 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
721 cl->buf = b;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
722 cl->next = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
723
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
724 tmp = ngx_palloc(r->pool, tmp_len * 3);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
725 if (tmp == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
726 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
727 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
728
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
729 key_tmp = tmp + tmp_len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
730 val_tmp = tmp + 2 * tmp_len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
731
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
732 /* connection preface */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
733
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
734 b->last = ngx_copy(b->last, ngx_http_grpc_connection_start,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
735 sizeof(ngx_http_grpc_connection_start) - 1);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
736
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
737 /* headers frame */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
738
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
739 headers_frame = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
740
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
741 f = (ngx_http_grpc_frame_t *) b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
742 b->last += sizeof(ngx_http_grpc_frame_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
743
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
744 f->length_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
745 f->length_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
746 f->length_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
747 f->type = NGX_HTTP_V2_HEADERS_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
748 f->flags = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
749 f->stream_id_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
750 f->stream_id_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
751 f->stream_id_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
752 f->stream_id_3 = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
753
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
754 if (r->method == NGX_HTTP_GET) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
755 *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
756
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
757 ngx_log_debug0(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: GET\"");
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 } else if (r->method == NGX_HTTP_POST) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
761 *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
762
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
763 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
764 "grpc header: \":method: POST\"");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
765
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
766 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
767 *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
768 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
769 r->method_name.len, tmp);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
770
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
771 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
772 "grpc header: \":method: %V\"", &r->method_name);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
773 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
774
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
775 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
776 if (glcf->ssl) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
777 *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
778
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
779 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
780 "grpc header: \":scheme: https\"");
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 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
783 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
784 *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
785
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
786 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
787 "grpc header: \":scheme: http\"");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
788 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
789
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
790 if (r->valid_unparsed_uri) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
791
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
792 if (r->unparsed_uri.len == 1 && r->unparsed_uri.data[0] == '/') {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
793 *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
794
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
795 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
796 *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
797 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
798 r->unparsed_uri.len, tmp);
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 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
802 "grpc header: \":path: %V\"", &r->unparsed_uri);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
803
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
804 } else if (escape || r->args.len > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
805 p = val_tmp;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
806
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
807 if (escape) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
808 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
809 NGX_ESCAPE_URI);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
810
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
811 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
812 p = ngx_copy(p, r->uri.data, r->uri.len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
813 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
814
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
815 if (r->args.len > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
816 *p++ = '?';
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
817 p = ngx_copy(p, r->args.data, r->args.len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
818 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
819
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
820 *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
821 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
822
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
823 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
824 "grpc header: \":path: %*s\"", p - val_tmp, val_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 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
827 *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
828 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
829 r->uri.len, tmp);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
830
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
831 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
832 "grpc header: \":path: %V\"", &r->uri);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
833 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
834
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
835 if (!glcf->host_set) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
836 *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
837 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
838 glcf->host.len, tmp);
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 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
841 "grpc header: \":authority: %V\"", &glcf->host);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
842 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
843
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
844 ngx_memzero(&e, sizeof(ngx_http_script_engine_t));
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 e.ip = glcf->headers.values->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
847 e.request = r;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
848 e.flushed = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
849
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
850 le.ip = glcf->headers.lengths->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
851
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
852 while (*(uintptr_t *) le.ip) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
853
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
854 lcode = *(ngx_http_script_len_code_pt *) le.ip;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
855 key_len = lcode(&le);
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 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
858 lcode = *(ngx_http_script_len_code_pt *) le.ip;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
859 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
860 le.ip += sizeof(uintptr_t);
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 if (val_len == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
863 e.skip = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
864
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
865 while (*(uintptr_t *) e.ip) {
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 e.ip += sizeof(uintptr_t);
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.skip = 0;
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 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
874 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
875
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
876 *b->last++ = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
877
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
878 e.pos = key_tmp;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
879
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
880 code = *(ngx_http_script_code_pt *) e.ip;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
881 code((ngx_http_script_engine_t *) &e);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
882
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
883 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
884
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
885 e.pos = val_tmp;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
886
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
887 while (*(uintptr_t *) e.ip) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
888 code = *(ngx_http_script_code_pt *) e.ip;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
889 code((ngx_http_script_engine_t *) &e);
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 e.ip += sizeof(uintptr_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
892
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
893 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
894
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
895 #if (NGX_DEBUG)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
896 if (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
897 ngx_strlow(key_tmp, key_tmp, key_len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
898
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
899 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
900 "grpc header: \"%*s: %*s\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
901 key_len, key_tmp, val_len, val_tmp);
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 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
904 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
905
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
906 if (glcf->upstream.pass_request_headers) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
907 part = &r->headers_in.headers.part;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
908 header = part->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
909
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
910 for (i = 0; /* void */; i++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
911
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
912 if (i >= part->nelts) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
913 if (part->next == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
914 break;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
917 part = part->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
918 header = part->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
919 i = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
920 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
921
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
922 if (ngx_hash_find(&glcf->headers.hash, header[i].hash,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
923 header[i].lowcase_key, header[i].key.len))
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
924 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
925 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
926 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
927
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
928 *b->last++ = 0;
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 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
931 header[i].key.len, tmp);
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 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
934 header[i].value.len, tmp);
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 #if (NGX_DEBUG)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
937 if (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
938 ngx_strlow(tmp, header[i].key.data, header[i].key.len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
939
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
940 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
941 "grpc header: \"%*s: %V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
942 header[i].key.len, tmp, &header[i].value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
943 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
944 #endif
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 }
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 /* update headers frame length */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
949
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
950 len = b->last - headers_frame - sizeof(ngx_http_grpc_frame_t);
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 if (len > NGX_HTTP_V2_DEFAULT_FRAME_SIZE) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
953 len = NGX_HTTP_V2_DEFAULT_FRAME_SIZE;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
954 next = 1;
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 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
957 next = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
958 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
959
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
960 f = (ngx_http_grpc_frame_t *) headers_frame;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
961
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
962 f->length_0 = (u_char) ((len >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
963 f->length_1 = (u_char) ((len >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
964 f->length_2 = (u_char) (len & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
965
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
966 /* create additional continuation frames */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
967
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
968 p = headers_frame;
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 while (next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
971 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
972 len = b->last - p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
973
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
974 ngx_memmove(p + sizeof(ngx_http_grpc_frame_t), p, len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
975 b->last += sizeof(ngx_http_grpc_frame_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
976
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
977 if (len > NGX_HTTP_V2_DEFAULT_FRAME_SIZE) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
978 len = NGX_HTTP_V2_DEFAULT_FRAME_SIZE;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
979 next = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
980
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
981 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
982 next = 0;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
985 f = (ngx_http_grpc_frame_t *) p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
986
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
987 f->length_0 = (u_char) ((len >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
988 f->length_1 = (u_char) ((len >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
989 f->length_2 = (u_char) (len & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
990 f->type = NGX_HTTP_V2_CONTINUATION_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
991 f->flags = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
992 f->stream_id_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
993 f->stream_id_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
994 f->stream_id_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
995 f->stream_id_3 = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
996 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
997
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
998 f->flags |= NGX_HTTP_V2_END_HEADERS_FLAG;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
999
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1000 #if (NGX_DEBUG)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1001 if (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1002 u_char buf[512];
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1003 size_t n, m;
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 n = ngx_min(b->last - b->pos, 256);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1006 m = ngx_hex_dump(buf, b->pos, n) - buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1007
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1008 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1009 "grpc header: %*s%s, len: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1010 m, buf, b->last - b->pos > 256 ? "..." : "",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1011 b->last - b->pos);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1012 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1013 #endif
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 if (r->request_body_no_buffering) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1016
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1017 u->request_bufs = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1018
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1019 } else {
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 body = u->request_bufs;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1022 u->request_bufs = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1023
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1024 if (body == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1025 f = (ngx_http_grpc_frame_t *) headers_frame;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1026 f->flags |= NGX_HTTP_V2_END_STREAM_FLAG;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1029 while (body) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1030 b = ngx_alloc_buf(r->pool);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1031 if (b == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1032 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1035 ngx_memcpy(b, body->buf, sizeof(ngx_buf_t));
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 cl->next = ngx_alloc_chain_link(r->pool);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1038 if (cl->next == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1039 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1040 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1041
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1042 cl = cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1043 cl->buf = b;
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 body = body->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1046 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1047
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1048 b->last_buf = 1;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1051 u->output.output_filter = ngx_http_grpc_body_output_filter;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1052 u->output.filter_ctx = r;
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 b->flush = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1055 cl->next = NULL;
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 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1058 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1059
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1060
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1061 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1062 ngx_http_grpc_reinit_request(ngx_http_request_t *r)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1063 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1064 ngx_http_grpc_ctx_t *ctx;
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 ctx = ngx_http_get_module_ctx(r, ngx_http_grpc_module);
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 if (ctx == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1069 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1070 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1071
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1072 ctx->state = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1073 ctx->header_sent = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1074 ctx->output_closed = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1075 ctx->parsing_headers = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1076 ctx->end_stream = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1077 ctx->status = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1078 ctx->connection = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1079
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1080 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1081 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1082
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1083
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1084 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1085 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
1086 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1087 ngx_http_request_t *r = data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1088
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1089 off_t file_pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1090 u_char *p, *pos, *start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1091 size_t len, limit;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1092 ngx_buf_t *b;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1093 ngx_int_t rc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1094 ngx_uint_t next, last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1095 ngx_chain_t *cl, *out, **ll;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1096 ngx_http_grpc_ctx_t *ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1097 ngx_http_grpc_frame_t *f;
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 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1100 "grpc output filter");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1101
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1102 ctx = ngx_http_grpc_get_ctx(r);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1103
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1104 if (ctx == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1105 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1106 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1107
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1108 if (in) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1109 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
1110 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1111 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1112 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1113
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1114 out = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1115 ll = &out;
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 if (!ctx->header_sent) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1118 /* first buffer contains headers */
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 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1121 "grpc output header");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1122
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1123 ctx->header_sent = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1124
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1125 if (ctx->id != 1) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1126 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1127 * keepalive connection: skip connection preface,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1128 * update stream identifiers
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1129 */
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 b = ctx->in->buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1132 b->pos += sizeof(ngx_http_grpc_connection_start) - 1;
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 p = b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1135
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1136 while (p < b->last) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1137 f = (ngx_http_grpc_frame_t *) p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1138 p += sizeof(ngx_http_grpc_frame_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1139
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1140 f->stream_id_0 = (u_char) ((ctx->id >> 24) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1141 f->stream_id_1 = (u_char) ((ctx->id >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1142 f->stream_id_2 = (u_char) ((ctx->id >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1143 f->stream_id_3 = (u_char) (ctx->id & 0xff);
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 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
1146 }
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1149 if (ctx->in->buf->last_buf) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1150 ctx->output_closed = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1151 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1152
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1153 *ll = ctx->in;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1154 ll = &ctx->in->next;
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 ctx->in = ctx->in->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1157 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1158
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1159 if (ctx->out) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1160 /* queued control frames */
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 *ll = ctx->out;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1163
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1164 for (cl = ctx->out, ll = &cl->next; cl; cl = cl->next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1165 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1166 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1167
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1168 ctx->out = NULL;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1171 f = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1172 last = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1173
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1174 limit = ngx_max(0, ctx->send_window);
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 if (limit > ctx->connection->send_window) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1177 limit = ctx->connection->send_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1178 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1179
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1180 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1181 "grpc output limit: %uz w:%z:%uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1182 limit, ctx->send_window, ctx->connection->send_window);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1183
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1184 #if (NGX_SUPPRESS_WARN)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1185 file_pos = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1186 pos = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1187 cl = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1188 #endif
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 in = ctx->in;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1191
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1192 while (in && limit > 0) {
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 ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1195 "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
1196 "file: %O, size: %O",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1197 in->buf->last_buf,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1198 in->buf->in_file,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1199 in->buf->start, in->buf->pos,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1200 in->buf->last - in->buf->pos,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1201 in->buf->file_pos,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1202 in->buf->file_last - in->buf->file_pos);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1203
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1204 if (ngx_buf_special(in->buf)) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1205 goto next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1206 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1207
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1208 if (in->buf->in_file) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1209 file_pos = in->buf->file_pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1210
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1211 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1212 pos = in->buf->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1213 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1214
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1215 next = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1216
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1217 do {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1218
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1219 cl = ngx_http_grpc_get_buf(r, ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1220 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1221 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1224 b = cl->buf;
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 f = (ngx_http_grpc_frame_t *) b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1227 b->last += sizeof(ngx_http_grpc_frame_t);
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 *ll = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1230 ll = &cl->next;
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 cl = ngx_chain_get_free_buf(r->pool, &ctx->free);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1233 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1234 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1235 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1236
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1237 b = cl->buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1238 start = b->start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1239
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1240 ngx_memcpy(b, in->buf, sizeof(ngx_buf_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1241
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1242 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1243 * restore b->start to preserve memory allocated in the buffer,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1244 * to reuse it later for headers and control frames
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1245 */
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 b->start = start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1248
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1249 if (in->buf->in_file) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1250 b->file_pos = file_pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1251 file_pos += ngx_min(NGX_HTTP_V2_DEFAULT_FRAME_SIZE, limit);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1252
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1253 if (file_pos >= in->buf->file_last) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1254 file_pos = in->buf->file_last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1255 next = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1256 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1257
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1258 b->file_last = file_pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1259 len = (ngx_uint_t) (file_pos - b->file_pos);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1260
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1261 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1262 b->pos = pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1263 pos += ngx_min(NGX_HTTP_V2_DEFAULT_FRAME_SIZE, limit);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1264
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1265 if (pos >= in->buf->last) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1266 pos = in->buf->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1267 next = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1268 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1269
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1270 b->last = pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1271 len = (ngx_uint_t) (pos - b->pos);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1272 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1273
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1274 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
1275 b->shadow = in->buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1276 b->last_shadow = next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1277
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1278 b->last_buf = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1279 b->last_in_chain = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1280
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1281 *ll = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1282 ll = &cl->next;
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 f->length_0 = (u_char) ((len >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1285 f->length_1 = (u_char) ((len >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1286 f->length_2 = (u_char) (len & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1287 f->type = NGX_HTTP_V2_DATA_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1288 f->flags = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1289 f->stream_id_0 = (u_char) ((ctx->id >> 24) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1290 f->stream_id_1 = (u_char) ((ctx->id >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1291 f->stream_id_2 = (u_char) ((ctx->id >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1292 f->stream_id_3 = (u_char) (ctx->id & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1293
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1294 limit -= len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1295 ctx->send_window -= len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1296 ctx->connection->send_window -= len;
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 } while (!next && limit > 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1299
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1300 if (!next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1301 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1302 * 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
1303 * preserve position for future use
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1304 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1305
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1306 if (in->buf->in_file) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1307 in->buf->file_pos = file_pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1308
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1309 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1310 in->buf->pos = pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1311 }
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 break;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1316 next:
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 if (in->buf->last_buf) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1319 last = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1320 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1321
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1322 in = in->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1323 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1324
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1325 ctx->in = in;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1326
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1327 if (last) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1328
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1329 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1330 "grpc output last");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1331
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1332 ctx->output_closed = 1;
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 if (f) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1335 f->flags |= NGX_HTTP_V2_END_STREAM_FLAG;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1336
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1337 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1338 cl = ngx_http_grpc_get_buf(r, ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1339 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1340 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1341 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1342
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1343 b = cl->buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1344
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1345 f = (ngx_http_grpc_frame_t *) b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1346 b->last += sizeof(ngx_http_grpc_frame_t);
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 f->length_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1349 f->length_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1350 f->length_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1351 f->type = NGX_HTTP_V2_DATA_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1352 f->flags = NGX_HTTP_V2_END_STREAM_FLAG;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1353 f->stream_id_0 = (u_char) ((ctx->id >> 24) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1354 f->stream_id_1 = (u_char) ((ctx->id >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1355 f->stream_id_2 = (u_char) ((ctx->id >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1356 f->stream_id_3 = (u_char) (ctx->id & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1357
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1358 *ll = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1359 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1360 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1361
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1362 cl->buf->last_buf = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1363 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1364
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1365 *ll = NULL;
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 #if (NGX_DEBUG)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1368
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1369 for (cl = out; cl; cl = cl->next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1370 ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1371 "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
1372 "file: %O, size: %O",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1373 cl->buf->last_buf,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1374 cl->buf->in_file,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1375 cl->buf->start, cl->buf->pos,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1376 cl->buf->last - cl->buf->pos,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1377 cl->buf->file_pos,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1378 cl->buf->file_last - cl->buf->file_pos);
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1381 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1382 "grpc output limit: %uz w:%z:%uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1383 limit, ctx->send_window, ctx->connection->send_window);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1384
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1385 #endif
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 rc = ngx_chain_writer(&r->upstream->writer, out);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1388
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1389 ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &out,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1390 (ngx_buf_tag_t) &ngx_http_grpc_body_output_filter);
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 for (cl = ctx->free; cl; cl = cl->next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1393
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1394 /* mark original buffers as sent */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1395
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1396 if (cl->buf->shadow) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1397 if (cl->buf->last_shadow) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1398 b = cl->buf->shadow;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1399 b->pos = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1400 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1401
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1402 cl->buf->shadow = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1403 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1404 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1405
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1406 if (rc == NGX_OK && ctx->in) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1407 rc = NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1408 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1409
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1410 return rc;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1413
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1414 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1415 ngx_http_grpc_process_header(ngx_http_request_t *r)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1416 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1417 ngx_str_t *status_line;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1418 ngx_int_t rc, status;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1419 ngx_buf_t *b;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1420 ngx_table_elt_t *h;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1421 ngx_http_upstream_t *u;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1422 ngx_http_grpc_ctx_t *ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1423 ngx_http_upstream_header_t *hh;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1424 ngx_http_upstream_main_conf_t *umcf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1425
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1426 u = r->upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1427 b = &u->buffer;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1428
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1429 #if (NGX_DEBUG)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1430 if (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1431 u_char buf[512];
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1432 size_t n, m;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1433
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1434 n = ngx_min(b->last - b->pos, 256);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1435 m = ngx_hex_dump(buf, b->pos, n) - buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1436
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1437 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1438 "grpc response: %*s%s, len: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1439 m, buf, b->last - b->pos > 256 ? "..." : "",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1440 b->last - b->pos);
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 #endif
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 ctx = ngx_http_grpc_get_ctx(r);
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 if (ctx == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1447 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1448 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1449
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1450 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
1451
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1452 for ( ;; ) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1453
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1454 if (ctx->state < ngx_http_grpc_st_payload) {
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 rc = ngx_http_grpc_parse_frame(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1457
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1458 if (rc == NGX_AGAIN) {
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 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1461 * there can be a lot of window update frames,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1462 * 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
1463 * started parsing headers yet
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1466 if (!ctx->parsing_headers) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1467 b->pos = b->start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1468 b->last = b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1469 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1470
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1471 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1472 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1473
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1474 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1475 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1476 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1477
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1478 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1479 * RFC 7540 says that implementations MUST discard frames
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1480 * that have unknown or unsupported types. However, extension
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1481 * frames that appear in the middle of a header block are
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1482 * not permitted. Also, for obvious reasons CONTINUATION frames
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1483 * cannot appear before headers, and DATA frames are not expected
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1484 * to appear before all headers are parsed.
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1485 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1486
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1487 if (ctx->type == NGX_HTTP_V2_DATA_FRAME
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1488 || (ctx->type == NGX_HTTP_V2_CONTINUATION_FRAME
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1489 && !ctx->parsing_headers)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1490 || (ctx->type != NGX_HTTP_V2_CONTINUATION_FRAME
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1491 && ctx->parsing_headers))
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 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1494 "upstream sent unexpected http2 frame: %d",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1495 ctx->type);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1496 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1497 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1498
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1499 if (ctx->stream_id && ctx->stream_id != ctx->id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1500 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1501 "upstream sent frame for unknown stream %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1502 ctx->stream_id);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1503 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1504 }
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 /* frame payload */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1508
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1509 if (ctx->type == NGX_HTTP_V2_RST_STREAM_FRAME) {
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 rc = ngx_http_grpc_parse_rst_stream(r, ctx, b);
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 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1514 return NGX_AGAIN;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1517 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1518 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1519 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1520
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1521 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1522 "upstream rejected request with error %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1523 ctx->error);
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 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1528 if (ctx->type == NGX_HTTP_V2_GOAWAY_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1529
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1530 rc = ngx_http_grpc_parse_goaway(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1531
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1532 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1533 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1534 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1535
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1536 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1537 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1538 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1539
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1540 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1541 * If stream_id is lower than one we use, our
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1542 * request won't be processed and needs to be retried.
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1543 * 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
1544 * we can continue normally (except we can't use this
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1545 * connection for additional requests). If there is
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1546 * a real error, the connection will be closed.
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->stream_id < ctx->id) {
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 /* TODO: we can retry non-idempotent requests */
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 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1554 "upstream sent goaway with error %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1555 ctx->error);
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 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1558 }
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 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1561 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1562
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1563 if (ctx->type == NGX_HTTP_V2_WINDOW_UPDATE_FRAME) {
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 rc = ngx_http_grpc_parse_window_update(r, ctx, b);
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 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1568 return NGX_AGAIN;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1571 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1572 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1573 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1574
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1575 if (ctx->in) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1576 ngx_post_event(u->peer.connection->write, &ngx_posted_events);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1577 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1578
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1579 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1580 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1581
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1582 if (ctx->type == NGX_HTTP_V2_SETTINGS_FRAME) {
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 rc = ngx_http_grpc_parse_settings(r, ctx, b);
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 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1587 return NGX_AGAIN;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1590 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1591 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1592 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1593
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1594 if (ctx->in) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1595 ngx_post_event(u->peer.connection->write, &ngx_posted_events);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1596 }
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 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1599 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1600
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1601 if (ctx->type == NGX_HTTP_V2_PING_FRAME) {
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 rc = ngx_http_grpc_parse_ping(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1604
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1605 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1606 return NGX_AGAIN;
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 (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1610 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1613 ngx_post_event(u->peer.connection->write, &ngx_posted_events);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1614 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1615 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1616
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1617 if (ctx->type == NGX_HTTP_V2_PUSH_PROMISE_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1618 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1619 "upstream sent unexpected push promise frame");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1620 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1621 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1622
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1623 if (ctx->type != NGX_HTTP_V2_HEADERS_FRAME
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1624 && ctx->type != NGX_HTTP_V2_CONTINUATION_FRAME)
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 /* priority, unknown frames */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1627
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1628 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1629 ctx->rest -= b->last - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1630 b->pos = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1631 return NGX_AGAIN;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1634 b->pos += ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1635 ctx->rest = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1636 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1637
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1638 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1639 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1640
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1641 /* headers */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1642
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1643 for ( ;; ) {
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 rc = ngx_http_grpc_parse_header(r, ctx, b);
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 (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1648 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1649 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1650
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1651 if (rc == NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1652
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1653 /* a header line has been parsed successfully */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1654
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1655 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1656 "grpc header: \"%V: %V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1657 &ctx->name, &ctx->value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1658
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1659 if (ctx->name.len && ctx->name.data[0] == ':') {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1660
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1661 if (ctx->name.len != sizeof(":status") - 1
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1662 || ngx_strncmp(ctx->name.data, ":status",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1663 sizeof(":status") - 1)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1664 != 0)
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 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1667 "upstream sent invalid header \"%V: %V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1668 &ctx->name, &ctx->value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1669 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1670 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1671
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1672 if (ctx->status) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1673 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1674 "upstream sent duplicate :status header");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1675 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1676 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1677
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1678 status_line = &ctx->value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1679
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1680 if (status_line->len != 3) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1681 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1682 "upstream sent invalid :status \"%V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1683 status_line);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1684 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1685 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1686
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1687 status = ngx_atoi(status_line->data, 3);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1688
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1689 if (status == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1690 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1691 "upstream sent invalid :status \"%V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1692 status_line);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1693 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1696 if (status < NGX_HTTP_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1697 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1698 "upstream sent unexpected :status \"%V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1699 status_line);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1700 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1701 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1702
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1703 u->headers_in.status_n = status;
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 if (u->state && u->state->status == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1706 u->state->status = status;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1707 }
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 ctx->status = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1710
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1711 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1712
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1713 } else if (!ctx->status) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1714 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1715 "upstream sent no :status header");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1716 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1719 h = ngx_list_push(&u->headers_in.headers);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1720 if (h == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1721 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1722 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1723
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1724 h->key = ctx->name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1725 h->value = ctx->value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1726 h->lowcase_key = h->key.data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1727 h->hash = ngx_hash_key(h->key.data, h->key.len);
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 hh = ngx_hash_find(&umcf->headers_in_hash, h->hash,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1730 h->lowcase_key, h->key.len);
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 (hh && hh->handler(r, h, hh->offset) != NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1733 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1734 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1735
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1736 continue;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1739 if (rc == NGX_HTTP_PARSE_HEADER_DONE) {
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 /* a whole header has been parsed successfully */
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 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1744 "grpc header done");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1745
7235
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1746 if (ctx->end_stream) {
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1747 u->headers_in.content_length_n = 0;
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1748
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1749 if (ctx->in == NULL
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1750 && ctx->out == NULL
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1751 && ctx->output_closed
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1752 && b->last == b->pos)
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1753 {
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1754 u->keepalive = 1;
c2a0a838c40f gRPC: special handling of "trailer only" responses.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7234
diff changeset
1755 }
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1756 }
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 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1759 }
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 /* there was error while a header line parsing */
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 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1764 "upstream sent invalid header");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1765
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1766 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1767 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1768
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1769 /* rc == NGX_AGAIN */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1770
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1771 if (ctx->rest == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1772 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1773 continue;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1776 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1777 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1778 }
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 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1782 ngx_http_grpc_filter_init(void *data)
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 ngx_http_grpc_ctx_t *ctx = data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1785
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1786 ngx_http_request_t *r;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1787 ngx_http_upstream_t *u;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1788
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1789 r = ctx->request;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1790 u = r->upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1791
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1792 u->length = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1793
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1794 if (ctx->end_stream) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1795 u->length = 0;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1798 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1799 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1800
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1801
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1802 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1803 ngx_http_grpc_filter(void *data, ssize_t bytes)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1804 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1805 ngx_http_grpc_ctx_t *ctx = data;
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 ngx_int_t rc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1808 ngx_buf_t *b, *buf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1809 ngx_chain_t *cl, **ll;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1810 ngx_table_elt_t *h;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1811 ngx_http_request_t *r;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1812 ngx_http_upstream_t *u;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1813
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1814 r = ctx->request;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1815 u = r->upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1816 b = &u->buffer;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1817
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1818 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1819 "grpc filter bytes:%z", bytes);
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 b->pos = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1822 b->last += bytes;
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 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
1825 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1826 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1827
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1828 for ( ;; ) {
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 if (ctx->state < ngx_http_grpc_st_payload) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1831
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1832 rc = ngx_http_grpc_parse_frame(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1833
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1834 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1835 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1836 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1837
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1838 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1839 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1840 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1841
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1842 if ((ctx->type == NGX_HTTP_V2_CONTINUATION_FRAME
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1843 && !ctx->parsing_headers)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1844 || (ctx->type != NGX_HTTP_V2_CONTINUATION_FRAME
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1845 && ctx->parsing_headers))
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1846 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1847 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 sent unexpected http2 frame: %d",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1849 ctx->type);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1850 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1851 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1852
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1853 if (ctx->type == NGX_HTTP_V2_DATA_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1854
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1855 if (ctx->stream_id != ctx->id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1856 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1857 "upstream sent data frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1858 "for unknown stream %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1859 ctx->stream_id);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1860 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1863 if (ctx->rest > ctx->recv_window) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1864 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1865 "upstream violated stream flow control, "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1866 "received %uz data frame with window %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1867 ctx->rest, ctx->recv_window);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1868 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1869 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1870
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1871 if (ctx->rest > ctx->connection->recv_window) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1872 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1873 "upstream violated connection flow control, "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1874 "received %uz data frame with window %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1875 ctx->rest, ctx->connection->recv_window);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1876 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1877 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1878
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1879 ctx->recv_window -= ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1880 ctx->connection->recv_window -= ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1881
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1882 if (ctx->connection->recv_window < NGX_HTTP_V2_MAX_WINDOW / 4
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1883 || ctx->recv_window < NGX_HTTP_V2_MAX_WINDOW / 4)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1884 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1885 if (ngx_http_grpc_send_window_update(r, ctx) != NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1886 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1887 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1888
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1889 ngx_post_event(u->peer.connection->write,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1890 &ngx_posted_events);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1891 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1892 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1893
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1894 if (ctx->stream_id && ctx->stream_id != ctx->id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1895 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1896 "upstream sent frame for unknown stream %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1897 ctx->stream_id);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1898 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1899 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1900
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1901 ctx->padding = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1902 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1903
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1904 if (ctx->state == ngx_http_grpc_st_padding) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1905
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1906 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1907 ctx->rest -= b->last - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1908 b->pos = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1909 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1910 }
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 b->pos += ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1913 ctx->rest = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1914 ctx->state = ngx_http_grpc_st_start;
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 if (ctx->flags & NGX_HTTP_V2_END_STREAM_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1917 u->length = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1918
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1919 if (ctx->in == NULL
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1920 && ctx->out == NULL
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1921 && ctx->output_closed
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1922 && b->last == b->pos)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1923 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1924 u->keepalive = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1925 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1926
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1927 break;
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 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1931 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1932
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1933 /* frame payload */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1934
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1935 if (ctx->type == NGX_HTTP_V2_RST_STREAM_FRAME) {
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 rc = ngx_http_grpc_parse_rst_stream(r, ctx, b);
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 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1940 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1941 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1942
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1943 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1944 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1945 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1946
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1947 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1948 "upstream rejected request with error %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1949 ctx->error);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1950
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1951 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1952 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1953
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1954 if (ctx->type == NGX_HTTP_V2_GOAWAY_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1955
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1956 rc = ngx_http_grpc_parse_goaway(r, ctx, b);
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 (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1959 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1960 }
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 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1963 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1964 }
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 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1967 * If stream_id is lower than one we use, our
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1968 * request won't be processed and needs to be retried.
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1969 * 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
1970 * we can continue normally (except we can't use this
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1971 * connection for additional requests). If there is
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1972 * a real error, the connection will be closed.
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1975 if (ctx->stream_id < ctx->id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1976
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1977 /* TODO: we can retry non-idempotent requests */
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 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1980 "upstream sent goaway with error %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1981 ctx->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 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1984 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1985
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1986 continue;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1989 if (ctx->type == NGX_HTTP_V2_WINDOW_UPDATE_FRAME) {
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 rc = ngx_http_grpc_parse_window_update(r, ctx, b);
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 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1994 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1995 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1996
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1997 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1998 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1999 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2000
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2001 if (ctx->in) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2002 ngx_post_event(u->peer.connection->write, &ngx_posted_events);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2003 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2004
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2005 continue;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2008 if (ctx->type == NGX_HTTP_V2_SETTINGS_FRAME) {
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 rc = ngx_http_grpc_parse_settings(r, ctx, b);
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 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2013 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2014 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2015
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2016 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2017 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2018 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2019
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2020 if (ctx->in) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2021 ngx_post_event(u->peer.connection->write, &ngx_posted_events);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2022 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2023
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2024 continue;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2027 if (ctx->type == NGX_HTTP_V2_PING_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2028
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2029 rc = ngx_http_grpc_parse_ping(r, ctx, b);
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 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2032 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2033 }
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 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2036 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2037 }
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 ngx_post_event(u->peer.connection->write, &ngx_posted_events);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2040 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2041 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2042
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2043 if (ctx->type == NGX_HTTP_V2_PUSH_PROMISE_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2044 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2045 "upstream sent unexpected push promise frame");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2046 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2047 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2048
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2049 if (ctx->type == NGX_HTTP_V2_HEADERS_FRAME
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2050 || ctx->type == NGX_HTTP_V2_CONTINUATION_FRAME)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2051 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2052 for ( ;; ) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2053
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2054 rc = ngx_http_grpc_parse_header(r, ctx, b);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2055
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2056 if (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2057 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2058 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2059
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2060 if (rc == NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2061
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2062 /* a header line has been parsed successfully */
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 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2065 "grpc trailer: \"%V: %V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2066 &ctx->name, &ctx->value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2067
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2068 if (ctx->name.len && ctx->name.data[0] == ':') {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2069 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2070 "upstream sent invalid "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2071 "trailer \"%V: %V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2072 &ctx->name, &ctx->value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2073 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2074 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2075
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2076 h = ngx_list_push(&u->headers_in.trailers);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2077 if (h == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2078 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2079 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2080
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2081 h->key = ctx->name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2082 h->value = ctx->value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2083 h->lowcase_key = h->key.data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2084 h->hash = ngx_hash_key(h->key.data, h->key.len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2085
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2086 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2087 }
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 if (rc == NGX_HTTP_PARSE_HEADER_DONE) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2090
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2091 /* a whole header has been parsed successfully */
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_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2094 "grpc trailer done");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2095
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2096 if (ctx->end_stream) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2097 u->length = 0;
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 if (ctx->in == NULL
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2100 && ctx->out == NULL
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2101 && ctx->output_closed
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2102 && b->last == b->pos)
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 u->keepalive = 1;
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 return NGX_OK;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2110 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2111 "upstream sent trailer without "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2112 "end stream flag");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2113 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2114 }
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 /* there was error while a header line parsing */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2117
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2118 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2119 "upstream sent invalid trailer");
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 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2122 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2123
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2124 /* rc == 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 if (ctx->rest == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2127 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2128 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2129 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2130
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2131 return NGX_AGAIN;
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 if (ctx->type != NGX_HTTP_V2_DATA_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2135
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2136 /* priority, unknown frames */
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 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2139 ctx->rest -= b->last - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2140 b->pos = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2141 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2142 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2143
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2144 b->pos += ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2145 ctx->rest = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2146 ctx->state = ngx_http_grpc_st_start;
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 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2149 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2150
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2151 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2152 * data frame:
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 * +---------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2155 * |Pad Length? (8)|
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 * | Data (*) ...
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2158 * +---------------------------------------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2159 * | Padding (*) ...
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2160 * +---------------------------------------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2161 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2162
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2163 if (ctx->flags & NGX_HTTP_V2_PADDED_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2164
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2165 if (ctx->rest == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2166 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2167 "upstream sent too short http2 frame");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2168 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2169 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2170
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2171 if (b->pos == b->last) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2172 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2173 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2174
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2175 ctx->flags &= ~NGX_HTTP_V2_PADDED_FLAG;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2176 ctx->padding = *b->pos++;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2177 ctx->rest -= 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2178
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2179 if (ctx->padding > ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2180 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2181 "upstream sent http2 frame with too long "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2182 "padding: %d in frame %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2183 ctx->padding, ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2184 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2187 continue;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2190 if (ctx->rest == ctx->padding) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2191 goto done;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2192 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2193
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2194 if (b->pos == b->last) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2195 return NGX_AGAIN;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2198 cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2199 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2200 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2201 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2202
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2203 *ll = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2204 ll = &cl->next;
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 buf = cl->buf;
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 buf->flush = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2209 buf->memory = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2210
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2211 buf->pos = b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2212 buf->tag = u->output.tag;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2213
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2214 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2215 "grpc output buf %p", buf->pos);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2216
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2217 if (b->last - b->pos < (ssize_t) ctx->rest - ctx->padding) {
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 ctx->rest -= b->last - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2220 b->pos = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2221 buf->last = b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2222
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2223 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2224 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2225
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2226 b->pos += ctx->rest - ctx->padding;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2227 buf->last = b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2228 ctx->rest = ctx->padding;
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 done:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2231
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2232 if (ctx->padding) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2233 ctx->state = ngx_http_grpc_st_padding;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2234 continue;
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 ctx->state = ngx_http_grpc_st_start;
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 if (ctx->flags & NGX_HTTP_V2_END_STREAM_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2240 u->length = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2241
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2242 if (ctx->in == NULL
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2243 && ctx->out == NULL
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2244 && ctx->output_closed
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2245 && b->last == b->pos)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2246 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2247 u->keepalive = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2248 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2249
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2250 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2251 }
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2254 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2255 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2256
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 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2259 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
2260 ngx_buf_t *b)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2261 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2262 u_char ch, *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2263 ngx_http_grpc_state_e state;
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 state = ctx->state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2266
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2267 for (p = b->pos; p < b->last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2268 ch = *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2269
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2270 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2271 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2272 "grpc frame byte: %02Xd, s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2273 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2274
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2275 switch (state) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2276
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2277 case ngx_http_grpc_st_start:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2278 ctx->rest = ch << 16;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2279 state = ngx_http_grpc_st_length_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2280 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2281
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2282 case ngx_http_grpc_st_length_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2283 ctx->rest |= ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2284 state = ngx_http_grpc_st_length_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2285 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2286
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2287 case ngx_http_grpc_st_length_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2288 ctx->rest |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2289
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2290 if (ctx->rest > NGX_HTTP_V2_DEFAULT_FRAME_SIZE) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2291 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2292 "upstream sent too large http2 frame: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2293 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2294 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2295 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2296
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2297 state = ngx_http_grpc_st_type;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2298 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2299
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2300 case ngx_http_grpc_st_type:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2301 ctx->type = ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2302 state = ngx_http_grpc_st_flags;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2303 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2304
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2305 case ngx_http_grpc_st_flags:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2306 ctx->flags = ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2307 state = ngx_http_grpc_st_stream_id;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2308 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2309
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2310 case ngx_http_grpc_st_stream_id:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2311 ctx->stream_id = (ch & 0x7f) << 24;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2312 state = ngx_http_grpc_st_stream_id_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2313 break;
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 case ngx_http_grpc_st_stream_id_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2316 ctx->stream_id |= ch << 16;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2317 state = ngx_http_grpc_st_stream_id_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2318 break;
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 case ngx_http_grpc_st_stream_id_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2321 ctx->stream_id |= ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2322 state = ngx_http_grpc_st_stream_id_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2323 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2324
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2325 case ngx_http_grpc_st_stream_id_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2326 ctx->stream_id |= ch;
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 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2329 "grpc frame: %d, len: %uz, f:%d, i:%ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2330 ctx->type, ctx->rest, ctx->flags, ctx->stream_id);
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 b->pos = p + 1;
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 ctx->state = ngx_http_grpc_st_payload;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2335 ctx->frame_state = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2336
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2337 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2338
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2339 /* suppress warning */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2340 case ngx_http_grpc_st_payload:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2341 case ngx_http_grpc_st_padding:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2342 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2343 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2344 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2345
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2346 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2347 ctx->state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2348
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2349 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2350 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2351
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2352
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2353 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2354 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
2355 ngx_buf_t *b)
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 u_char ch, *p, *last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2358 size_t min;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2359 ngx_int_t rc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2360 enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2361 sw_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2362 sw_padding_length,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2363 sw_dependency,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2364 sw_dependency_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2365 sw_dependency_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2366 sw_dependency_4,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2367 sw_weight,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2368 sw_fragment,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2369 sw_padding
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2370 } state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2371
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2372 state = ctx->frame_state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2373
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2374 if (state == sw_start) {
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 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2377 "grpc parse header: start");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2378
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2379 if (ctx->type == NGX_HTTP_V2_HEADERS_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2380 ctx->parsing_headers = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2381 ctx->fragment_state = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2382
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2383 min = (ctx->flags & NGX_HTTP_V2_PADDED_FLAG ? 1 : 0)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2384 + (ctx->flags & NGX_HTTP_V2_PRIORITY_FLAG ? 5 : 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2385
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2386 if (ctx->rest < min) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2387 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2388 "upstream sent headers frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2389 "with invalid length: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2390 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2391 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2392 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2393
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2394 if (ctx->flags & NGX_HTTP_V2_END_STREAM_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2395 ctx->end_stream = 1;
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 (ctx->flags & NGX_HTTP_V2_PADDED_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2399 state = sw_padding_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2400
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2401 } else if (ctx->flags & NGX_HTTP_V2_PRIORITY_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2402 state = sw_dependency;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2403
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2404 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2405 state = sw_fragment;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2406 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2407
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2408 } else if (ctx->type == NGX_HTTP_V2_CONTINUATION_FRAME) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2409 state = sw_fragment;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2410 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2411
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2412 ctx->padding = 0;
7242
25a4353633a0 gRPC: fixed missing state save in frame header parsing.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7240
diff changeset
2413 ctx->frame_state = state;
7233
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 if (state < sw_fragment) {
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 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2419 last = b->last;
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 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2422 last = b->pos + ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2423 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2424
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2425 for (p = b->pos; p < last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2426 ch = *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2427
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2428 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2429 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2430 "grpc header byte: %02Xd s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2431 #endif
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 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2434 * headers frame:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2435 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2436 * +---------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2437 * |Pad Length? (8)|
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2438 * +-+-------------+----------------------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2439 * |E| Stream Dependency? (31) |
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 * | Weight? (8) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2442 * +-+-------------+----------------------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2443 * | Header Block Fragment (*) ...
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2444 * +--------------------------------------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2445 * | Padding (*) ...
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2446 * +--------------------------------------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2447 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2448
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2449 switch (state) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2450
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2451 case sw_padding_length:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2452
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2453 ctx->padding = ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2454
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2455 if (ctx->flags & NGX_HTTP_V2_PRIORITY_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2456 state = sw_dependency;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2457 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2458 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2459
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2460 goto fragment;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2461
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2462 case sw_dependency:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2463 state = sw_dependency_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2464 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2465
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2466 case sw_dependency_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2467 state = sw_dependency_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2468 break;
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 case sw_dependency_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2471 state = sw_dependency_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2472 break;
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 case sw_dependency_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2475 state = sw_weight;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2476 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2477
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2478 case sw_weight:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2479 goto fragment;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2480
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2481 /* suppress warning */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2482 case sw_start:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2483 case sw_fragment:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2484 case sw_padding:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2485 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2486 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2487 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2488
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2489 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2490 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2491
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2492 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2493 return NGX_AGAIN;
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 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 p++;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2498 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2499 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2500
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2501 if (ctx->padding > ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2502 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2503 "upstream sent http2 frame with too long "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2504 "padding: %d in frame %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2505 ctx->padding, ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2506 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2507 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2508
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2509 state = sw_fragment;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2510 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2511 }
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 if (state == sw_fragment) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2514
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2515 rc = ngx_http_grpc_parse_fragment(r, ctx, b);
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 (rc == NGX_AGAIN) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2518 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2519 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2520
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2521 if (rc == NGX_ERROR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2522 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2523 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2524
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2525 if (rc == NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2526 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2527 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2528
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2529 /* rc == NGX_DONE */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2530
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2531 state = sw_padding;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2532 ctx->frame_state = state;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2535 if (state == sw_padding) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2536
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2537 if (b->last - b->pos < (ssize_t) ctx->rest) {
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 ctx->rest -= b->last - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2540 b->pos = b->last;
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_AGAIN;
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 b->pos += ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2546 ctx->rest = 0;
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 ctx->state = ngx_http_grpc_st_start;
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 if (ctx->flags & NGX_HTTP_V2_END_HEADERS_FLAG) {
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 if (ctx->fragment_state) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2553 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2554 "upstream sent truncated http2 header");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2555 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2556 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2557
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2558 ctx->parsing_headers = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2559
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2560 return NGX_HTTP_PARSE_HEADER_DONE;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2561 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2562
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2563 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2564 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2565
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2566 /* unreachable */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2567
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2568 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2569 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2570
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2571
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2572 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2573 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
2574 ngx_buf_t *b)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2575 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2576 u_char ch, *p, *last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2577 size_t size;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2578 ngx_uint_t index, size_update;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2579 enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2580 sw_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2581 sw_index,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2582 sw_name_length,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2583 sw_name_length_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2584 sw_name_length_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2585 sw_name_length_4,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2586 sw_name,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2587 sw_name_bytes,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2588 sw_value_length,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2589 sw_value_length_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2590 sw_value_length_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2591 sw_value_length_4,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2592 sw_value,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2593 sw_value_bytes
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2594 } state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2595
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2596 /* header block fragment */
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_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2600 "grpc header fragment %p:%p rest:%uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2601 b->pos, b->last, ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2602 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2603
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2604 if (b->last - b->pos < (ssize_t) ctx->rest - ctx->padding) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2605 last = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2606
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2607 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2608 last = b->pos + ctx->rest - ctx->padding;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2611 state = ctx->fragment_state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2612
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2613 for (p = b->pos; p < last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2614 ch = *p;
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 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2617 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2618 "grpc header byte: %02Xd s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2619 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2620
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2621 switch (state) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2622
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2623 case sw_start:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2624 ctx->index = 0;
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 if ((ch & 0x80) == 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2627 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2628 * indexed header:
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 * 0 1 2 3 4 5 6 7
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2631 * +---+---+---+---+---+---+---+---+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2632 * | 1 | Index (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2633 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2634 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2635
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2636 index = ch & ~0x80;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2637
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2638 if (index == 0 || index > 61) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2639 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2640 "upstream sent invalid http2 "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2641 "table index: %ui", index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2642 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2643 }
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 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2646 "grpc indexed header: %ui", index);
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 ctx->index = index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2649 ctx->literal = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2650
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2651 goto done;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2652
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2653 } else if ((ch & 0xc0) == 0x40) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2654 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2655 * literal header with incremental indexing:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2656 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2657 * 0 1 2 3 4 5 6 7
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2658 * +---+---+---+---+---+---+---+---+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2659 * | 0 | 1 | Index (6+) |
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 * | H | Value Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2662 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2663 * | Value String (Length octets) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2664 * +-------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2665 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2666 * 0 1 2 3 4 5 6 7
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2667 * +---+---+---+---+---+---+---+---+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2668 * | 0 | 1 | 0 |
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 * | H | Name Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2671 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2672 * | Name String (Length octets) |
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 * | H | Value Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2675 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2676 * | Value String (Length octets) |
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2680 index = ch & ~0xc0;
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 if (index > 61) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2683 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2684 "upstream sent invalid http2 "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2685 "table index: %ui", index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2686 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2687 }
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 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2690 "grpc literal header: %ui", index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2691
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2692 if (index == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2693 state = sw_name_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2694 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2695 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2696
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2697 ctx->index = index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2698 ctx->literal = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2699
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2700 state = sw_value_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2701 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2702
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2703 } else if ((ch & 0xe0) == 0x20) {
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 * dynamic table size update:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2706 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2707 * 0 1 2 3 4 5 6 7
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2708 * +---+---+---+---+---+---+---+---+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2709 * | 0 | 0 | 1 | Max size (5+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2710 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2711 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2712
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2713 size_update = ch & ~0xe0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2714
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2715 if (size_update > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2716 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2717 "upstream sent invalid http2 "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2718 "dynamic table size update: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2719 size_update);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2720 return NGX_ERROR;
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 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2724 "grpc table size update: %ui", size_update);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2725
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2726 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2727
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2728 } else if ((ch & 0xf0) == 0x10) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2729 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2730 * literal header field never indexed:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2731 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2732 * 0 1 2 3 4 5 6 7
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2733 * +---+---+---+---+---+---+---+---+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2734 * | 0 | 0 | 0 | 1 | Index (4+) |
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 * | H | Value Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2737 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2738 * | Value String (Length octets) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2739 * +-------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2740 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2741 * 0 1 2 3 4 5 6 7
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2742 * +---+---+---+---+---+---+---+---+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2743 * | 0 | 0 | 0 | 1 | 0 |
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 * | H | Name Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2746 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2747 * | Name String (Length octets) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2748 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2749 * | H | Value Length (7+) |
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 * | Value String (Length octets) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2752 * +-------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2753 */
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 index = ch & ~0xf0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2756
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2757 if (index == 0x0f) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2758 ctx->index = index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2759 ctx->literal = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2760 state = sw_index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2761 break;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2764 if (index == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2765 state = sw_name_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2766 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2767 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2768
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2769 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2770 "grpc literal header never indexed: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2771 index);
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 ctx->index = index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2774 ctx->literal = 1;
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 state = sw_value_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2777 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2778
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2779 } else if ((ch & 0xf0) == 0x00) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2780 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2781 * literal header field without indexing:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2782 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2783 * 0 1 2 3 4 5 6 7
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2784 * +---+---+---+---+---+---+---+---+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2785 * | 0 | 0 | 0 | 0 | Index (4+) |
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 * | H | Value Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2788 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2789 * | Value String (Length octets) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2790 * +-------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2791 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2792 * 0 1 2 3 4 5 6 7
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2793 * +---+---+---+---+---+---+---+---+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2794 * | 0 | 0 | 0 | 0 | 0 |
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 * | H | Name Length (7+) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2797 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2798 * | Name String (Length octets) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2799 * +---+---------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2800 * | H | Value Length (7+) |
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 * | Value String (Length octets) |
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2803 * +-------------------------------+
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2804 */
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 index = ch & ~0xf0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2807
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2808 if (index == 0x0f) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2809 ctx->index = index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2810 ctx->literal = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2811 state = sw_index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2812 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2813 }
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 if (index == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2816 state = sw_name_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2817 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2818 }
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 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2821 "grpc literal header without indexing: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2822 index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2823
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2824 ctx->index = index;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2825 ctx->literal = 1;
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 state = sw_value_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2828 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2829 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2830
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2831 /* not reached */
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 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2834
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2835 case sw_index:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2836 ctx->index = ctx->index + (ch & ~0x80);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2837
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2838 if (ch & 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2839 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2840 "upstream sent http2 table index "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2841 "with continuation flag");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2842 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2845 if (ctx->index > 61) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2846 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2847 "upstream sent invalid http2 "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2848 "table index: %ui", ctx->index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2849 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2850 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2851
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2852 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2853 "grpc header index: %ui", ctx->index);
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 state = sw_value_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2856 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2857
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2858 case sw_name_length:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2859 ctx->field_huffman = ch & 0x80 ? 1 : 0;
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 (ctx->field_length == 0x7f) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2863 state = sw_name_length_2;
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 if (ctx->field_length == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2868 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2869 "upstream sent zero http2 "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2870 "header name length");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2871 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2874 state = sw_name;
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 case sw_name_length_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2878 ctx->field_length += ch & ~0x80;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2879
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2880 if (ch & 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2881 state = sw_name_length_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2882 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2883 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2884
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2885 state = sw_name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2886 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2887
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2888 case sw_name_length_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2889 ctx->field_length += (ch & ~0x80) << 7;
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 if (ch & 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2892 state = sw_name_length_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2893 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2894 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2895
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2896 state = sw_name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2897 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2898
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2899 case sw_name_length_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2900 ctx->field_length += (ch & ~0x80) << 14;
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 if (ch & 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2903 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2904 "upstream sent too large http2 "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2905 "header name length");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2906 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2907 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2908
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2909 state = sw_name;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2910 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2911
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2912 case sw_name:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2913 ctx->name.len = ctx->field_huffman ?
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2914 ctx->field_length * 8 / 5 : ctx->field_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2915
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2916 ctx->name.data = ngx_pnalloc(r->pool, ctx->name.len + 1);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2917 if (ctx->name.data == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2918 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2919 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2920
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2921 ctx->field_end = ctx->name.data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2922 ctx->field_rest = ctx->field_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2923 ctx->field_state = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2924
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2925 state = sw_name_bytes;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2926
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2927 /* fall through */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2928
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2929 case sw_name_bytes:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2930
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2931 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2932 "grpc name: len:%uz h:%d last:%uz, rest:%uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2933 ctx->field_length,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2934 ctx->field_huffman,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2935 last - p,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2936 ctx->rest - (p - b->pos));
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 size = ngx_min(last - p, (ssize_t) ctx->field_rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2939 ctx->field_rest -= size;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2940
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2941 if (ctx->field_huffman) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2942 if (ngx_http_v2_huff_decode(&ctx->field_state, p, size,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2943 &ctx->field_end,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2944 ctx->field_rest == 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2945 r->connection->log)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2946 != NGX_OK)
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 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2949 "upstream sent invalid encoded header");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2950 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2951 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2952
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2953 ctx->name.len = ctx->field_end - ctx->name.data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2954 ctx->name.data[ctx->name.len] = '\0';
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2955
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2956 } else {
7240
413189f03c8d gRPC: fixed parsing response headers split on CONTINUATION frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7235
diff changeset
2957 ctx->field_end = ngx_cpymem(ctx->field_end, p, size);
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2958 ctx->name.data[ctx->name.len] = '\0';
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2961 p += size - 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2962
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2963 if (ctx->field_rest == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2964 state = sw_value_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2965 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2966
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2967 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2968
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2969 case sw_value_length:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2970 ctx->field_huffman = ch & 0x80 ? 1 : 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2971 ctx->field_length = ch & ~0x80;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2972
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2973 if (ctx->field_length == 0x7f) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2974 state = sw_value_length_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2975 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2976 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2977
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2978 if (ctx->field_length == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2979 ngx_str_set(&ctx->value, "");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2980 goto done;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2983 state = sw_value;
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 case sw_value_length_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2987 ctx->field_length += ch & ~0x80;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2988
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2989 if (ch & 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2990 state = sw_value_length_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2991 break;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2994 state = sw_value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2995 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2996
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2997 case sw_value_length_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2998 ctx->field_length += (ch & ~0x80) << 7;
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 if (ch & 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3001 state = sw_value_length_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3002 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3003 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3004
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3005 state = sw_value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3006 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3007
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3008 case sw_value_length_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3009 ctx->field_length += (ch & ~0x80) << 14;
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 if (ch & 0x80) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3012 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3013 "upstream sent too large http2 "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3014 "header value length");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3015 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3016 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3017
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3018 state = sw_value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3019 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3020
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3021 case sw_value:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3022 ctx->value.len = ctx->field_huffman ?
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3023 ctx->field_length * 8 / 5 : ctx->field_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3024
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3025 ctx->value.data = ngx_pnalloc(r->pool, ctx->value.len + 1);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3026 if (ctx->value.data == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3027 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3028 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3029
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3030 ctx->field_end = ctx->value.data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3031 ctx->field_rest = ctx->field_length;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3032 ctx->field_state = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3033
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3034 state = sw_value_bytes;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3035
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3036 /* fall through */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3037
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3038 case sw_value_bytes:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3039
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3040 ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3041 "grpc value: len:%uz h:%d last:%uz, rest:%uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3042 ctx->field_length,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3043 ctx->field_huffman,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3044 last - p,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3045 ctx->rest - (p - b->pos));
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 size = ngx_min(last - p, (ssize_t) ctx->field_rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3048 ctx->field_rest -= size;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3049
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3050 if (ctx->field_huffman) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3051 if (ngx_http_v2_huff_decode(&ctx->field_state, p, size,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3052 &ctx->field_end,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3053 ctx->field_rest == 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3054 r->connection->log)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3055 != NGX_OK)
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 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3058 "upstream sent invalid encoded header");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3059 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3062 ctx->value.len = ctx->field_end - ctx->value.data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3063 ctx->value.data[ctx->value.len] = '\0';
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 } else {
7240
413189f03c8d gRPC: fixed parsing response headers split on CONTINUATION frames.
Sergey Kandaurov <pluknet@nginx.com>
parents: 7235
diff changeset
3066 ctx->field_end = ngx_cpymem(ctx->field_end, p, size);
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3067 ctx->value.data[ctx->value.len] = '\0';
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3068 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3069
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3070 p += size - 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3071
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3072 if (ctx->field_rest == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3073 goto done;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3074 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3075
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3076 break;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3079 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3080
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3081 done:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3082
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3083 p++;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3084 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3085 ctx->fragment_state = sw_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3086 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3087
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3088 if (ctx->index) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3089 ctx->name = *ngx_http_v2_get_static_name(ctx->index);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3090 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3091
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3092 if (ctx->index && !ctx->literal) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3093 ctx->value = *ngx_http_v2_get_static_value(ctx->index);
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 if (!ctx->index) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3097 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
3098 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3099 "upstream sent invalid header: \"%V: %V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3100 &ctx->name, &ctx->value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3101 return NGX_ERROR;
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 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3104
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3105 if (!ctx->index || ctx->literal) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3106 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
3107 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3108 "upstream sent invalid header: \"%V: %V\"",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3109 &ctx->name, &ctx->value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3110 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3111 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3112 }
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 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3115 }
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 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3118 ctx->fragment_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3119 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3120
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3121 if (ctx->rest > ctx->padding) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3122 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3123 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3124
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3125 return NGX_DONE;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3129 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3130 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
3131 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3132 u_char ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3133 ngx_uint_t i;
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 for (i = 0; i < s->len; i++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3136 ch = s->data[i];
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3137
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3138 if (ch == ':' && i > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3139 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3140 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3141
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3142 if (ch >= 'A' && ch <= 'Z') {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3143 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3144 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3145
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_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
3157 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3158 u_char ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3159 ngx_uint_t i;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3160
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3161 for (i = 0; i < s->len; i++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3162 ch = s->data[i];
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3163
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3164 if (ch == '\0' || ch == CR || ch == LF) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3165 return NGX_ERROR;
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 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3168
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3169 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3170 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3171
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3172
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3173 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3174 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
3175 ngx_buf_t *b)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3176 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3177 u_char ch, *p, *last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3178 enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3179 sw_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3180 sw_error_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3181 sw_error_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3182 sw_error_4
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3183 } state;
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 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3186 last = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3187
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3188 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3189 last = b->pos + ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3190 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3191
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3192 state = ctx->frame_state;
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 if (state == sw_start) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3195 if (ctx->rest != 4) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3196 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3197 "upstream sent rst stream frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3198 "with invalid length: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3199 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3200 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3201 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3202 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3203
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3204 for (p = b->pos; p < last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3205 ch = *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3206
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3207 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3208 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3209 "grpc rst byte: %02Xd s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3210 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3211
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3212 switch (state) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3213
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3214 case sw_start:
7249
070c972336c4 gRPC: fixed possible sign extension of error and setting_value.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7242
diff changeset
3215 ctx->error = (ngx_uint_t) ch << 24;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3216 state = sw_error_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3217 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3218
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3219 case sw_error_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3220 ctx->error |= ch << 16;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3221 state = sw_error_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3222 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3223
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3224 case sw_error_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3225 ctx->error |= ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3226 state = sw_error_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3227 break;
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 case sw_error_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3230 ctx->error |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3231 state = sw_start;
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 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3234 "grpc error: %ui", ctx->error);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3235
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3236 break;
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 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3239
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3240 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3241 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3242 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3243
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3244 if (ctx->rest > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3245 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3246 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3247
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3248 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3249 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3250
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3251
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3252 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3253 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
3254 ngx_buf_t *b)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3255 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3256 u_char ch, *p, *last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3257 enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3258 sw_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3259 sw_last_stream_id_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3260 sw_last_stream_id_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3261 sw_last_stream_id_4,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3262 sw_error,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3263 sw_error_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3264 sw_error_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3265 sw_error_4,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3266 sw_debug
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3267 } state;
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 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3270 last = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3271
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3272 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3273 last = b->pos + ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3274 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3275
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3276 state = ctx->frame_state;
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 if (state == sw_start) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3279
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3280 if (ctx->stream_id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3281 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3282 "upstream sent goaway frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3283 "with non-zero stream id: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3284 ctx->stream_id);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3285 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3288 if (ctx->rest < 8) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3289 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3290 "upstream sent goaway frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3291 "with invalid length: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3292 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3293 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3294 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3295 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3296
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3297 for (p = b->pos; p < last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3298 ch = *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3299
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3300 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3301 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3302 "grpc goaway byte: %02Xd s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3303 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3304
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3305 switch (state) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3306
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3307 case sw_start:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3308 ctx->stream_id = (ch & 0x7f) << 24;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3309 state = sw_last_stream_id_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3310 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3311
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3312 case sw_last_stream_id_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3313 ctx->stream_id |= ch << 16;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3314 state = sw_last_stream_id_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3315 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3316
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3317 case sw_last_stream_id_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3318 ctx->stream_id |= ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3319 state = sw_last_stream_id_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3320 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3321
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3322 case sw_last_stream_id_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3323 ctx->stream_id |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3324 state = sw_error;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3325 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3326
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3327 case sw_error:
7249
070c972336c4 gRPC: fixed possible sign extension of error and setting_value.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7242
diff changeset
3328 ctx->error = (ngx_uint_t) ch << 24;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3329 state = sw_error_2;
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 case sw_error_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3333 ctx->error |= ch << 16;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3334 state = sw_error_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3335 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3336
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3337 case sw_error_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3338 ctx->error |= ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3339 state = sw_error_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3340 break;
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 case sw_error_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3343 ctx->error |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3344 state = sw_debug;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3345 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3346
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3347 case sw_debug:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3348 break;
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 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3353 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3354 b->pos = p;
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 if (ctx->rest > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3357 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3358 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3359
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3360 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3361 "grpc goaway: %ui, stream %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3362 ctx->error, ctx->stream_id);
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 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3365
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3366 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3367 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3368
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3369
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3370 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3371 ngx_http_grpc_parse_window_update(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3372 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3373 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3374 u_char ch, *p, *last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3375 enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3376 sw_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3377 sw_size_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3378 sw_size_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3379 sw_size_4
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3380 } state;
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 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3383 last = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3384
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3385 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3386 last = b->pos + ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3387 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3388
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3389 state = ctx->frame_state;
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 if (state == sw_start) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3392 if (ctx->rest != 4) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3393 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3394 "upstream sent window update frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3395 "with invalid length: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3396 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3397 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3398 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3399 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3400
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3401 for (p = b->pos; p < last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3402 ch = *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3403
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3404 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3405 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3406 "grpc window update byte: %02Xd s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3407 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3408
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3409 switch (state) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3410
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3411 case sw_start:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3412 ctx->window_update = (ch & 0x7f) << 24;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3413 state = sw_size_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3414 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3415
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3416 case sw_size_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3417 ctx->window_update |= ch << 16;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3418 state = sw_size_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3419 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3420
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3421 case sw_size_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3422 ctx->window_update |= ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3423 state = sw_size_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3424 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3425
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3426 case sw_size_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3427 ctx->window_update |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3428 state = sw_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3429 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3430 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3431 }
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 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3434 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3435 b->pos = p;
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 if (ctx->rest > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3438 return NGX_AGAIN;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3441 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3442
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3443 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3444 "grpc window update: %ui", ctx->window_update);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3445
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3446 if (ctx->stream_id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3447
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3448 if (ctx->window_update > (size_t) NGX_HTTP_V2_MAX_WINDOW
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3449 - ctx->send_window)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3450 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3451 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3452 "upstream sent too large window update");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3453 return NGX_ERROR;
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 ctx->send_window += ctx->window_update;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3457
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3458 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3459
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3460 if (ctx->window_update > NGX_HTTP_V2_MAX_WINDOW
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3461 - ctx->connection->send_window)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3462 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3463 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3464 "upstream sent too large window update");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3465 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3466 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3467
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3468 ctx->connection->send_window += ctx->window_update;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3469 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3470
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3471 return NGX_OK;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3474
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3475 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3476 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
3477 ngx_buf_t *b)
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 u_char ch, *p, *last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3480 ssize_t window_update;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3481 enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3482 sw_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3483 sw_id,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3484 sw_id_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3485 sw_value,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3486 sw_value_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3487 sw_value_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3488 sw_value_4
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3489 } state;
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 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3492 last = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3493
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3494 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3495 last = b->pos + ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3496 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3497
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3498 state = ctx->frame_state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3499
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3500 if (state == sw_start) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3501
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3502 if (ctx->stream_id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3503 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3504 "upstream sent settings frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3505 "with non-zero stream id: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3506 ctx->stream_id);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3507 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3510 if (ctx->flags & NGX_HTTP_V2_ACK_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3511 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3512 "grpc settings ack");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3513
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3514 if (ctx->rest != 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3515 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3516 "upstream sent settings frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3517 "with ack flag and non-zero length: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3518 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3519 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3522 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3523
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3524 return NGX_OK;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3527 if (ctx->rest % 6 != 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3528 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3529 "upstream sent settings frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3530 "with invalid length: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3531 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3532 return NGX_ERROR;
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 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3535
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3536 for (p = b->pos; p < last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3537 ch = *p;
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 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3540 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3541 "grpc settings byte: %02Xd s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3542 #endif
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 switch (state) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3545
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3546 case sw_start:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3547 case sw_id:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3548 ctx->setting_id = ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3549 state = sw_id_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3550 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3551
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3552 case sw_id_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3553 ctx->setting_id |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3554 state = sw_value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3555 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3556
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3557 case sw_value:
7249
070c972336c4 gRPC: fixed possible sign extension of error and setting_value.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7242
diff changeset
3558 ctx->setting_value = (ngx_uint_t) ch << 24;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3559 state = sw_value_2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3560 break;
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 case sw_value_2:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3563 ctx->setting_value |= ch << 16;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3564 state = sw_value_3;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3565 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3566
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3567 case sw_value_3:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3568 ctx->setting_value |= ch << 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3569 state = sw_value_4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3570 break;
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 case sw_value_4:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3573 ctx->setting_value |= ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3574 state = sw_id;
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 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3577 "grpc setting: %ui %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3578 ctx->setting_id, ctx->setting_value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3579
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3580 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3581 * The following settings are defined by the protocol:
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 * SETTINGS_HEADER_TABLE_SIZE, SETTINGS_ENABLE_PUSH,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3584 * SETTINGS_MAX_CONCURRENT_STREAMS, SETTINGS_INITIAL_WINDOW_SIZE,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3585 * SETTINGS_MAX_FRAME_SIZE, SETTINGS_MAX_HEADER_LIST_SIZE
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3586 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3587 * Only SETTINGS_INITIAL_WINDOW_SIZE seems to be needed in
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3588 * a simple client.
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3589 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3590
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3591 if (ctx->setting_id == 0x04) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3592 /* SETTINGS_INITIAL_WINDOW_SIZE */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3593
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3594 if (ctx->setting_value > NGX_HTTP_V2_MAX_WINDOW) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3595 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3596 "upstream sent settings frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3597 "with too large initial window size: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3598 ctx->setting_value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3599 return NGX_ERROR;
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 window_update = ctx->setting_value
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3603 - ctx->connection->init_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3604 ctx->connection->init_window = ctx->setting_value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3605
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3606 if (ctx->send_window > 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3607 && window_update > (ssize_t) NGX_HTTP_V2_MAX_WINDOW
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3608 - ctx->send_window)
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 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3611 "upstream sent settings frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3612 "with too large initial window size: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3613 ctx->setting_value);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3614 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3617 ctx->send_window += window_update;
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 break;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3621 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3622 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3623
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3624 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3625 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3626 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3627
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3628 if (ctx->rest > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3629 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3630 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3631
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3632 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3633
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3634 return ngx_http_grpc_send_settings_ack(r, ctx);
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3637
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3638 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3639 ngx_http_grpc_parse_ping(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3640 ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b)
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 u_char ch, *p, *last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3643 enum {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3644 sw_start = 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3645 sw_data_2,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3646 sw_data_3,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3647 sw_data_4,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3648 sw_data_5,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3649 sw_data_6,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3650 sw_data_7,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3651 sw_data_8
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3652 } state;
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 if (b->last - b->pos < (ssize_t) ctx->rest) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3655 last = b->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3656
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3657 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3658 last = b->pos + ctx->rest;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3659 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3660
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3661 state = ctx->frame_state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3662
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3663 if (state == sw_start) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3664
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3665 if (ctx->stream_id) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3666 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3667 "upstream sent ping frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3668 "with non-zero stream id: %ui",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3669 ctx->stream_id);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3670 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3671 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3672
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3673 if (ctx->rest != 8) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3674 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3675 "upstream sent ping frame "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3676 "with invalid length: %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3677 ctx->rest);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3678 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3679 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3680
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3681 if (ctx->flags & NGX_HTTP_V2_ACK_FLAG) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3682 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3683 "upstream sent ping frame with ack flag");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3684 return NGX_ERROR;
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 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3687
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3688 for (p = b->pos; p < last; p++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3689 ch = *p;
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 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3692 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3693 "grpc ping byte: %02Xd s:%d", ch, state);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3694 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3695
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3696 if (state < sw_data_8) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3697 ctx->ping_data[state] = ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3698 state++;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3699
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3700 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3701 ctx->ping_data[7] = ch;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3702 state = sw_start;
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 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3705 "grpc ping");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3706 }
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3709 ctx->rest -= p - b->pos;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3710 ctx->frame_state = state;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3711 b->pos = p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3712
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3713 if (ctx->rest > 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3714 return NGX_AGAIN;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3715 }
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 ctx->state = ngx_http_grpc_st_start;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3718
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3719 return ngx_http_grpc_send_ping_ack(r, ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3720 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3721
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3722
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3723 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3724 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
3725 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3726 ngx_chain_t *cl, **ll;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3727 ngx_http_grpc_frame_t *f;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3728
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3729 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3730 "grpc send settings ack");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3731
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3732 for (cl = ctx->out, ll = &ctx->out; cl; cl = cl->next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3733 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3734 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3735
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3736 cl = ngx_http_grpc_get_buf(r, ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3737 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3738 return NGX_ERROR;
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 f = (ngx_http_grpc_frame_t *) cl->buf->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3742 cl->buf->last += sizeof(ngx_http_grpc_frame_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3743
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3744 f->length_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3745 f->length_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3746 f->length_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3747 f->type = NGX_HTTP_V2_SETTINGS_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3748 f->flags = NGX_HTTP_V2_ACK_FLAG;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3749 f->stream_id_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3750 f->stream_id_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3751 f->stream_id_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3752 f->stream_id_3 = 0;
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 *ll = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3755
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3756 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3757 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3758
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3759
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3760 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3761 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
3762 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3763 ngx_chain_t *cl, **ll;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3764 ngx_http_grpc_frame_t *f;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3765
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3766 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3767 "grpc send ping ack");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3768
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3769 for (cl = ctx->out, ll = &ctx->out; cl; cl = cl->next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3770 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3771 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3772
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3773 cl = ngx_http_grpc_get_buf(r, ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3774 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3775 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3778 f = (ngx_http_grpc_frame_t *) cl->buf->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3779 cl->buf->last += sizeof(ngx_http_grpc_frame_t);
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 f->length_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3782 f->length_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3783 f->length_2 = 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3784 f->type = NGX_HTTP_V2_PING_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3785 f->flags = NGX_HTTP_V2_ACK_FLAG;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3786 f->stream_id_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3787 f->stream_id_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3788 f->stream_id_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3789 f->stream_id_3 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3790
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3791 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
3792
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3793 *ll = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3794
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3795 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3796 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3797
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3798
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3799 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3800 ngx_http_grpc_send_window_update(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3801 ngx_http_grpc_ctx_t *ctx)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3802 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3803 size_t n;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3804 ngx_chain_t *cl, **ll;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3805 ngx_http_grpc_frame_t *f;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3806
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3807 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3808 "grpc send window update: %uz %uz",
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3809 ctx->connection->recv_window, ctx->recv_window);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3810
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3811 for (cl = ctx->out, ll = &ctx->out; cl; cl = cl->next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3812 ll = &cl->next;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3813 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3814
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3815 cl = ngx_http_grpc_get_buf(r, ctx);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3816 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3817 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3818 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3819
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3820 f = (ngx_http_grpc_frame_t *) cl->buf->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3821 cl->buf->last += sizeof(ngx_http_grpc_frame_t);
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->length_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3824 f->length_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3825 f->length_2 = 4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3826 f->type = NGX_HTTP_V2_WINDOW_UPDATE_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3827 f->flags = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3828 f->stream_id_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3829 f->stream_id_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3830 f->stream_id_2 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3831 f->stream_id_3 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3832
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3833 n = NGX_HTTP_V2_MAX_WINDOW - ctx->connection->recv_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3834 ctx->connection->recv_window = NGX_HTTP_V2_MAX_WINDOW;
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 *cl->buf->last++ = (u_char) ((n >> 24) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3837 *cl->buf->last++ = (u_char) ((n >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3838 *cl->buf->last++ = (u_char) ((n >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3839 *cl->buf->last++ = (u_char) (n & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3840
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3841 f = (ngx_http_grpc_frame_t *) cl->buf->last;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3842 cl->buf->last += sizeof(ngx_http_grpc_frame_t);
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 f->length_0 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3845 f->length_1 = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3846 f->length_2 = 4;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3847 f->type = NGX_HTTP_V2_WINDOW_UPDATE_FRAME;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3848 f->flags = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3849 f->stream_id_0 = (u_char) ((ctx->id >> 24) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3850 f->stream_id_1 = (u_char) ((ctx->id >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3851 f->stream_id_2 = (u_char) ((ctx->id >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3852 f->stream_id_3 = (u_char) (ctx->id & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3853
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3854 n = NGX_HTTP_V2_MAX_WINDOW - ctx->recv_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3855 ctx->recv_window = NGX_HTTP_V2_MAX_WINDOW;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3856
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3857 *cl->buf->last++ = (u_char) ((n >> 24) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3858 *cl->buf->last++ = (u_char) ((n >> 16) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3859 *cl->buf->last++ = (u_char) ((n >> 8) & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3860 *cl->buf->last++ = (u_char) (n & 0xff);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3861
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3862 *ll = cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3863
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3864 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3865 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3866
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3867
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3868 static ngx_chain_t *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3869 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
3870 {
7305
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
3871 u_char *start;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3872 ngx_buf_t *b;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3873 ngx_chain_t *cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3874
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3875 cl = ngx_chain_get_free_buf(r->pool, &ctx->free);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3876 if (cl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3877 return NULL;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3880 b = cl->buf;
7305
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
3881 start = b->start;
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
3882
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
3883 if (start == NULL) {
7233
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 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3886 * each buffer is large enough to hold two window update
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3887 * frames in a row
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
7305
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
3890 start = ngx_palloc(r->pool, 2 * sizeof(ngx_http_grpc_frame_t) + 8);
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
3891 if (start == NULL) {
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3892 return NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3893 }
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 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3896
7305
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
3897 ngx_memzero(b, sizeof(ngx_buf_t));
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
3898
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
3899 b->start = start;
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
3900 b->pos = start;
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
3901 b->last = start;
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
3902 b->end = start + 2 * sizeof(ngx_http_grpc_frame_t) + 8;
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
3903
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
3904 b->tag = (ngx_buf_tag_t) &ngx_http_grpc_body_output_filter;
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
3905 b->temporary = 1;
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
3906 b->flush = 1;
6cfd45d4c754 gRPC: clearing buffers in ngx_http_grpc_get_buf().
Maxim Dounin <mdounin@mdounin.ru>
parents: 7271
diff changeset
3907
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3908 return cl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3909 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3910
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3911
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3912 static ngx_http_grpc_ctx_t *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3913 ngx_http_grpc_get_ctx(ngx_http_request_t *r)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3914 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3915 ngx_http_grpc_ctx_t *ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3916 ngx_http_upstream_t *u;
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 ctx = ngx_http_get_module_ctx(r, ngx_http_grpc_module);
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 if (ctx->connection == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3921 u = r->upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3922
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3923 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
3924 return NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3925 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3926 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3927
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3928 return ctx;
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 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3933 ngx_http_grpc_get_connection_data(ngx_http_request_t *r,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3934 ngx_http_grpc_ctx_t *ctx, ngx_peer_connection_t *pc)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3935 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3936 ngx_connection_t *c;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3937 ngx_pool_cleanup_t *cln;
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 c = pc->connection;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3940
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3941 if (pc->cached) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3942
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3943 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3944 * for cached connections, connection data can be found
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3945 * in the cleanup handler
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 for (cln = c->pool->cleanup; cln; cln = cln->next) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3949 if (cln->handler == ngx_http_grpc_cleanup) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3950 ctx->connection = cln->data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3951 break;
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 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3954
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3955 if (ctx->connection == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3956 ngx_log_error(NGX_LOG_ERR, c->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3957 "no connection data found for "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3958 "keepalive http2 connection");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3959 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3960 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3961
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3962 ctx->send_window = ctx->connection->init_window;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3963 ctx->recv_window = NGX_HTTP_V2_MAX_WINDOW;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3964
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3965 ctx->connection->last_stream_id += 2;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3966 ctx->id = ctx->connection->last_stream_id;
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 return NGX_OK;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3971 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
3972 if (cln == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3973 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3974 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3975
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3976 cln->handler = ngx_http_grpc_cleanup;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3977 ctx->connection = cln->data;
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 ctx->connection->init_window = NGX_HTTP_V2_DEFAULT_WINDOW;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3980 ctx->connection->send_window = NGX_HTTP_V2_DEFAULT_WINDOW;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3981 ctx->connection->recv_window = NGX_HTTP_V2_MAX_WINDOW;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3982
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3983 ctx->send_window = NGX_HTTP_V2_DEFAULT_WINDOW;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3984 ctx->recv_window = NGX_HTTP_V2_MAX_WINDOW;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3985
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3986 ctx->id = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3987 ctx->connection->last_stream_id = 1;
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 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3990 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3991
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 static void
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3994 ngx_http_grpc_cleanup(void *data)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3995 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3996 #if 0
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3997 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3998 "grpc cleanup");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3999 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4000 return;
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
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 static void
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4005 ngx_http_grpc_abort_request(ngx_http_request_t *r)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4006 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4007 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4008 "abort grpc request");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4009 return;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4010 }
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4013 static void
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4014 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
4015 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4016 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4017 "finalize grpc request");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4018 return;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4019 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4020
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4021
7234
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4022 static ngx_int_t
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4023 ngx_http_grpc_internal_trailers_variable(ngx_http_request_t *r,
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4024 ngx_http_variable_value_t *v, uintptr_t data)
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4025 {
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4026 ngx_table_elt_t *te;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4027
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4028 te = r->headers_in.te;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4029
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4030 if (te == NULL) {
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4031 v->not_found = 1;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4032 return NGX_OK;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4033 }
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4034
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4035 if (ngx_strlcasestrn(te->value.data, te->value.data + te->value.len,
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4036 (u_char *) "trailers", 8 - 1)
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4037 == NULL)
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4038 {
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4039 v->not_found = 1;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4040 return NGX_OK;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4041 }
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4042
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4043 v->valid = 1;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4044 v->no_cacheable = 0;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4045 v->not_found = 0;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4046
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4047 v->data = (u_char *) "trailers";
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4048 v->len = sizeof("trailers") - 1;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4049
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4050 return NGX_OK;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4051 }
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4052
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4053
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4054 static ngx_int_t
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4055 ngx_http_grpc_add_variables(ngx_conf_t *cf)
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4056 {
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4057 ngx_http_variable_t *var, *v;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4058
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4059 for (v = ngx_http_grpc_vars; v->name.len; v++) {
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4060 var = ngx_http_add_variable(cf, &v->name, v->flags);
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4061 if (var == NULL) {
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4062 return NGX_ERROR;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4063 }
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4064
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4065 var->get_handler = v->get_handler;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4066 var->data = v->data;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4067 }
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4068
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4069 return NGX_OK;
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4070 }
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4071
c693daca57f7 gRPC: special handling of the TE request header.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7233
diff changeset
4072
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4073 static void *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4074 ngx_http_grpc_create_loc_conf(ngx_conf_t *cf)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4075 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4076 ngx_http_grpc_loc_conf_t *conf;
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 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
4079 if (conf == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4080 return NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4081 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4082
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4083 /*
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4084 * set by ngx_pcalloc():
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4085 *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4086 * conf->upstream.ignore_headers = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4087 * conf->upstream.next_upstream = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4088 * conf->upstream.hide_headers_hash = { NULL, 0 };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4089 * conf->upstream.ssl_name = NULL;
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 * conf->headers_source = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4092 * conf->headers.lengths = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4093 * conf->headers.values = NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4094 * conf->headers.hash = { NULL, 0 };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4095 * conf->host = { 0, NULL };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4096 * conf->host_set = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4097 * conf->ssl = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4098 * conf->ssl_protocols = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4099 * conf->ssl_ciphers = { 0, NULL };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4100 * conf->ssl_trusted_certificate = { 0, NULL };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4101 * conf->ssl_crl = { 0, NULL };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4102 * conf->ssl_certificate = { 0, NULL };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4103 * conf->ssl_certificate_key = { 0, NULL };
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4104 */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4105
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4106 conf->upstream.local = NGX_CONF_UNSET_PTR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4107 conf->upstream.next_upstream_tries = NGX_CONF_UNSET_UINT;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4108 conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4109 conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4110 conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4111 conf->upstream.next_upstream_timeout = NGX_CONF_UNSET_MSEC;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4112
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4113 conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4114
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4115 conf->upstream.hide_headers = NGX_CONF_UNSET_PTR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4116 conf->upstream.pass_headers = NGX_CONF_UNSET_PTR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4117
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4118 conf->upstream.intercept_errors = NGX_CONF_UNSET;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4119
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4120 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4121 conf->upstream.ssl_session_reuse = NGX_CONF_UNSET;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4122 conf->upstream.ssl_server_name = NGX_CONF_UNSET;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4123 conf->upstream.ssl_verify = NGX_CONF_UNSET;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4124 conf->ssl_verify_depth = NGX_CONF_UNSET_UINT;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4125 conf->ssl_passwords = NGX_CONF_UNSET_PTR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4126 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4127
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4128 /* the hardcoded values */
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4129 conf->upstream.cyclic_temp_file = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4130 conf->upstream.buffering = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4131 conf->upstream.ignore_client_abort = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4132 conf->upstream.send_lowat = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4133 conf->upstream.bufs.num = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4134 conf->upstream.busy_buffers_size = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4135 conf->upstream.max_temp_file_size = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4136 conf->upstream.temp_file_write_size = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4137 conf->upstream.pass_request_headers = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4138 conf->upstream.pass_request_body = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4139 conf->upstream.force_ranges = 0;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4140 conf->upstream.pass_trailers = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4141 conf->upstream.preserve_output = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4142
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4143 ngx_str_set(&conf->upstream.module, "grpc");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4144
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4145 return conf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4146 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4147
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4148
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4149 static char *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4150 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
4151 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4152 ngx_http_grpc_loc_conf_t *prev = parent;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4153 ngx_http_grpc_loc_conf_t *conf = child;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4154
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4155 ngx_int_t rc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4156 ngx_hash_init_t hash;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4157 ngx_http_core_loc_conf_t *clcf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4158
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4159 ngx_conf_merge_ptr_value(conf->upstream.local,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4160 prev->upstream.local, NULL);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4161
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4162 ngx_conf_merge_uint_value(conf->upstream.next_upstream_tries,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4163 prev->upstream.next_upstream_tries, 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4164
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4165 ngx_conf_merge_msec_value(conf->upstream.connect_timeout,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4166 prev->upstream.connect_timeout, 60000);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4167
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4168 ngx_conf_merge_msec_value(conf->upstream.send_timeout,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4169 prev->upstream.send_timeout, 60000);
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 ngx_conf_merge_msec_value(conf->upstream.read_timeout,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4172 prev->upstream.read_timeout, 60000);
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 ngx_conf_merge_msec_value(conf->upstream.next_upstream_timeout,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4175 prev->upstream.next_upstream_timeout, 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4176
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4177 ngx_conf_merge_size_value(conf->upstream.buffer_size,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4178 prev->upstream.buffer_size,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4179 (size_t) ngx_pagesize);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4180
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4181 ngx_conf_merge_bitmask_value(conf->upstream.ignore_headers,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4182 prev->upstream.ignore_headers,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4183 NGX_CONF_BITMASK_SET);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4184
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4185 ngx_conf_merge_bitmask_value(conf->upstream.next_upstream,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4186 prev->upstream.next_upstream,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4187 (NGX_CONF_BITMASK_SET
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4188 |NGX_HTTP_UPSTREAM_FT_ERROR
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4189 |NGX_HTTP_UPSTREAM_FT_TIMEOUT));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4190
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4191 if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4192 conf->upstream.next_upstream = NGX_CONF_BITMASK_SET
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4193 |NGX_HTTP_UPSTREAM_FT_OFF;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4194 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4195
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4196 ngx_conf_merge_value(conf->upstream.intercept_errors,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4197 prev->upstream.intercept_errors, 0);
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 #if (NGX_HTTP_SSL)
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 ngx_conf_merge_value(conf->upstream.ssl_session_reuse,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4202 prev->upstream.ssl_session_reuse, 1);
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 ngx_conf_merge_bitmask_value(conf->ssl_protocols, prev->ssl_protocols,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4205 (NGX_CONF_BITMASK_SET|NGX_SSL_TLSv1
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4206 |NGX_SSL_TLSv1_1|NGX_SSL_TLSv1_2));
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 ngx_conf_merge_str_value(conf->ssl_ciphers, prev->ssl_ciphers,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4209 "DEFAULT");
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 if (conf->upstream.ssl_name == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4212 conf->upstream.ssl_name = prev->upstream.ssl_name;
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 ngx_conf_merge_value(conf->upstream.ssl_server_name,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4216 prev->upstream.ssl_server_name, 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4217 ngx_conf_merge_value(conf->upstream.ssl_verify,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4218 prev->upstream.ssl_verify, 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4219 ngx_conf_merge_uint_value(conf->ssl_verify_depth,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4220 prev->ssl_verify_depth, 1);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4221 ngx_conf_merge_str_value(conf->ssl_trusted_certificate,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4222 prev->ssl_trusted_certificate, "");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4223 ngx_conf_merge_str_value(conf->ssl_crl, prev->ssl_crl, "");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4224
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4225 ngx_conf_merge_str_value(conf->ssl_certificate,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4226 prev->ssl_certificate, "");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4227 ngx_conf_merge_str_value(conf->ssl_certificate_key,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4228 prev->ssl_certificate_key, "");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4229 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
4230
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4231 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
4232 return NGX_CONF_ERROR;
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 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4236
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4237 hash.max_size = 512;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4238 hash.bucket_size = ngx_align(64, ngx_cacheline_size);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4239 hash.name = "grpc_headers_hash";
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_http_upstream_hide_headers_hash(cf, &conf->upstream,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4242 &prev->upstream, ngx_http_grpc_hide_headers, &hash)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4243 != NGX_OK)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4244 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4245 return NGX_CONF_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4246 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4247
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4248 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
4249
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4250 if (clcf->noname && conf->upstream.upstream == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4251 conf->upstream.upstream = prev->upstream.upstream;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4252 conf->host = prev->host;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4253 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4254 conf->upstream.ssl = prev->upstream.ssl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4255 #endif
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4258 if (clcf->lmt_excpt && clcf->handler == NULL && conf->upstream.upstream) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4259 clcf->handler = ngx_http_grpc_handler;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4260 }
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 (conf->headers_source == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4263 conf->headers = prev->headers;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4264 conf->headers_source = prev->headers_source;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4265 conf->host_set = prev->host_set;
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 rc = ngx_http_grpc_init_headers(cf, conf, &conf->headers,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4269 ngx_http_grpc_headers);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4270 if (rc != NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4271 return NGX_CONF_ERROR;
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
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 * special handling to preserve conf->headers in the "http" section
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4276 * to inherit it to all servers
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4277 */
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 if (prev->headers.hash.buckets == NULL
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4280 && conf->headers_source == prev->headers_source)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4281 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4282 prev->headers = conf->headers;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4283 prev->host_set = conf->host_set;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4284 }
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 return NGX_CONF_OK;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4289
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4290 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4291 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
4292 ngx_http_grpc_headers_t *headers, ngx_keyval_t *default_headers)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4293 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4294 u_char *p;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4295 size_t size;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4296 uintptr_t *code;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4297 ngx_uint_t i;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4298 ngx_array_t headers_names, headers_merged;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4299 ngx_keyval_t *src, *s, *h;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4300 ngx_hash_key_t *hk;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4301 ngx_hash_init_t hash;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4302 ngx_http_script_compile_t sc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4303 ngx_http_script_copy_code_t *copy;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4304
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4305 if (headers->hash.buckets) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4306 return NGX_OK;
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 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
4310 != NGX_OK)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4311 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4312 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4313 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4314
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4315 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
4316 != NGX_OK)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4317 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4318 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4319 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4320
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4321 headers->lengths = ngx_array_create(cf->pool, 64, 1);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4322 if (headers->lengths == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4323 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4324 }
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 headers->values = ngx_array_create(cf->pool, 512, 1);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4327 if (headers->values == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4328 return NGX_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4331 if (conf->headers_source) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4332
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4333 src = conf->headers_source->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4334 for (i = 0; i < conf->headers_source->nelts; i++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4335
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4336 if (src[i].key.len == 4
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4337 && ngx_strncasecmp(src[i].key.data, (u_char *) "Host", 4) == 0)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4338 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4339 conf->host_set = 1;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4342 s = ngx_array_push(&headers_merged);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4343 if (s == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4344 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4345 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4346
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4347 *s = src[i];
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 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4350
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4351 h = default_headers;
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 while (h->key.len) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4354
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4355 src = headers_merged.elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4356 for (i = 0; i < headers_merged.nelts; i++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4357 if (ngx_strcasecmp(h->key.data, src[i].key.data) == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4358 goto next;
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 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4361
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4362 s = ngx_array_push(&headers_merged);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4363 if (s == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4364 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4365 }
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 *s = *h;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4368
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4369 next:
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4370
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4371 h++;
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
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 src = headers_merged.elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4376 for (i = 0; i < headers_merged.nelts; i++) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4377
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4378 hk = ngx_array_push(&headers_names);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4379 if (hk == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4380 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4381 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4382
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4383 hk->key = src[i].key;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4384 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
4385 hk->value = (void *) 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4386
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4387 if (src[i].value.len == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4388 continue;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4389 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4390
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4391 copy = ngx_array_push_n(headers->lengths,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4392 sizeof(ngx_http_script_copy_code_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4393 if (copy == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4394 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4395 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4396
7271
9e25a5380a21 Silenced -Wcast-function-type warnings (closes #1546).
Sergey Kandaurov <pluknet@nginx.com>
parents: 7249
diff changeset
4397 copy->code = (ngx_http_script_code_pt) (void *)
9e25a5380a21 Silenced -Wcast-function-type warnings (closes #1546).
Sergey Kandaurov <pluknet@nginx.com>
parents: 7249
diff changeset
4398 ngx_http_script_copy_len_code;
7233
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4399 copy->len = src[i].key.len;
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 size = (sizeof(ngx_http_script_copy_code_t)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4402 + src[i].key.len + sizeof(uintptr_t) - 1)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4403 & ~(sizeof(uintptr_t) - 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 copy = ngx_array_push_n(headers->values, size);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4406 if (copy == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4407 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4408 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4409
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4410 copy->code = ngx_http_script_copy_code;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4411 copy->len = src[i].key.len;
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 p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4414 ngx_memcpy(p, src[i].key.data, src[i].key.len);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4415
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4416 ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4417
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4418 sc.cf = cf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4419 sc.source = &src[i].value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4420 sc.flushes = &headers->flushes;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4421 sc.lengths = &headers->lengths;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4422 sc.values = &headers->values;
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 if (ngx_http_script_compile(&sc) != NGX_OK) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4425 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4426 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4427
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4428 code = ngx_array_push_n(headers->lengths, sizeof(uintptr_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4429 if (code == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4430 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4431 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4432
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4433 *code = (uintptr_t) NULL;
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 code = ngx_array_push_n(headers->values, sizeof(uintptr_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4436 if (code == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4437 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4438 }
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 *code = (uintptr_t) NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4441 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4442
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4443 code = ngx_array_push_n(headers->lengths, sizeof(uintptr_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4444 if (code == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4445 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4446 }
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 *code = (uintptr_t) NULL;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4449
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 hash.hash = &headers->hash;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4452 hash.key = ngx_hash_key_lc;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4453 hash.max_size = 512;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4454 hash.bucket_size = 64;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4455 hash.name = "grpc_headers_hash";
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4456 hash.pool = cf->pool;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4457 hash.temp_pool = NULL;
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 return ngx_hash_init(&hash, headers_names.elts, headers_names.nelts);
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
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_pass(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 size_t add;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4469 ngx_str_t *value, *url;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4470 ngx_url_t u;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4471 ngx_http_core_loc_conf_t *clcf;
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 if (glcf->upstream.upstream) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4474 return "is duplicate";
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4477 value = cf->args->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4478 url = &value[1];
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4479
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4480 if (ngx_strncasecmp(url->data, (u_char *) "grpc://", 7) == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4481 add = 7;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4482
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4483 } else if (ngx_strncasecmp(url->data, (u_char *) "grpcs://", 8) == 0) {
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 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4486 glcf->ssl = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4487
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4488 add = 8;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4489 #else
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4490 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4491 "grpcs protocol requires SSL support");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4492 return NGX_CONF_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4493 #endif
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 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4496 add = 0;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4499 ngx_memzero(&u, sizeof(ngx_url_t));
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 u.url.len = url->len - add;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4502 u.url.data = url->data + add;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4503 u.no_resolve = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4504
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4505 glcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4506 if (glcf->upstream.upstream == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4507 return NGX_CONF_ERROR;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4510 if (u.family != AF_UNIX) {
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 (u.no_port) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4513 glcf->host = u.host;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4514
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4515 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4516 glcf->host.len = u.host.len + 1 + u.port_text.len;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4517 glcf->host.data = u.host.data;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4518 }
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 } else {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4521 ngx_str_set(&glcf->host, "localhost");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4522 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4523
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4524 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
4525
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4526 clcf->handler = ngx_http_grpc_handler;
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 if (clcf->name.data[clcf->name.len - 1] == '/') {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4529 clcf->auto_redirect = 1;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4530 }
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_CONF_OK;
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
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4536 #if (NGX_HTTP_SSL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4537
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4538 static char *
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4539 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
4540 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4541 ngx_http_grpc_loc_conf_t *glcf = conf;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4542
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4543 ngx_str_t *value;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4544
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4545 if (glcf->ssl_passwords != NGX_CONF_UNSET_PTR) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4546 return "is duplicate";
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4547 }
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 value = cf->args->elts;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4550
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4551 glcf->ssl_passwords = ngx_ssl_read_password_file(cf, &value[1]);
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 if (glcf->ssl_passwords == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4554 return NGX_CONF_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4555 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4556
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4557 return NGX_CONF_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4558 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4559
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 static ngx_int_t
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4562 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
4563 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4564 ngx_pool_cleanup_t *cln;
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 glcf->upstream.ssl = ngx_pcalloc(cf->pool, sizeof(ngx_ssl_t));
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4567 if (glcf->upstream.ssl == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4568 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4569 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4570
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4571 glcf->upstream.ssl->log = cf->log;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4572
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4573 if (ngx_ssl_create(glcf->upstream.ssl, glcf->ssl_protocols, NULL)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4574 != NGX_OK)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4575 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4576 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4577 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4578
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4579 cln = ngx_pool_cleanup_add(cf->pool, 0);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4580 if (cln == NULL) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4581 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4582 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4583
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4584 cln->handler = ngx_ssl_cleanup_ctx;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4585 cln->data = glcf->upstream.ssl;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4586
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4587 if (glcf->ssl_certificate.len) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4588
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4589 if (glcf->ssl_certificate_key.len == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4590 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4591 "no \"grpc_ssl_certificate_key\" is defined "
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4592 "for certificate \"%V\"", &glcf->ssl_certificate);
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4593 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4594 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4595
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4596 if (ngx_ssl_certificate(cf, glcf->upstream.ssl, &glcf->ssl_certificate,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4597 &glcf->ssl_certificate_key, glcf->ssl_passwords)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4598 != NGX_OK)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4599 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4600 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4601 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4602 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4603
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4604 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
4605 != NGX_OK)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4606 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4607 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4608 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4609
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4610 if (glcf->upstream.ssl_verify) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4611 if (glcf->ssl_trusted_certificate.len == 0) {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4612 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4613 "no grpc_ssl_trusted_certificate for grpc_ssl_verify");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4614 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4615 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4616
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4617 if (ngx_ssl_trusted_certificate(cf, glcf->upstream.ssl,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4618 &glcf->ssl_trusted_certificate,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4619 glcf->ssl_verify_depth)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4620 != NGX_OK)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4621 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4622 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4623 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4624
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4625 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
4626 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4627 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4628 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4629
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4630 #ifdef TLSEXT_TYPE_application_layer_protocol_negotiation
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4631
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4632 if (SSL_CTX_set_alpn_protos(glcf->upstream.ssl->ctx,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4633 (u_char *) "\x02h2", 3)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4634 != 0)
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4635 {
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4636 ngx_ssl_error(NGX_LOG_EMERG, cf->log, 0,
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4637 "SSL_CTX_set_alpn_protos() failed");
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4638 return NGX_ERROR;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4639 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4640
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4641 #endif
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4642
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4643 return NGX_OK;
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4644 }
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4645
2713b2dbf5bb The gRPC proxy module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4646 #endif