annotate http_resolver_ipv4.t @ 1943:1786f49cca17

Tests: fixed spurious http_resolver_ipv4.t failures. Previously, to get resolved addresses, the test relied on cached random rotation in resolver, such that a chosen address is eventually changed, which may not happen after several client requests. For this reason, the test is rewritten to get all addresses by switching to the next upstream.
author Sergey Kandaurov <pluknet@nginx.com>
date Mon, 22 Jan 2024 14:11:12 +0400
parents 0b06942f0b8b
children c287864444f8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1797
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
1 #!/usr/bin/perl
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
2
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
3 # (C) Sergey Kandaurov
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
4 # (C) Eugene Grebenschikov
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
5 # (C) Nginx, Inc.
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
6
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
7 # Tests for http resolver with ipv4/ipv6 parameters.
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
8
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
9 ###############################################################################
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
10
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
11 use warnings;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
12 use strict;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
13
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
14 use Test::More;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
15
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
16 BEGIN { use FindBin; chdir($FindBin::Bin); }
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
17
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
18 use lib 'lib';
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
19 use Test::Nginx;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
20
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
21 ###############################################################################
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
22
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
23 select STDERR; $| = 1;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
24 select STDOUT; $| = 1;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
25
1943
1786f49cca17 Tests: fixed spurious http_resolver_ipv4.t failures.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1797
diff changeset
26 my $t = Test::Nginx->new()->has(qw/http proxy/);
1797
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
27
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
28 $t->write_file_expand('nginx.conf', <<'EOF');
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
29
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
30 %%TEST_GLOBALS%%
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
31
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
32 daemon off;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
33
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
34 events {
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
35 }
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
36
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
37 http {
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
38 %%TEST_GLOBALS_HTTP%%
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
39
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
40 server {
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
41 listen 127.0.0.1:8080;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
42 server_name localhost;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
43
1943
1786f49cca17 Tests: fixed spurious http_resolver_ipv4.t failures.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1797
diff changeset
44 add_header X-Addr $upstream_addr always;
1786f49cca17 Tests: fixed spurious http_resolver_ipv4.t failures.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1797
diff changeset
45 proxy_next_upstream http_403;
1786f49cca17 Tests: fixed spurious http_resolver_ipv4.t failures.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1797
diff changeset
46
1797
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
47 location / {
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
48 proxy_pass http://$arg_h:%%PORT_8081%%/;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
49 resolver 127.0.0.1:%%PORT_8980_UDP%% ipv4=on ipv6=on;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
50 }
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
51
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
52 location /ipv4 {
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
53 proxy_pass http://$arg_h:%%PORT_8081%%/;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
54 resolver 127.0.0.1:%%PORT_8980_UDP%% ipv4=on ipv6=off;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
55 }
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
56
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
57 location /ipv6 {
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
58 proxy_pass http://$arg_h:%%PORT_8081%%/;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
59 resolver 127.0.0.1:%%PORT_8980_UDP%% ipv4=off ipv6=on;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
60 }
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
61 }
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
62
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
63 server {
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
64 listen 127.0.0.1:8081;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
65 listen [::1]:%%PORT_8081%%;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
66 server_name localhost;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
67
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
68 location / {
1943
1786f49cca17 Tests: fixed spurious http_resolver_ipv4.t failures.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1797
diff changeset
69 # return 403;
1797
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
70 }
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
71 }
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
72 }
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
73
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
74 EOF
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
75
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
76 $t->try_run('no resolver ipv4')->plan(3);
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
77
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
78 $t->run_daemon(\&dns_daemon, port(8980), $t);
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
79 $t->waitforfile($t->testdir . '/' . port(8980));
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
80
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
81 ###############################################################################
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
82
1943
1786f49cca17 Tests: fixed spurious http_resolver_ipv4.t failures.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1797
diff changeset
83 is(get('/'), '127.0.0.1:8081, [::1]:8081', 'ipv4 ipv6');
1786f49cca17 Tests: fixed spurious http_resolver_ipv4.t failures.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1797
diff changeset
84 is(get('/ipv4'), '127.0.0.1:8081', 'ipv4 only');
1786f49cca17 Tests: fixed spurious http_resolver_ipv4.t failures.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1797
diff changeset
85 is(get('/ipv6'), '[::1]:8081', 'ipv6 only');
1797
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
86
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
87 ###############################################################################
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
88
1943
1786f49cca17 Tests: fixed spurious http_resolver_ipv4.t failures.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1797
diff changeset
89 sub get {
1786f49cca17 Tests: fixed spurious http_resolver_ipv4.t failures.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1797
diff changeset
90 my ($uri) = @_;
1797
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
91
1943
1786f49cca17 Tests: fixed spurious http_resolver_ipv4.t failures.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1797
diff changeset
92 my $r = http_get("$uri?h=example.com");
1786f49cca17 Tests: fixed spurious http_resolver_ipv4.t failures.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1797
diff changeset
93 my ($addr) = $r =~ /X-Addr: (.+)\x0d/m;
1786f49cca17 Tests: fixed spurious http_resolver_ipv4.t failures.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1797
diff changeset
94 return $addr;
1797
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
95 }
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
96
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
97 ###############################################################################
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
98
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
99 sub reply_handler {
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
100 my ($recv_data, $port) = @_;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
101
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
102 my (@name, @rdata);
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
103
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
104 use constant NOERROR => 0;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
105
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
106 use constant A => 1;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
107 use constant AAAA => 28;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
108
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
109 use constant IN => 1;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
110
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
111 # default values
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
112
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
113 my ($hdr, $rcode, $ttl) = (0x8180, NOERROR, 3600);
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
114
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
115 # decode name
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
116
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
117 my ($len, $offset) = (undef, 12);
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
118 while (1) {
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
119 $len = unpack("\@$offset C", $recv_data);
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
120 last if $len == 0;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
121 $offset++;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
122 push @name, unpack("\@$offset A$len", $recv_data);
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
123 $offset += $len;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
124 }
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
125
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
126 $offset -= 1;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
127 my ($id, $type, $class) = unpack("n x$offset n2", $recv_data);
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
128
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
129 my $name = join('.', @name);
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
130 if ($name eq 'example.com') {
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
131 if ($type == A) {
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
132 push @rdata, rd_addr($ttl, '127.0.0.1');
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
133 }
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
134 if ($type == AAAA) {
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
135 push @rdata, rd_addr6($ttl, "::1");
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
136 }
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
137 }
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
138
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
139 $len = @name;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
140 pack("n6 (C/a*)$len x n2", $id, $hdr | $rcode, 1, scalar @rdata,
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
141 0, 0, @name, $type, $class) . join('', @rdata);
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
142 }
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
143
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
144 sub rd_addr {
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
145 my ($ttl, $addr) = @_;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
146
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
147 my $code = 'split(/\./, $addr)';
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
148
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
149 pack 'n3N nC4', 0xc00c, A, IN, $ttl, eval "scalar $code", eval($code);
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
150 }
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
151
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
152 sub expand_ip6 {
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
153 my ($addr) = @_;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
154
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
155 substr ($addr, index($addr, "::"), 2) =
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
156 join "0", map { ":" } (0 .. 8 - (split /:/, $addr) + 1);
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
157 map { hex "0" x (4 - length $_) . "$_" } split /:/, $addr;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
158 }
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
159
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
160 sub rd_addr6 {
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
161 my ($ttl, $addr) = @_;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
162
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
163 pack 'n3N nn8', 0xc00c, AAAA, IN, $ttl, 16, expand_ip6($addr);
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
164 }
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
165
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
166 sub dns_daemon {
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
167 my ($port, $t) = @_;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
168
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
169 my ($data, $recv_data);
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
170 my $socket = IO::Socket::INET->new(
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
171 LocalAddr => '127.0.0.1',
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
172 LocalPort => $port,
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
173 Proto => 'udp',
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
174 )
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
175 or die "Can't create listening socket: $!\n";
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
176
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
177 # signal we are ready
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
178
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
179 open my $fh, '>', $t->testdir() . '/' . $port;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
180 close $fh;
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
181
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
182 while (1) {
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
183 $socket->recv($recv_data, 65536);
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
184 $data = reply_handler($recv_data, $port);
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
185 $socket->send($data);
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
186 }
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
187 }
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
188
0b06942f0b8b Tests: http resolver with ipv4/ipv6 parameters.
Eugene Grebenschikov <e.grebenshchikov@f5.com>
parents:
diff changeset
189 ###############################################################################