summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbluhm <bluhm@openbsd.org>2011-09-02 10:45:36 +0000
committerbluhm <bluhm@openbsd.org>2011-09-02 10:45:36 +0000
commit9d1e6fe85fd62b66cfbb180db0a68f1a5f723965 (patch)
treebcf207ba77ce1efe760307b073947591d0c655ee
parentAdd email address for diffs and remove plural man pages. ok jmc@ (diff)
downloadwireguard-openbsd-9d1e6fe85fd62b66cfbb180db0a68f1a5f723965.tar.xz
wireguard-openbsd-9d1e6fe85fd62b66cfbb180db0a68f1a5f723965.zip
Add tests for relayd protocol http 1.0 and 1.1.
-rw-r--r--regress/usr.sbin/relayd/Proc.pm6
-rw-r--r--regress/usr.sbin/relayd/Relayd.pm5
-rw-r--r--regress/usr.sbin/relayd/args-http-log.pl23
-rw-r--r--regress/usr.sbin/relayd/args-http-persistent.pl25
-rw-r--r--regress/usr.sbin/relayd/args-http-tcp.pl17
-rw-r--r--regress/usr.sbin/relayd/args-http.pl20
-rw-r--r--regress/usr.sbin/relayd/funcs.pl105
-rw-r--r--regress/usr.sbin/relayd/relayd.pl26
8 files changed, 190 insertions, 37 deletions
diff --git a/regress/usr.sbin/relayd/Proc.pm b/regress/usr.sbin/relayd/Proc.pm
index b43f13978bc..e5c0e157cdb 100644
--- a/regress/usr.sbin/relayd/Proc.pm
+++ b/regress/usr.sbin/relayd/Proc.pm
@@ -1,4 +1,4 @@
-# $OpenBSD: Proc.pm,v 1.1 2011/09/01 17:33:17 bluhm Exp $
+# $OpenBSD: Proc.pm,v 1.2 2011/09/02 10:45:36 bluhm Exp $
# Copyright (c) 2010,2011 Alexander Bluhm <bluhm@openbsd.org>
#
@@ -130,8 +130,8 @@ sub loggrep {
}
open(my $fh, '<', $self->{logfile})
or die ref($self), " log file open failed: $!";
- my $match = first { /$regex/ } <$fh>;
- return $match if $match;
+ my @match = grep { /$regex/ } <$fh>;
+ return wantarray ? @match : $match[0] if @match;
close($fh);
# pattern not found
if ($kid == 0) {
diff --git a/regress/usr.sbin/relayd/Relayd.pm b/regress/usr.sbin/relayd/Relayd.pm
index 9cd55d868be..405cf40cadc 100644
--- a/regress/usr.sbin/relayd/Relayd.pm
+++ b/regress/usr.sbin/relayd/Relayd.pm
@@ -1,4 +1,4 @@
-# $OpenBSD: Relayd.pm,v 1.1 2011/09/01 17:33:17 bluhm Exp $
+# $OpenBSD: Relayd.pm,v 1.2 2011/09/02 10:45:36 bluhm Exp $
# Copyright (c) 2010,2011 Alexander Bluhm <bluhm@openbsd.org>
#
@@ -46,9 +46,10 @@ sub new {
$self->{connectport}
or croak "$class connect port not given";
+ my $test = basename($self->{test} || "");
open(my $fh, '>', $self->{conffile})
or die ref($self), " conf file $self->{conffile} create failed: $!";
- my $test = basename($self->{test} || "");
+ print $fh "log all\n";
my @protocol = @{$self->{protocol}};
my $proto = shift @protocol;
diff --git a/regress/usr.sbin/relayd/args-http-log.pl b/regress/usr.sbin/relayd/args-http-log.pl
new file mode 100644
index 00000000000..37c773d9764
--- /dev/null
+++ b/regress/usr.sbin/relayd/args-http-log.pl
@@ -0,0 +1,23 @@
+# test http connection over http relay
+
+use strict;
+use warnings;
+
+our %args = (
+ client => {
+ func => \&http_client,
+ },
+ relay => {
+ protocol => [ "http",
+ "request header log foo",
+ "response header log bar",
+ ],
+ },
+ server => {
+ func => \&http_server,
+ },
+ len => 251,
+ md5 => "bc3a3f39af35fe5b1687903da2b00c7f",
+);
+
+1;
diff --git a/regress/usr.sbin/relayd/args-http-persistent.pl b/regress/usr.sbin/relayd/args-http-persistent.pl
new file mode 100644
index 00000000000..49bd34f7b51
--- /dev/null
+++ b/regress/usr.sbin/relayd/args-http-persistent.pl
@@ -0,0 +1,25 @@
+# test persistent http 1.1 connection over http relay
+
+use strict;
+use warnings;
+
+my @lengths = (251, 65536, 0, 1, 2, 3, 4, 5);
+our %args = (
+ client => {
+ func => \&http_client,
+ lengths => \@lengths,
+ },
+ relay => {
+ protocol => [ "http",
+ "request header log foo",
+ "response header log bar",
+ ],
+ },
+ server => {
+ func => \&http_server,
+ },
+ lengths => \@lengths,
+ md5 => "bc3a3f39af35fe5b1687903da2b00c7f",
+);
+
+1;
diff --git a/regress/usr.sbin/relayd/args-http-tcp.pl b/regress/usr.sbin/relayd/args-http-tcp.pl
new file mode 100644
index 00000000000..3c9a4f3fc9b
--- /dev/null
+++ b/regress/usr.sbin/relayd/args-http-tcp.pl
@@ -0,0 +1,17 @@
+# test http connection over tcp relay
+
+use strict;
+use warnings;
+
+our %args = (
+ client => {
+ func => \&http_client,
+ },
+ server => {
+ func => \&http_server,
+ },
+ len => 251,
+ md5 => "bc3a3f39af35fe5b1687903da2b00c7f",
+);
+
+1;
diff --git a/regress/usr.sbin/relayd/args-http.pl b/regress/usr.sbin/relayd/args-http.pl
new file mode 100644
index 00000000000..4aa918a468e
--- /dev/null
+++ b/regress/usr.sbin/relayd/args-http.pl
@@ -0,0 +1,20 @@
+# test http connection over http relay
+
+use strict;
+use warnings;
+
+our %args = (
+ client => {
+ func => \&http_client,
+ },
+ relay => {
+ protocol => [ "http" ],
+ },
+ server => {
+ func => \&http_server,
+ },
+ len => 251,
+ md5 => "bc3a3f39af35fe5b1687903da2b00c7f",
+);
+
+1;
diff --git a/regress/usr.sbin/relayd/funcs.pl b/regress/usr.sbin/relayd/funcs.pl
index c628e791194..397c1e92634 100644
--- a/regress/usr.sbin/relayd/funcs.pl
+++ b/regress/usr.sbin/relayd/funcs.pl
@@ -1,4 +1,4 @@
-# $OpenBSD: funcs.pl,v 1.1 2011/09/01 17:33:17 bluhm Exp $
+# $OpenBSD: funcs.pl,v 1.2 2011/09/02 10:45:36 bluhm Exp $
# Copyright (c) 2010,2011 Alexander Bluhm <bluhm@openbsd.org>
#
@@ -83,19 +83,40 @@ sub write_char {
print STDERR "MD5: ", $ctx->hexdigest, "\n";
}
-sub errignore {
- $SIG{PIPE} = 'IGNORE';
- $SIG{__DIE__} = sub {
- die @_ if $^S;
- warn @_;
- my $soerror;
- $soerror = getsockopt(STDIN, SOL_SOCKET, SO_ERROR);
- print STDERR "ERROR IN: ", unpack('i', $soerror), "\n";
- $soerror = getsockopt(STDOUT, SOL_SOCKET, SO_ERROR);
- print STDERR "ERROR OUT: ", unpack('i', $soerror), "\n";
- IO::Handle::flush(\*STDERR);
- POSIX::_exit(0);
- };
+sub http_client {
+ my $self = shift;
+ my @lengths = @{$self->{lengths} || [ shift // $self->{len} // 251 ]};
+ my $vers = $self->{lengths} ? "1.1" : "1.0";
+
+ foreach my $len (@lengths) {
+ {
+ local $\ = "\r\n";
+ print "GET /$len HTTP/$vers";
+ print "Host: foo.bar";
+ print "";
+ }
+ IO::Handle::flush(\*STDOUT);
+
+ {
+ local $\ = "\n";
+ local $/ = "\r\n";
+ local $_ = <STDIN>;
+ chomp;
+ print STDERR;
+ m{^HTTP/$vers 200 OK$}
+ or die ref($self), " http response not ok";
+ while (<STDIN>) {
+ chomp;
+ last if /^$/;
+ print STDERR;
+ if (/^Content-Length: (.*)/) {
+ $1 == $len or die ref($self),
+ " bad content length $1";
+ }
+ }
+ }
+ read_char($self, $vers eq "1.1" ? $len : undef);
+ }
}
########################################################################
@@ -104,23 +125,61 @@ sub errignore {
sub read_char {
my $self = shift;
- my $max = $self->{max};
+ my $max = shift // $self->{max};
my $ctx = Digest::MD5->new();
my $len = 0;
- while (<STDIN>) {
- $len += length($_);
- $ctx->add($_);
- print STDERR ".";
- if ($max && $len >= $max) {
- print STDERR "\nMax";
- last;
+ if (defined($max) && $max == 0) {
+ print STDERR "Max\n";
+ } else {
+ while (<STDIN>) {
+ $len += length($_);
+ $ctx->add($_);
+ print STDERR ".";
+ if (defined($max) && $len >= $max) {
+ print STDERR "\nMax";
+ last;
+ }
}
+ print STDERR "\n";
}
- print STDERR "\n";
print STDERR "LEN: ", $len, "\n";
print STDERR "MD5: ", $ctx->hexdigest, "\n";
}
+sub http_server {
+ my $self = shift;
+
+ my($url, $vers);
+ do {
+ {
+ local $\ = "\n";
+ local $/ = "\r\n";
+ local $_ = <STDIN>;
+ return unless defined $_;
+ chomp;
+ print STDERR;
+ ($url, $vers) = m{^GET (.*) HTTP/(1\.[01])$}
+ or die ref($self), " http request not ok";
+ while (<STDIN>) {
+ chomp;
+ last if /^$/;
+ print STDERR;
+ }
+ }
+
+ $url =~ /(\d+)$/;
+ my $len = $1;
+ {
+ local $\ = "\r\n";
+ print "HTTP/$vers 200 OK";
+ print "Content-Length: $len" if $vers eq "1.1";
+ print "";
+ }
+ write_char($self, $len);
+ IO::Handle::flush(\*STDOUT);
+ } while ($vers eq "1.1");
+}
+
1;
diff --git a/regress/usr.sbin/relayd/relayd.pl b/regress/usr.sbin/relayd/relayd.pl
index 9ebbc5298a1..73fbb2b6c23 100644
--- a/regress/usr.sbin/relayd/relayd.pl
+++ b/regress/usr.sbin/relayd/relayd.pl
@@ -1,5 +1,5 @@
#!/usr/bin/perl
-# $OpenBSD: relayd.pl,v 1.1 2011/09/01 17:33:17 bluhm Exp $
+# $OpenBSD: relayd.pl,v 1.2 2011/09/02 10:45:36 bluhm Exp $
# Copyright (c) 2010,2011 Alexander Bluhm <bluhm@openbsd.org>
#
@@ -77,16 +77,24 @@ $r->down;
exit if $args{nocheck};
-my $clen = $c->loggrep(qr/^LEN: /) // die "no client len"
+my @clen = $c->loggrep(qr/^LEN: /) or die "no client len"
unless $args{client}{nocheck};
-my $slen = $s->loggrep(qr/^LEN: /) // die "no server len"
+my @slen = $s->loggrep(qr/^LEN: /) or die "no server len"
unless $args{server}{nocheck};
-!$clen || !$slen || $clen eq $slen
- or die "client: $clen", "server: $slen", "len mismatch";
-!defined($args{len}) || !$clen || $clen eq "LEN: $args{len}\n"
- or die "client: $clen", "len $args{len} expected";
-!defined($args{len}) || !$slen || $slen eq "LEN: $args{len}\n"
- or die "server: $slen", "len $args{len} expected";
+!@clen || !@slen || @clen ~~ @slen
+ or die "client: @clen", "server: @slen", "len mismatch";
+!defined($args{len}) || !$clen[0] || $clen[0] eq "LEN: $args{len}\n"
+ or die "client: $clen[0]", "len $args{len} expected";
+!defined($args{len}) || !$slen[0] || $slen[0] eq "LEN: $args{len}\n"
+ or die "server: $slen[0]", "len $args{len} expected";
+foreach my $len (@{$args{lengths} || []}) {
+ my $clen = shift @clen;
+ $clen eq "LEN: $len\n"
+ or die "client: $clen", "len $len expected";
+ my $slen = shift @slen;
+ $slen eq "LEN: $len\n"
+ or die "server: $slen", "len $len expected";
+}
my $cmd5 = $c->loggrep(qr/^MD5: /) unless $args{client}{nocheck};
my $smd5 = $s->loggrep(qr/^MD5: /) unless $args{server}{nocheck};