816
|
1 package Test::Nginx::Stream;
|
|
2
|
|
3 # (C) Andrey Zelenkov
|
|
4 # (C) Nginx, Inc.
|
|
5
|
|
6 # Module for nginx stream tests.
|
|
7
|
|
8 ###############################################################################
|
|
9
|
|
10 use warnings;
|
|
11 use strict;
|
|
12
|
|
13 use base qw/ Exporter /;
|
|
14 our @EXPORT_OK = qw/ stream /;
|
|
15
|
|
16 use Test::More qw//;
|
|
17 use IO::Select;
|
|
18 use IO::Socket;
|
|
19
|
|
20 use Test::Nginx;
|
|
21
|
|
22 sub stream {
|
|
23 return Test::Nginx::Stream->new(@_);
|
|
24 }
|
|
25
|
|
26 sub new {
|
|
27 my $self = {};
|
|
28 bless $self, shift @_;
|
|
29
|
|
30 unshift(@_, "PeerAddr") if @_ == 1;
|
|
31
|
|
32 $self->{_socket} = IO::Socket::INET->new(
|
|
33 Proto => "tcp",
|
|
34 PeerAddr => '127.0.0.1:8080',
|
|
35 @_
|
|
36 )
|
|
37 or die "Can't connect to nginx: $!\n";
|
|
38
|
|
39 if ({@_}->{'SSL'}) {
|
|
40 require IO::Socket::SSL;
|
|
41 IO::Socket::SSL->start_SSL($self->{_socket}, @_)
|
|
42 or die $IO::Socket::SSL::SSL_ERROR . "\n";
|
|
43 }
|
|
44
|
|
45 $self->{_socket}->autoflush(1);
|
|
46
|
|
47 return $self;
|
|
48 }
|
|
49
|
|
50 sub write {
|
|
51 my ($self, $message) = @_;
|
|
52 my $s = $self->{_socket};
|
|
53
|
|
54 local $SIG{PIPE} = 'IGNORE';
|
|
55
|
|
56 $s->blocking(0);
|
|
57 while (IO::Select->new($s)->can_write(1.5)) {
|
|
58 my $n = $s->syswrite($message);
|
|
59 log_out(substr($message, 0, $n));
|
|
60 last unless $n;
|
|
61
|
|
62 $message = substr($message, $n);
|
|
63 last unless length $message;
|
|
64 }
|
|
65
|
|
66 if (length $message) {
|
|
67 $s->close();
|
|
68 }
|
|
69 }
|
|
70
|
|
71 sub read {
|
|
72 my ($self) = @_;
|
|
73 my ($s, $buf);
|
|
74
|
|
75 $s = $self->{_socket};
|
|
76
|
|
77 $s->blocking(0);
|
|
78 if (IO::Select->new($s)->can_read(5)) {
|
|
79 $s->sysread($buf, 1024);
|
|
80 };
|
|
81
|
|
82 log_in($buf);
|
|
83 return $buf;
|
|
84 }
|
|
85
|
|
86 sub io {
|
|
87 my $self = shift;
|
|
88
|
|
89 my ($data, %extra) = @_;
|
|
90 my $length = $extra{length};
|
|
91
|
|
92 $self->write($data);
|
|
93
|
|
94 $data = '';
|
|
95 while (1) {
|
|
96 my $buf = $self->read();
|
|
97 last unless length($buf);
|
|
98
|
|
99 $data .= $buf;
|
|
100 last if defined $length && length($data) >= $length;
|
|
101 }
|
|
102
|
|
103 return $data;
|
|
104 }
|
|
105
|
|
106 sub sockport {
|
|
107 my $self = shift;
|
|
108 return $self->{_socket}->sockport();
|
|
109 }
|
|
110
|
|
111 ###############################################################################
|
|
112
|
|
113 1;
|
|
114
|
|
115 ###############################################################################
|