Skip to content

Commit 758adc4

Browse files
committed
feature: added support for IPv6 addresses in the "postgres_server" directive. thanks Ingo Struck for the original patch in #29.
1 parent 56502a6 commit 758adc4

File tree

6 files changed

+149
-10
lines changed

6 files changed

+149
-10
lines changed

src/ngx_postgres_keepalive.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -94,18 +94,13 @@ ngx_postgres_keepalive_get_peer_single(ngx_peer_connection_t *pc,
9494
pgp->name.data = item->name.data;
9595
pgp->name.len = item->name.len;
9696

97-
pgp->sockaddr = item->sockaddr;
98-
9997
pgp->pgconn = item->pgconn;
10098

10199
pc->connection = c;
102100
pc->cached = 1;
103101

104102
pc->name = &pgp->name;
105103

106-
pc->sockaddr = &pgp->sockaddr;
107-
pc->socklen = item->socklen;
108-
109104
dd("returning NGX_DONE");
110105

111106
return NGX_DONE;

src/ngx_postgres_keepalive.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ typedef struct {
4141
ngx_postgres_upstream_srv_conf_t *srv_conf;
4242
ngx_connection_t *connection;
4343
PGconn *pgconn;
44-
struct sockaddr sockaddr;
44+
u_char sockaddr[NGX_SOCKADDRLEN];
4545
socklen_t socklen;
4646
ngx_str_t name;
4747
} ngx_postgres_keepalive_cache_t;

src/ngx_postgres_module.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,17 @@ ngx_postgres_conf_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
440440
return NGX_CONF_ERROR;
441441
}
442442

443+
#if defined(nginx_version) && (nginx_version <= 1003000)
444+
if (u.naddrs == 0) {
445+
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
446+
"postgres: IPv6 addresses not supported in "
447+
"this version of nginx");
448+
return NGX_CONF_ERROR;
449+
}
450+
#endif
451+
452+
dd("naddrs: %d", (int) u.naddrs);
453+
443454
pgs->addrs = u.addrs;
444455
pgs->naddrs = u.naddrs;
445456
pgs->port = u.port;

src/ngx_postgres_upstream.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -290,10 +290,8 @@ ngx_postgres_upstream_get_peer(ngx_peer_connection_t *pc, void *data)
290290
pgdt->name.len = peer->name.len;
291291
pgdt->name.data = peer->name.data;
292292

293-
pgdt->sockaddr = *peer->sockaddr;
294-
295293
pc->name = &pgdt->name;
296-
pc->sockaddr = &pgdt->sockaddr;
294+
pc->sockaddr = peer->sockaddr;
297295
pc->socklen = peer->socklen;
298296
pc->cached = 0;
299297

src/ngx_postgres_upstream.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ typedef struct {
5353
ngx_postgres_state_t state;
5454
ngx_str_t query;
5555
ngx_str_t name;
56-
struct sockaddr sockaddr;
5756
unsigned failed;
5857
} ngx_postgres_upstream_peer_data_t;
5958

