Mercurial > hg > nginx-quic
comparison src/core/ngx_proxy_protocol.c @ 7590:06b01840bd42
Core: moved PROXY protocol fields out of ngx_connection_t.
Now a new structure ngx_proxy_protocol_t holds these fields. This allows
to add more PROXY protocol fields in the future without modifying the
connection structure.
author | Roman Arutyunyan <arut@nginx.com> |
---|---|
date | Mon, 21 Oct 2019 18:06:19 +0300 |
parents | 1fd992589ffe |
children | 89adf49fe76a |
comparison
equal
deleted
inserted
replaced
7589:486d2e0b1b6f | 7590:06b01840bd42 |
---|---|
45 | 45 |
46 | 46 |
47 u_char * | 47 u_char * |
48 ngx_proxy_protocol_read(ngx_connection_t *c, u_char *buf, u_char *last) | 48 ngx_proxy_protocol_read(ngx_connection_t *c, u_char *buf, u_char *last) |
49 { | 49 { |
50 size_t len; | 50 size_t len; |
51 u_char ch, *p, *addr, *port; | 51 u_char ch, *p, *addr, *port; |
52 ngx_int_t n; | 52 ngx_int_t n; |
53 ngx_proxy_protocol_t *pp; | |
53 | 54 |
54 static const u_char signature[] = "\r\n\r\n\0\r\nQUIT\n"; | 55 static const u_char signature[] = "\r\n\r\n\0\r\nQUIT\n"; |
55 | 56 |
56 p = buf; | 57 p = buf; |
57 len = last - buf; | 58 len = last - buf; |
103 { | 104 { |
104 goto invalid; | 105 goto invalid; |
105 } | 106 } |
106 } | 107 } |
107 | 108 |
109 pp = ngx_pcalloc(c->pool, sizeof(ngx_proxy_protocol_t)); | |
110 if (pp == NULL) { | |
111 return NULL; | |
112 } | |
113 | |
108 len = p - addr - 1; | 114 len = p - addr - 1; |
109 c->proxy_protocol_addr.data = ngx_pnalloc(c->pool, len); | 115 |
110 | 116 pp->src_addr.data = ngx_pnalloc(c->pool, len); |
111 if (c->proxy_protocol_addr.data == NULL) { | 117 if (pp->src_addr.data == NULL) { |
112 return NULL; | 118 return NULL; |
113 } | 119 } |
114 | 120 |
115 ngx_memcpy(c->proxy_protocol_addr.data, addr, len); | 121 ngx_memcpy(pp->src_addr.data, addr, len); |
116 c->proxy_protocol_addr.len = len; | 122 pp->src_addr.len = len; |
117 | 123 |
118 for ( ;; ) { | 124 for ( ;; ) { |
119 if (p == last) { | 125 if (p == last) { |
120 goto invalid; | 126 goto invalid; |
121 } | 127 } |
143 | 149 |
144 if (n < 0 || n > 65535) { | 150 if (n < 0 || n > 65535) { |
145 goto invalid; | 151 goto invalid; |
146 } | 152 } |
147 | 153 |
148 c->proxy_protocol_port = (in_port_t) n; | 154 pp->src_port = (in_port_t) n; |
149 | 155 |
150 ngx_log_debug2(NGX_LOG_DEBUG_CORE, c->log, 0, | 156 ngx_log_debug2(NGX_LOG_DEBUG_CORE, c->log, 0, |
151 "PROXY protocol address: %V %d", &c->proxy_protocol_addr, | 157 "PROXY protocol address: %V %d", &pp->src_addr, |
152 c->proxy_protocol_port); | 158 pp->src_port); |
159 | |
160 c->proxy_protocol = pp; | |
153 | 161 |
154 skip: | 162 skip: |
155 | 163 |
156 for ( /* void */ ; p < last - 1; p++) { | 164 for ( /* void */ ; p < last - 1; p++) { |
157 if (p[0] == CR && p[1] == LF) { | 165 if (p[0] == CR && p[1] == LF) { |
218 u_char *end; | 226 u_char *end; |
219 size_t len; | 227 size_t len; |
220 socklen_t socklen; | 228 socklen_t socklen; |
221 ngx_uint_t version, command, family, transport; | 229 ngx_uint_t version, command, family, transport; |
222 ngx_sockaddr_t sockaddr; | 230 ngx_sockaddr_t sockaddr; |
231 ngx_proxy_protocol_t *pp; | |
223 ngx_proxy_protocol_header_t *header; | 232 ngx_proxy_protocol_header_t *header; |
224 ngx_proxy_protocol_inet_addrs_t *in; | 233 ngx_proxy_protocol_inet_addrs_t *in; |
225 #if (NGX_HAVE_INET6) | 234 #if (NGX_HAVE_INET6) |
226 ngx_proxy_protocol_inet6_addrs_t *in6; | 235 ngx_proxy_protocol_inet6_addrs_t *in6; |
227 #endif | 236 #endif |
264 "PROXY protocol v2 unsupported transport %ui", | 273 "PROXY protocol v2 unsupported transport %ui", |
265 transport); | 274 transport); |
266 return end; | 275 return end; |
267 } | 276 } |
268 | 277 |
278 pp = ngx_pcalloc(c->pool, sizeof(ngx_proxy_protocol_t)); | |
279 if (pp == NULL) { | |
280 return NULL; | |
281 } | |
282 | |
269 family = header->family_transport >> 4; | 283 family = header->family_transport >> 4; |
270 | 284 |
271 switch (family) { | 285 switch (family) { |
272 | 286 |
273 case NGX_PROXY_PROTOCOL_AF_INET: | 287 case NGX_PROXY_PROTOCOL_AF_INET: |
280 | 294 |
281 sockaddr.sockaddr_in.sin_family = AF_INET; | 295 sockaddr.sockaddr_in.sin_family = AF_INET; |
282 sockaddr.sockaddr_in.sin_port = 0; | 296 sockaddr.sockaddr_in.sin_port = 0; |
283 memcpy(&sockaddr.sockaddr_in.sin_addr, in->src_addr, 4); | 297 memcpy(&sockaddr.sockaddr_in.sin_addr, in->src_addr, 4); |
284 | 298 |
285 c->proxy_protocol_port = ngx_proxy_protocol_parse_uint16(in->src_port); | 299 pp->src_port = ngx_proxy_protocol_parse_uint16(in->src_port); |
286 | 300 |
287 socklen = sizeof(struct sockaddr_in); | 301 socklen = sizeof(struct sockaddr_in); |
288 | 302 |
289 buf += sizeof(ngx_proxy_protocol_inet_addrs_t); | 303 buf += sizeof(ngx_proxy_protocol_inet_addrs_t); |
290 | 304 |
302 | 316 |
303 sockaddr.sockaddr_in6.sin6_family = AF_INET6; | 317 sockaddr.sockaddr_in6.sin6_family = AF_INET6; |
304 sockaddr.sockaddr_in6.sin6_port = 0; | 318 sockaddr.sockaddr_in6.sin6_port = 0; |
305 memcpy(&sockaddr.sockaddr_in6.sin6_addr, in6->src_addr, 16); | 319 memcpy(&sockaddr.sockaddr_in6.sin6_addr, in6->src_addr, 16); |
306 | 320 |
307 c->proxy_protocol_port = ngx_proxy_protocol_parse_uint16(in6->src_port); | 321 pp->src_port = ngx_proxy_protocol_parse_uint16(in6->src_port); |
308 | 322 |
309 socklen = sizeof(struct sockaddr_in6); | 323 socklen = sizeof(struct sockaddr_in6); |
310 | 324 |
311 buf += sizeof(ngx_proxy_protocol_inet6_addrs_t); | 325 buf += sizeof(ngx_proxy_protocol_inet6_addrs_t); |
312 | 326 |
319 "PROXY protocol v2 unsupported address family %ui", | 333 "PROXY protocol v2 unsupported address family %ui", |
320 family); | 334 family); |
321 return end; | 335 return end; |
322 } | 336 } |
323 | 337 |
324 c->proxy_protocol_addr.data = ngx_pnalloc(c->pool, NGX_SOCKADDR_STRLEN); | 338 pp->src_addr.data = ngx_pnalloc(c->pool, NGX_SOCKADDR_STRLEN); |
325 if (c->proxy_protocol_addr.data == NULL) { | 339 if (pp->src_addr.data == NULL) { |
326 return NULL; | 340 return NULL; |
327 } | 341 } |
328 | 342 |
329 c->proxy_protocol_addr.len = ngx_sock_ntop(&sockaddr.sockaddr, socklen, | 343 pp->src_addr.len = ngx_sock_ntop(&sockaddr.sockaddr, socklen, |
330 c->proxy_protocol_addr.data, | 344 pp->src_addr.data, NGX_SOCKADDR_STRLEN, 0); |
331 NGX_SOCKADDR_STRLEN, 0); | |
332 | 345 |
333 ngx_log_debug2(NGX_LOG_DEBUG_CORE, c->log, 0, | 346 ngx_log_debug2(NGX_LOG_DEBUG_CORE, c->log, 0, |
334 "PROXY protocol v2 address: %V %d", &c->proxy_protocol_addr, | 347 "PROXY protocol v2 address: %V %d", &pp->src_addr, |
335 c->proxy_protocol_port); | 348 pp->src_port); |
336 | 349 |
337 if (buf < end) { | 350 if (buf < end) { |
338 ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0, | 351 ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0, |
339 "PROXY protocol v2 %z bytes of tlv ignored", end - buf); | 352 "PROXY protocol v2 %z bytes of tlv ignored", end - buf); |
340 } | 353 } |
341 | 354 |
355 c->proxy_protocol = pp; | |
356 | |
342 return end; | 357 return end; |
343 } | 358 } |