annotate src/core/ngx_proxy_protocol.c @ 8072:cca4c8a715de

PROXY protocol v2 TLV variables. The variables have prefix $proxy_protocol_tlv_ and are accessible by name and by type. Examples are: $proxy_protocol_tlv_0x01, $proxy_protocol_tlv_alpn.
author Roman Arutyunyan <arut@nginx.com>
date Wed, 12 Oct 2022 16:58:16 +0400
parents 017fd847f4f7
children aa663cc2a77d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5605
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
1
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
2 /*
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
3 * Copyright (C) Roman Arutyunyan
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
4 * Copyright (C) Nginx, Inc.
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
5 */
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
6
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
7
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
8 #include <ngx_config.h>
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
9 #include <ngx_core.h>
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
10
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
11
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
12 #define NGX_PROXY_PROTOCOL_AF_INET 1
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
13 #define NGX_PROXY_PROTOCOL_AF_INET6 2
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
14
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
15
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
16 #define ngx_proxy_protocol_parse_uint16(p) ((p)[0] << 8 | (p)[1])
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
17
8072
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
18 #define ngx_proxy_protocol_parse_uint32(p) \
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
19 ( ((uint32_t) (p)[0] << 24) \
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
20 + ( (p)[1] << 16) \
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
21 + ( (p)[2] << 8) \
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
22 + ( (p)[3]) )
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
23
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
24
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
25 typedef struct {
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
26 u_char signature[12];
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
27 u_char version_command;
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
28 u_char family_transport;
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
29 u_char len[2];
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
30 } ngx_proxy_protocol_header_t;
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
31
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
32
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
33 typedef struct {
7254
1fd992589ffe Core: fixed build, broken by 63e91f263a49.
Vladimir Homutov <vl@nginx.com>
parents: 7253
diff changeset
34 u_char src_addr[4];
1fd992589ffe Core: fixed build, broken by 63e91f263a49.
Vladimir Homutov <vl@nginx.com>
parents: 7253
diff changeset
35 u_char dst_addr[4];
1fd992589ffe Core: fixed build, broken by 63e91f263a49.
Vladimir Homutov <vl@nginx.com>
parents: 7253
diff changeset
36 u_char src_port[2];
1fd992589ffe Core: fixed build, broken by 63e91f263a49.
Vladimir Homutov <vl@nginx.com>
parents: 7253
diff changeset
37 u_char dst_port[2];
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
38 } ngx_proxy_protocol_inet_addrs_t;
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
39
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
40
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
41 typedef struct {
7254
1fd992589ffe Core: fixed build, broken by 63e91f263a49.
Vladimir Homutov <vl@nginx.com>
parents: 7253
diff changeset
42 u_char src_addr[16];
1fd992589ffe Core: fixed build, broken by 63e91f263a49.
Vladimir Homutov <vl@nginx.com>
parents: 7253
diff changeset
43 u_char dst_addr[16];
1fd992589ffe Core: fixed build, broken by 63e91f263a49.
Vladimir Homutov <vl@nginx.com>
parents: 7253
diff changeset
44 u_char src_port[2];
1fd992589ffe Core: fixed build, broken by 63e91f263a49.
Vladimir Homutov <vl@nginx.com>
parents: 7253
diff changeset
45 u_char dst_port[2];
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
46 } ngx_proxy_protocol_inet6_addrs_t;
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
47
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
48
8072
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
49 typedef struct {
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
50 u_char type;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
51 u_char len[2];
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
52 } ngx_proxy_protocol_tlv_t;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
53
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
54
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
55 typedef struct {
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
56 u_char client;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
57 u_char verify[4];
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
58 } ngx_proxy_protocol_tlv_ssl_t;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
59
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
60
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
61 typedef struct {
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
62 ngx_str_t name;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
63 ngx_uint_t type;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
64 } ngx_proxy_protocol_tlv_entry_t;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
65
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
66
7591
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
67 static u_char *ngx_proxy_protocol_read_addr(ngx_connection_t *c, u_char *p,
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
68 u_char *last, ngx_str_t *addr);
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
69 static u_char *ngx_proxy_protocol_read_port(u_char *p, u_char *last,
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
70 in_port_t *port, u_char sep);
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
71 static u_char *ngx_proxy_protocol_v2_read(ngx_connection_t *c, u_char *buf,
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
72 u_char *last);
8072
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
73 static ngx_int_t ngx_proxy_protocol_lookup_tlv(ngx_connection_t *c,
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
74 ngx_str_t *tlvs, ngx_uint_t type, ngx_str_t *value);
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
75
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
76
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
77 static ngx_proxy_protocol_tlv_entry_t ngx_proxy_protocol_tlv_entries[] = {
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
78 { ngx_string("alpn"), 0x01 },
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
79 { ngx_string("authority"), 0x02 },
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
80 { ngx_string("unique_id"), 0x05 },
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
81 { ngx_string("ssl"), 0x20 },
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
82 { ngx_string("netns"), 0x30 },
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
83 { ngx_null_string, 0x00 }
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
84 };
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
85
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
86
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
87 static ngx_proxy_protocol_tlv_entry_t ngx_proxy_protocol_tlv_ssl_entries[] = {
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
88 { ngx_string("version"), 0x21 },
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
89 { ngx_string("cn"), 0x22 },
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
90 { ngx_string("cipher"), 0x23 },
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
91 { ngx_string("sig_alg"), 0x24 },
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
92 { ngx_string("key_alg"), 0x25 },
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
93 { ngx_null_string, 0x00 }
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
94 };
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
95
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
96
5605
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
97 u_char *
6185
a420cb1c170b Core: renamed ngx_proxy_protocol_parse to ngx_proxy_protocol_read.
Roman Arutyunyan <arut@nginx.com>
parents: 6184
diff changeset
98 ngx_proxy_protocol_read(ngx_connection_t *c, u_char *buf, u_char *last)
5605
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
99 {
7590
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7254
diff changeset
100 size_t len;
7591
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
101 u_char *p;
7590
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7254
diff changeset
102 ngx_proxy_protocol_t *pp;
5605
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
103
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
104 static const u_char signature[] = "\r\n\r\n\0\r\nQUIT\n";
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
105
5605
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
106 p = buf;
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
107 len = last - buf;
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
108
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
109 if (len >= sizeof(ngx_proxy_protocol_header_t)
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
110 && memcmp(p, signature, sizeof(signature) - 1) == 0)
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
111 {
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
112 return ngx_proxy_protocol_v2_read(c, buf, last);
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
113 }
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
114
5605
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
115 if (len < 8 || ngx_strncmp(p, "PROXY ", 6) != 0) {
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
116 goto invalid;
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
117 }
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
118
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
119 p += 6;
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
120 len -= 6;
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
121
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
122 if (len >= 7 && ngx_strncmp(p, "UNKNOWN", 7) == 0) {
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
123 ngx_log_debug0(NGX_LOG_DEBUG_CORE, c->log, 0,
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
124 "PROXY protocol unknown protocol");
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
125 p += 7;
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
126 goto skip;
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
127 }
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
128
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
129 if (len < 5 || ngx_strncmp(p, "TCP", 3) != 0
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
130 || (p[3] != '4' && p[3] != '6') || p[4] != ' ')
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
131 {
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
132 goto invalid;
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
133 }
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
134
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
135 p += 5;
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
136
7590
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7254
diff changeset
137 pp = ngx_pcalloc(c->pool, sizeof(ngx_proxy_protocol_t));
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7254
diff changeset
138 if (pp == NULL) {
5605
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
139 return NULL;
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
140 }
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
141
7591
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
142 p = ngx_proxy_protocol_read_addr(c, p, last, &pp->src_addr);
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
143 if (p == NULL) {
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
144 goto invalid;
7590
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7254
diff changeset
145 }
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7254
diff changeset
146
7591
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
147 p = ngx_proxy_protocol_read_addr(c, p, last, &pp->dst_addr);
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
148 if (p == NULL) {
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
149 goto invalid;
6561
28c76d9d75b7 Added the $proxy_protocol_port variable.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6185
diff changeset
150 }
28c76d9d75b7 Added the $proxy_protocol_port variable.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6185
diff changeset
151
7591
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
152 p = ngx_proxy_protocol_read_port(p, last, &pp->src_port, ' ');
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
153 if (p == NULL) {
6561
28c76d9d75b7 Added the $proxy_protocol_port variable.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6185
diff changeset
154 goto invalid;
28c76d9d75b7 Added the $proxy_protocol_port variable.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6185
diff changeset
155 }
28c76d9d75b7 Added the $proxy_protocol_port variable.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6185
diff changeset
156
7591
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
157 p = ngx_proxy_protocol_read_port(p, last, &pp->dst_port, CR);
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
158 if (p == NULL) {
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
159 goto invalid;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
160 }
6561
28c76d9d75b7 Added the $proxy_protocol_port variable.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6185
diff changeset
161
7591
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
162 if (p == last) {
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
163 goto invalid;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
164 }
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
165
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
166 if (*p++ != LF) {
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
167 goto invalid;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
168 }
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
169
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
170 ngx_log_debug4(NGX_LOG_DEBUG_CORE, c->log, 0,
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
171 "PROXY protocol src: %V %d, dst: %V %d",
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
172 &pp->src_addr, pp->src_port, &pp->dst_addr, pp->dst_port);
7590
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7254
diff changeset
173
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7254
diff changeset
174 c->proxy_protocol = pp;
5605
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
175
7591
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
176 return p;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
177
5605
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
178 skip:
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
179
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
180 for ( /* void */ ; p < last - 1; p++) {
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
181 if (p[0] == CR && p[1] == LF) {
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
182 return p + 2;
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
183 }
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
184 }
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
185
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
186 invalid:
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
187
8071
017fd847f4f7 Log only the first line of user input on PROXY protocol v1 error.
Roman Arutyunyan <arut@nginx.com>
parents: 7591
diff changeset
188 for (p = buf; p < last; p++) {
017fd847f4f7 Log only the first line of user input on PROXY protocol v1 error.
Roman Arutyunyan <arut@nginx.com>
parents: 7591
diff changeset
189 if (*p == CR || *p == LF) {
017fd847f4f7 Log only the first line of user input on PROXY protocol v1 error.
Roman Arutyunyan <arut@nginx.com>
parents: 7591
diff changeset
190 break;
017fd847f4f7 Log only the first line of user input on PROXY protocol v1 error.
Roman Arutyunyan <arut@nginx.com>
parents: 7591
diff changeset
191 }
017fd847f4f7 Log only the first line of user input on PROXY protocol v1 error.
Roman Arutyunyan <arut@nginx.com>
parents: 7591
diff changeset
192 }
017fd847f4f7 Log only the first line of user input on PROXY protocol v1 error.
Roman Arutyunyan <arut@nginx.com>
parents: 7591
diff changeset
193
5605
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
194 ngx_log_error(NGX_LOG_ERR, c->log, 0,
8071
017fd847f4f7 Log only the first line of user input on PROXY protocol v1 error.
Roman Arutyunyan <arut@nginx.com>
parents: 7591
diff changeset
195 "broken header: \"%*s\"", (size_t) (p - buf), buf);
5605
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
196
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
197 return NULL;
3a72b1805c52 Added server-side support for PROXY protocol v1 (ticket #355).
Roman Arutyunyan <arut@nginx.com>
parents:
diff changeset
198 }
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
199
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
200
7591
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
201 static u_char *
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
202 ngx_proxy_protocol_read_addr(ngx_connection_t *c, u_char *p, u_char *last,
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
203 ngx_str_t *addr)
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
204 {
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
205 size_t len;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
206 u_char ch, *pos;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
207
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
208 pos = p;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
209
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
210 for ( ;; ) {
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
211 if (p == last) {
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
212 return NULL;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
213 }
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
214
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
215 ch = *p++;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
216
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
217 if (ch == ' ') {
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
218 break;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
219 }
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
220
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
221 if (ch != ':' && ch != '.'
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
222 && (ch < 'a' || ch > 'f')
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
223 && (ch < 'A' || ch > 'F')
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
224 && (ch < '0' || ch > '9'))
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
225 {
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
226 return NULL;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
227 }
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
228 }
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
229
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
230 len = p - pos - 1;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
231
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
232 addr->data = ngx_pnalloc(c->pool, len);
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
233 if (addr->data == NULL) {
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
234 return NULL;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
235 }
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
236
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
237 ngx_memcpy(addr->data, pos, len);
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
238 addr->len = len;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
239
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
240 return p;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
241 }
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
242
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
243
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
244 static u_char *
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
245 ngx_proxy_protocol_read_port(u_char *p, u_char *last, in_port_t *port,
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
246 u_char sep)
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
247 {
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
248 size_t len;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
249 u_char *pos;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
250 ngx_int_t n;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
251
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
252 pos = p;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
253
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
254 for ( ;; ) {
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
255 if (p == last) {
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
256 return NULL;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
257 }
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
258
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
259 if (*p++ == sep) {
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
260 break;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
261 }
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
262 }
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
263
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
264 len = p - pos - 1;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
265
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
266 n = ngx_atoi(pos, len);
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
267 if (n < 0 || n > 65535) {
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
268 return NULL;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
269 }
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
270
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
271 *port = (in_port_t) n;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
272
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
273 return p;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
274 }
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
275
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
276
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
277 u_char *
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
278 ngx_proxy_protocol_write(ngx_connection_t *c, u_char *buf, u_char *last)
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
279 {
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
280 ngx_uint_t port, lport;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
281
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
282 if (last - buf < NGX_PROXY_PROTOCOL_MAX_HEADER) {
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
283 return NULL;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
284 }
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
285
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
286 if (ngx_connection_local_sockaddr(c, NULL, 0) != NGX_OK) {
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
287 return NULL;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
288 }
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
289
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
290 switch (c->sockaddr->sa_family) {
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
291
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
292 case AF_INET:
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
293 buf = ngx_cpymem(buf, "PROXY TCP4 ", sizeof("PROXY TCP4 ") - 1);
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
294 break;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
295
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
296 #if (NGX_HAVE_INET6)
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
297 case AF_INET6:
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
298 buf = ngx_cpymem(buf, "PROXY TCP6 ", sizeof("PROXY TCP6 ") - 1);
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
299 break;
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
300 #endif
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
301
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
302 default:
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
303 return ngx_cpymem(buf, "PROXY UNKNOWN" CRLF,
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
304 sizeof("PROXY UNKNOWN" CRLF) - 1);
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
305 }
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
306
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
307 buf += ngx_sock_ntop(c->sockaddr, c->socklen, buf, last - buf, 0);
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
308
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
309 *buf++ = ' ';
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
310
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
311 buf += ngx_sock_ntop(c->local_sockaddr, c->local_socklen, buf, last - buf,
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
312 0);
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
313
6593
b3b7e33083ac Introduced ngx_inet_get_port() and ngx_inet_set_port() functions.
Roman Arutyunyan <arut@nginx.com>
parents: 6561
diff changeset
314 port = ngx_inet_get_port(c->sockaddr);
b3b7e33083ac Introduced ngx_inet_get_port() and ngx_inet_set_port() functions.
Roman Arutyunyan <arut@nginx.com>
parents: 6561
diff changeset
315 lport = ngx_inet_get_port(c->local_sockaddr);
b3b7e33083ac Introduced ngx_inet_get_port() and ngx_inet_set_port() functions.
Roman Arutyunyan <arut@nginx.com>
parents: 6561
diff changeset
316
6184
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
317 return ngx_slprintf(buf, last, " %ui %ui" CRLF, port, lport);
fa663739e115 Stream: client-side PROXY protocol.
Roman Arutyunyan <arut@nginx.com>
parents: 5605
diff changeset
318 }
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
319
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
320
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
321 static u_char *
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
322 ngx_proxy_protocol_v2_read(ngx_connection_t *c, u_char *buf, u_char *last)
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
323 {
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
324 u_char *end;
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
325 size_t len;
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
326 socklen_t socklen;
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
327 ngx_uint_t version, command, family, transport;
7591
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
328 ngx_sockaddr_t src_sockaddr, dst_sockaddr;
7590
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7254
diff changeset
329 ngx_proxy_protocol_t *pp;
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
330 ngx_proxy_protocol_header_t *header;
7254
1fd992589ffe Core: fixed build, broken by 63e91f263a49.
Vladimir Homutov <vl@nginx.com>
parents: 7253
diff changeset
331 ngx_proxy_protocol_inet_addrs_t *in;
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
332 #if (NGX_HAVE_INET6)
7254
1fd992589ffe Core: fixed build, broken by 63e91f263a49.
Vladimir Homutov <vl@nginx.com>
parents: 7253
diff changeset
333 ngx_proxy_protocol_inet6_addrs_t *in6;
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
334 #endif
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
335
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
336 header = (ngx_proxy_protocol_header_t *) buf;
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
337
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
338 buf += sizeof(ngx_proxy_protocol_header_t);
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
339
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
340 version = header->version_command >> 4;
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
341
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
342 if (version != 2) {
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
343 ngx_log_error(NGX_LOG_ERR, c->log, 0,
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
344 "unknown PROXY protocol version: %ui", version);
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
345 return NULL;
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
346 }
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
347
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
348 len = ngx_proxy_protocol_parse_uint16(header->len);
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
349
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
350 if ((size_t) (last - buf) < len) {
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
351 ngx_log_error(NGX_LOG_ERR, c->log, 0, "header is too large");
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
352 return NULL;
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
353 }
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
354
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
355 end = buf + len;
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
356
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
357 command = header->version_command & 0x0f;
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
358
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
359 /* only PROXY is supported */
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
360 if (command != 1) {
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
361 ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0,
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
362 "PROXY protocol v2 unsupported command %ui", command);
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
363 return end;
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
364 }
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
365
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
366 transport = header->family_transport & 0x0f;
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
367
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
368 /* only STREAM is supported */
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
369 if (transport != 1) {
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
370 ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0,
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
371 "PROXY protocol v2 unsupported transport %ui",
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
372 transport);
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
373 return end;
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
374 }
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
375
7590
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7254
diff changeset
376 pp = ngx_pcalloc(c->pool, sizeof(ngx_proxy_protocol_t));
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7254
diff changeset
377 if (pp == NULL) {
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7254
diff changeset
378 return NULL;
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7254
diff changeset
379 }
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7254
diff changeset
380
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
381 family = header->family_transport >> 4;
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
382
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
383 switch (family) {
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
384
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
385 case NGX_PROXY_PROTOCOL_AF_INET:
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
386
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
387 if ((size_t) (end - buf) < sizeof(ngx_proxy_protocol_inet_addrs_t)) {
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
388 return NULL;
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
389 }
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
390
7254
1fd992589ffe Core: fixed build, broken by 63e91f263a49.
Vladimir Homutov <vl@nginx.com>
parents: 7253
diff changeset
391 in = (ngx_proxy_protocol_inet_addrs_t *) buf;
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
392
7591
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
393 src_sockaddr.sockaddr_in.sin_family = AF_INET;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
394 src_sockaddr.sockaddr_in.sin_port = 0;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
395 memcpy(&src_sockaddr.sockaddr_in.sin_addr, in->src_addr, 4);
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
396
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
397 dst_sockaddr.sockaddr_in.sin_family = AF_INET;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
398 dst_sockaddr.sockaddr_in.sin_port = 0;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
399 memcpy(&dst_sockaddr.sockaddr_in.sin_addr, in->dst_addr, 4);
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
400
7590
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7254
diff changeset
401 pp->src_port = ngx_proxy_protocol_parse_uint16(in->src_port);
7591
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
402 pp->dst_port = ngx_proxy_protocol_parse_uint16(in->dst_port);
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
403
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
404 socklen = sizeof(struct sockaddr_in);
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
405
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
406 buf += sizeof(ngx_proxy_protocol_inet_addrs_t);
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
407
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
408 break;
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
409
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
410 #if (NGX_HAVE_INET6)
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
411
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
412 case NGX_PROXY_PROTOCOL_AF_INET6:
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
413
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
414 if ((size_t) (end - buf) < sizeof(ngx_proxy_protocol_inet6_addrs_t)) {
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
415 return NULL;
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
416 }
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
417
7254
1fd992589ffe Core: fixed build, broken by 63e91f263a49.
Vladimir Homutov <vl@nginx.com>
parents: 7253
diff changeset
418 in6 = (ngx_proxy_protocol_inet6_addrs_t *) buf;
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
419
7591
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
420 src_sockaddr.sockaddr_in6.sin6_family = AF_INET6;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
421 src_sockaddr.sockaddr_in6.sin6_port = 0;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
422 memcpy(&src_sockaddr.sockaddr_in6.sin6_addr, in6->src_addr, 16);
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
423
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
424 dst_sockaddr.sockaddr_in6.sin6_family = AF_INET6;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
425 dst_sockaddr.sockaddr_in6.sin6_port = 0;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
426 memcpy(&dst_sockaddr.sockaddr_in6.sin6_addr, in6->dst_addr, 16);
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
427
7590
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7254
diff changeset
428 pp->src_port = ngx_proxy_protocol_parse_uint16(in6->src_port);
7591
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
429 pp->dst_port = ngx_proxy_protocol_parse_uint16(in6->dst_port);
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
430
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
431 socklen = sizeof(struct sockaddr_in6);
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
432
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
433 buf += sizeof(ngx_proxy_protocol_inet6_addrs_t);
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
434
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
435 break;
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
436
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
437 #endif
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
438
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
439 default:
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
440 ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0,
7253
63e91f263a49 Core: revised the PROXY protocol v2 code.
Ruslan Ermilov <ru@nginx.com>
parents: 7252
diff changeset
441 "PROXY protocol v2 unsupported address family %ui",
7252
7bdab16c55f1 Core: style.
Vladimir Homutov <vl@nginx.com>
parents: 7251
diff changeset
442 family);
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
443 return end;
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
444 }
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
445
7590
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7254
diff changeset
446 pp->src_addr.data = ngx_pnalloc(c->pool, NGX_SOCKADDR_STRLEN);
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7254
diff changeset
447 if (pp->src_addr.data == NULL) {
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
448 return NULL;
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
449 }
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
450
7591
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
451 pp->src_addr.len = ngx_sock_ntop(&src_sockaddr.sockaddr, socklen,
7590
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7254
diff changeset
452 pp->src_addr.data, NGX_SOCKADDR_STRLEN, 0);
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
453
7591
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
454 pp->dst_addr.data = ngx_pnalloc(c->pool, NGX_SOCKADDR_STRLEN);
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
455 if (pp->dst_addr.data == NULL) {
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
456 return NULL;
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
457 }
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
458
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
459 pp->dst_addr.len = ngx_sock_ntop(&dst_sockaddr.sockaddr, socklen,
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
460 pp->dst_addr.data, NGX_SOCKADDR_STRLEN, 0);
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
461
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
462 ngx_log_debug4(NGX_LOG_DEBUG_CORE, c->log, 0,
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
463 "PROXY protocol v2 src: %V %d, dst: %V %d",
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
464 &pp->src_addr, pp->src_port, &pp->dst_addr, pp->dst_port);
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
465
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
466 if (buf < end) {
8072
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
467 pp->tlvs.data = ngx_pnalloc(c->pool, end - buf);
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
468 if (pp->tlvs.data == NULL) {
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
469 return NULL;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
470 }
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
471
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
472 ngx_memcpy(pp->tlvs.data, buf, end - buf);
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
473 pp->tlvs.len = end - buf;
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
474 }
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
475
7590
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7254
diff changeset
476 c->proxy_protocol = pp;
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7254
diff changeset
477
7251
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
478 return end;
416953ef0428 Core: added processing of version 2 of the PROXY protocol.
Vladimir Homutov <vl@nginx.com>
parents: 6593
diff changeset
479 }
8072
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
480
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
481
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
482 ngx_int_t
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
483 ngx_proxy_protocol_get_tlv(ngx_connection_t *c, ngx_str_t *name,
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
484 ngx_str_t *value)
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
485 {
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
486 u_char *p;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
487 size_t n;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
488 uint32_t verify;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
489 ngx_str_t ssl, *tlvs;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
490 ngx_int_t rc, type;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
491 ngx_proxy_protocol_tlv_ssl_t *tlv_ssl;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
492 ngx_proxy_protocol_tlv_entry_t *te;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
493
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
494 if (c->proxy_protocol == NULL) {
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
495 return NGX_DECLINED;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
496 }
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
497
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
498 ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0,
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
499 "PROXY protocol v2 get tlv \"%V\"", name);
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
500
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
501 te = ngx_proxy_protocol_tlv_entries;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
502 tlvs = &c->proxy_protocol->tlvs;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
503
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
504 p = name->data;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
505 n = name->len;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
506
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
507 if (n >= 4 && p[0] == 's' && p[1] == 's' && p[2] == 'l' && p[3] == '_') {
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
508
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
509 rc = ngx_proxy_protocol_lookup_tlv(c, tlvs, 0x20, &ssl);
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
510 if (rc != NGX_OK) {
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
511 return rc;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
512 }
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
513
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
514 if (ssl.len < sizeof(ngx_proxy_protocol_tlv_ssl_t)) {
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
515 return NGX_ERROR;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
516 }
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
517
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
518 p += 4;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
519 n -= 4;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
520
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
521 if (n == 6 && ngx_strncmp(p, "verify", 6) == 0) {
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
522
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
523 tlv_ssl = (ngx_proxy_protocol_tlv_ssl_t *) ssl.data;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
524 verify = ngx_proxy_protocol_parse_uint32(tlv_ssl->verify);
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
525
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
526 value->data = ngx_pnalloc(c->pool, NGX_INT32_LEN);
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
527 if (value->data == NULL) {
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
528 return NGX_ERROR;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
529 }
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
530
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
531 value->len = ngx_sprintf(value->data, "%uD", verify)
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
532 - value->data;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
533 return NGX_OK;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
534 }
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
535
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
536 ssl.data += sizeof(ngx_proxy_protocol_tlv_ssl_t);
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
537 ssl.len -= sizeof(ngx_proxy_protocol_tlv_ssl_t);
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
538
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
539 te = ngx_proxy_protocol_tlv_ssl_entries;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
540 tlvs = &ssl;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
541 }
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
542
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
543 if (n >= 2 && p[0] == '0' && p[1] == 'x') {
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
544
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
545 type = ngx_hextoi(p + 2, n - 2);
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
546 if (type == NGX_ERROR) {
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
547 ngx_log_error(NGX_LOG_ERR, c->log, 0,
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
548 "invalid PROXY protocol TLV \"%V\"", name);
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
549 return NGX_ERROR;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
550 }
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
551
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
552 return ngx_proxy_protocol_lookup_tlv(c, tlvs, type, value);
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
553 }
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
554
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
555 for ( /* void */ ; te->type; te++) {
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
556 if (te->name.len == n && ngx_strncmp(te->name.data, p, n) == 0) {
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
557 return ngx_proxy_protocol_lookup_tlv(c, tlvs, te->type, value);
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
558 }
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
559 }
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
560
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
561 ngx_log_error(NGX_LOG_ERR, c->log, 0,
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
562 "unknown PROXY protocol TLV \"%V\"", name);
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
563
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
564 return NGX_DECLINED;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
565 }
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
566
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
567
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
568 static ngx_int_t
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
569 ngx_proxy_protocol_lookup_tlv(ngx_connection_t *c, ngx_str_t *tlvs,
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
570 ngx_uint_t type, ngx_str_t *value)
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
571 {
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
572 u_char *p;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
573 size_t n, len;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
574 ngx_proxy_protocol_tlv_t *tlv;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
575
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
576 ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0,
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
577 "PROXY protocol v2 lookup tlv:%02xi", type);
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
578
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
579 p = tlvs->data;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
580 n = tlvs->len;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
581
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
582 while (n) {
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
583 if (n < sizeof(ngx_proxy_protocol_tlv_t)) {
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
584 ngx_log_error(NGX_LOG_ERR, c->log, 0, "broken PROXY protocol TLV");
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
585 return NGX_ERROR;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
586 }
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
587
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
588 tlv = (ngx_proxy_protocol_tlv_t *) p;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
589 len = ngx_proxy_protocol_parse_uint16(tlv->len);
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
590
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
591 p += sizeof(ngx_proxy_protocol_tlv_t);
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
592 n -= sizeof(ngx_proxy_protocol_tlv_t);
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
593
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
594 if (n < len) {
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
595 ngx_log_error(NGX_LOG_ERR, c->log, 0, "broken PROXY protocol TLV");
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
596 return NGX_ERROR;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
597 }
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
598
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
599 if (tlv->type == type) {
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
600 value->data = p;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
601 value->len = len;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
602 return NGX_OK;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
603 }
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
604
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
605 p += len;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
606 n -= len;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
607 }
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
608
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
609 return NGX_DECLINED;
cca4c8a715de PROXY protocol v2 TLV variables.
Roman Arutyunyan <arut@nginx.com>
parents: 8071
diff changeset
610 }