Perlbal
view release on metacpan or search on metacpan
lib/Perlbal/Socket.pm view on Meta::CPAN
# Base class for all socket types
#
# Copyright 2004, Danga Interactive, Inc.
# Copyright 2005-2007, Six Apart, Ltd.
package Perlbal::Socket;
use strict;
use warnings;
no warnings qw(deprecated);
use Perlbal::HTTPHeaders;
use Sys::Syscall;
use POSIX ();
use Danga::Socket 1.44;
use base 'Danga::Socket';
use fields (
'headers_string', # headers as they're being read
'req_headers', # the final Perlbal::HTTPHeaders object inbound
'res_headers', # response headers outbound (Perlbal::HTTPHeaders object)
'create_time', # creation time
'alive_time', # last time noted alive
'state', # general purpose state; used by descendants.
'do_die', # if on, die and do no further requests
'read_buf', # arrayref of scalarref read from client
'read_ahead', # bytes sitting in read_buf
'read_size', # total bytes read from client, ever
'ditch_leading_rn', # if true, the next header parsing will ignore a leading \r\n
'observed_ip_string', # if defined, contains the observed IP string of the peer
# we're serving. this is intended for hoding the value of
# the X-Forwarded-For and using it to govern ACLs.
);
use constant MAX_HTTP_HEADER_LENGTH => 102400; # 100k, arbitrary
use constant TRACK_OBJECTS => 0; # see @created_objects below
if (TRACK_OBJECTS) {
use Scalar::Util qw(weaken isweak);
}
# kick-off one cleanup
_do_cleanup();
our %state_changes = (); # { "objref" => [ state, state, state, ... ] }
our $last_callbacks = 0; # time last ran callbacks
our $callbacks = []; # [ [ time, subref ], [ time, subref ], ... ]
# this one deserves its own section. we keep track of every Perlbal::Socket object
# created if the TRACK_OBJECTS constant is on. we use weakened references, though,
# so this list will hopefully contain mostly undefs. users can ask for this list if
# they want to work with it via the get_created_objects_ref function.
our @created_objects; # ( $ref, $ref, $ref ... )
our $last_co_cleanup = 0; # clean the list every few seconds
sub get_statechange_ref {
return \%state_changes;
}
sub get_created_objects_ref {
return \@created_objects;
}
sub write_debuggy {
my $self = shift;
my $cref = $_[0];
my $content = ref $cref eq "SCALAR" ? $$cref : $cref;
my $clen = defined $content ? length($content) : "undef";
$content = substr($content, 0, 17) . "..." if defined $content && $clen > 30;
my ($pkg, $filename, $line) = caller;
print "write($self, <$clen>\"$content\") from ($pkg, $filename, $line)\n" if Perlbal::DEBUG >= 4;
$self->SUPER::write(@_);
}
if (Perlbal::DEBUG >= 4) {
no warnings 'redefine';
*write = \&write_debuggy;
}
sub new {
my Perlbal::Socket $self = shift;
$self = fields::new( $self ) unless ref $self;
Perlbal::objctor($self);
$self->SUPER::new( @_ );
$self->{headers_string} = '';
$self->{state} = undef;
$self->{do_die} = 0;
$self->{read_buf} = []; # arrayref of scalar refs of bufs read from client
( run in 4.094 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )