Mercurial > hg > nginx-tests
view lib/Test/Nginx/Stream.pm @ 816:77359b849cd5
Tests: stream package.
author | Andrey Zelenkov <zelenkov@nginx.com> |
---|---|
date | Mon, 20 Jul 2015 15:06:09 +0300 |
parents | |
children | d2cb9ed7412e |
line wrap: on
line source
package Test::Nginx::Stream; # (C) Andrey Zelenkov # (C) Nginx, Inc. # Module for nginx stream tests. ############################################################################### use warnings; use strict; use base qw/ Exporter /; our @EXPORT_OK = qw/ stream /; use Test::More qw//; use IO::Select; use IO::Socket; use Test::Nginx; sub stream { return Test::Nginx::Stream->new(@_); } sub new { my $self = {}; bless $self, shift @_; unshift(@_, "PeerAddr") if @_ == 1; $self->{_socket} = IO::Socket::INET->new( Proto => "tcp", PeerAddr => '127.0.0.1:8080', @_ ) or die "Can't connect to nginx: $!\n"; if ({@_}->{'SSL'}) { require IO::Socket::SSL; IO::Socket::SSL->start_SSL($self->{_socket}, @_) or die $IO::Socket::SSL::SSL_ERROR . "\n"; } $self->{_socket}->autoflush(1); return $self; } sub write { my ($self, $message) = @_; my $s = $self->{_socket}; local $SIG{PIPE} = 'IGNORE'; $s->blocking(0); while (IO::Select->new($s)->can_write(1.5)) { my $n = $s->syswrite($message); log_out(substr($message, 0, $n)); last unless $n; $message = substr($message, $n); last unless length $message; } if (length $message) { $s->close(); } } sub read { my ($self) = @_; my ($s, $buf); $s = $self->{_socket}; $s->blocking(0); if (IO::Select->new($s)->can_read(5)) { $s->sysread($buf, 1024); }; log_in($buf); return $buf; } sub io { my $self = shift; my ($data, %extra) = @_; my $length = $extra{length}; $self->write($data); $data = ''; while (1) { my $buf = $self->read(); last unless length($buf); $data .= $buf; last if defined $length && length($data) >= $length; } return $data; } sub sockport { my $self = shift; return $self->{_socket}->sockport(); } ############################################################################### 1; ###############################################################################