t/ipv6.t

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
# vi:filetype=
2+
3+
use lib 'lib';
4+
use Test::Nginx::Socket;
5+
6+
repeat_each(2);
7+
8+
plan tests => repeat_each() * (blocks() * 5);
9+
10+
$ENV{TEST_NGINX_POSTGRESQL_HOST_IPV6} ||= '[::1]';
11+
$ENV{TEST_NGINX_POSTGRESQL_PORT} ||= 5432;
12+
13+
our $http_config = <<'_EOC_';
14+
upstream database {
15+
postgres_server $TEST_NGINX_POSTGRESQL_HOST_IPV6:$TEST_NGINX_POSTGRESQL_PORT
16+
dbname=ngx_test user=ngx_test password=ngx_test;
17+
}
18+
_EOC_
19+
20+
run_tests();
21+
22+
__DATA__
23+
24+
=== TEST 1: sanity
25+
--- http_config
26+
upstream database {
27+
postgres_server $TEST_NGINX_POSTGRESQL_HOST_IPV6:$TEST_NGINX_POSTGRESQL_PORT
28+
dbname=ngx_test user=ngx_test password=ngx_test;
29+
postgres_keepalive off;
30+
}
31+
--- config
32+
location /postgres {
33+
postgres_pass database;
34+
postgres_query "select * from cats";
35+
}
36+
--- request
37+
GET /postgres
38+
--- error_code: 200
39+
--- response_headers
40+
Content-Type: application/x-resty-dbd-stream
41+
--- response_body eval
42+
"\x{00}". # endian
43+
"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3
44+
"\x{00}". # result type
45+
"\x{00}\x{00}". # std errcode
46+
"\x{02}\x{00}". # driver errcode
47+
"\x{00}\x{00}". # driver errstr len
48+
"". # driver errstr data
49+
"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}". # rows affected
50+
"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}". # insert id
51+
"\x{02}\x{00}". # col count
52+
"\x{09}\x{00}". # std col type (integer/int)
53+
"\x{17}\x{00}". # driver col type
54+
"\x{02}\x{00}". # col name len
55+
"id". # col name data
56+
"\x{06}\x{80}". # std col type (varchar/str)
57+
"\x{19}\x{00}". # driver col type
58+
"\x{04}\x{00}". # col name len
59+
"name". # col name data
60+
"\x{01}". # valid row flag
61+
"\x{01}\x{00}\x{00}\x{00}". # field len
62+
"2". # field data
63+
"\x{ff}\x{ff}\x{ff}\x{ff}". # field len
64+
"". # field data
65+
"\x{01}". # valid row flag
66+
"\x{01}\x{00}\x{00}\x{00}". # field len
67+
"3". # field data
68+
"\x{03}\x{00}\x{00}\x{00}". # field len
69+
"bob". # field data
70+
"\x{00}" # row list terminator
71+
--- timeout: 10
72+
--- no_error_log
73+
[alert]
74+
[error]
75+
76+
77+
78+
=== TEST 2: keep-alive
79+
--- http_config
80+
upstream database {
81+
postgres_server $TEST_NGINX_POSTGRESQL_HOST_IPV6:$TEST_NGINX_POSTGRESQL_PORT
82+
dbname=ngx_test user=ngx_test password=ngx_test;
83+
}
84+
--- config
85+
location /postgres {
86+
postgres_pass database;
87+
postgres_query "select * from cats";
88+
}
89+
90+
location /t {
91+
echo_location /postgres;
92+
echo_location /postgres;
93+
echo_location /postgres;
94+
}
95+
--- request
96+
GET /postgres
97+
--- error_code: 200
98+
--- response_headers
99+
Content-Type: application/x-resty-dbd-stream
100+
--- response_body eval
101+
(
102+
"\x{00}". # endian
103+
"\x{03}\x{00}\x{00}\x{00}". # format version 0.0.3
104+
"\x{00}". # result type
105+
"\x{00}\x{00}". # std errcode
106+
"\x{02}\x{00}". # driver errcode
107+
"\x{00}\x{00}". # driver errstr len
108+
"". # driver errstr data
109+
"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}". # rows affected
110+
"\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}\x{00}". # insert id
111+
"\x{02}\x{00}". # col count
112+
"\x{09}\x{00}". # std col type (integer/int)
113+
"\x{17}\x{00}". # driver col type
114+
"\x{02}\x{00}". # col name len
115+
"id". # col name data
116+
"\x{06}\x{80}". # std col type (varchar/str)
117+
"\x{19}\x{00}". # driver col type
118+
"\x{04}\x{00}". # col name len
119+
"name". # col name data
120+
"\x{01}". # valid row flag
121+
"\x{01}\x{00}\x{00}\x{00}". # field len
122+
"2". # field data
123+
"\x{ff}\x{ff}\x{ff}\x{ff}". # field len
124+
"". # field data
125+
"\x{01}". # valid row flag
126+
"\x{01}\x{00}\x{00}\x{00}". # field len
127+
"3". # field data
128+
"\x{03}\x{00}\x{00}\x{00}". # field len
129+
"bob". # field data
130+
"\x{00}" # row list terminator
131+
) x 3
132+
--- timeout: 10
133+
--- no_error_log
134+
[alert]
135+
[error]
136+

0 commit comments

Comments
 (0)