summaryrefslogtreecommitdiffstats
path: root/debian/perl-framework/t/modules/remoteip.t
diff options
context:
space:
mode:
Diffstat (limited to 'debian/perl-framework/t/modules/remoteip.t')
-rw-r--r--debian/perl-framework/t/modules/remoteip.t97
1 files changed, 97 insertions, 0 deletions
diff --git a/debian/perl-framework/t/modules/remoteip.t b/debian/perl-framework/t/modules/remoteip.t
new file mode 100644
index 0000000..0fbadcd
--- /dev/null
+++ b/debian/perl-framework/t/modules/remoteip.t
@@ -0,0 +1,97 @@
+use strict;
+use warnings FATAL => 'all';
+
+use Apache::Test;
+use Apache::TestRequest;
+use Apache::TestUtil;
+use HTTP::Response;
+
+##
+## mod_remoteip tests
+##
+## PROXY protocol: https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt
+##
+Apache::TestRequest::module("remote_ip");
+plan tests => 12,
+ need(
+ need_module('remoteip'),
+ need_min_apache_version('2.4.30')
+ );
+
+sub slurp
+{
+ my $s = shift;
+ my $r = "";
+ my $b;
+ while ($s->read($b, 10000) > 0) {
+ $r .= $b;
+ }
+ return $r;
+}
+
+ok(my $sock = Apache::TestRequest::vhost_socket("remote_ip"));
+
+#
+# Test human readable format: TCP4
+#
+my $proxy = "PROXY TCP4 192.168.192.66 192.168.192.77 1111 2222\r\n";
+my $url = "GET /index.html HTTP/1.1\r\nConnection: close\r\n";
+$url .= "Host: dummy\r\n\r\n";
+
+$sock->print($proxy . $url);
+$sock->shutdown(1);
+
+my $response_data = slurp($sock);
+my $r = HTTP::Response->parse($response_data);
+chomp(my $content = $r->content);
+ok t_cmp($r->code, 200, "PROXY human readable TCP4 protocol check");
+ok t_cmp($content, "PROXY-OK", "Content check");
+$sock->shutdown(2);
+
+#
+# BAD format test
+#
+$proxy = "PROXY FOO 192.168.192.66 192.168.192.77 1111 2222\r\n";
+ok ($sock = Apache::TestRequest::vhost_socket("remote_ip"));
+$sock->print($proxy . $url);
+$sock->shutdown(1);
+
+# In httpd, a bad PROXY format simply results in the connection
+# being dropped. So ensure we don't get anything that looks
+# like a response
+$response_data = slurp($sock);
+$r = HTTP::Response->parse($response_data);
+chomp($content = $r->content);
+ok t_cmp($r->code, undef, "broken PROXY human readable protocol check");
+ok t_cmp($content, "", "Content check");
+$sock->shutdown(2);
+
+#
+# Test human readable format: TCP6
+#
+$proxy = "PROXY TCP6 2001:DB8::21f:5bff:febf:ce22:8a2e 2001:DB8::12f:8baa:eafc:ce29:6b2e 3333 4444\r\n";
+ok ($sock = Apache::TestRequest::vhost_socket("remote_ip"));
+$sock->print($proxy . $url);
+$sock->shutdown(1);
+$response_data = slurp($sock);
+$r = HTTP::Response->parse($response_data);
+chomp($content = $r->content);
+ok t_cmp($r->code, 200, "PROXY human readable TCP6 protocol check");
+ok t_cmp($content, "PROXY-OK", "Content check");
+$sock->shutdown(2);
+
+# Test binary format
+$proxy = "\x0D\x0A\x0D\x0A\x00\x0D\x0A\x51\x55\x49\x54\x0A"; # header
+$proxy .= "\x21"; # protocol version and command (AF_INET STREAM)
+$proxy .= "\x11"; # transport protocol and address family (TCP over IPv4)
+$proxy .= "\x00\x0C"; # 12 bytes coming up
+$proxy .= "\xC0\xA8\xC0\x42\xC0\xA8\xC0\x4D\x01\xF0\x01\xF1"; # IP addresses and ports
+ok ($sock = Apache::TestRequest::vhost_socket("remote_ip"));
+$sock->print($proxy . $url);
+$sock->shutdown(1);
+$response_data = slurp($sock);
+$r = HTTP::Response->parse($response_data);
+chomp($content = $r->content);
+ok t_cmp($r->code, 200, "PROXY binary protocol TCP4 check");
+ok t_cmp($content, "PROXY-OK", "Content check");
+$sock->shutdown(2);