X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=blobdiff_plain;f=lib%2FCatalyst%2FRequest.pm;h=5dfd7a1a76d365074693456ec15c55f19a0e7b98;hp=e4cb5c2f2a39839fe8f39cd3b9867c288a3e65bd;hb=496b73990a36f091b5030fc5e1a8e9d4ae88a861;hpb=69bec7d7c4115dd8264a80ce016b4fcecad53371 diff --git a/lib/Catalyst/Request.pm b/lib/Catalyst/Request.pm index e4cb5c2..5dfd7a1 100644 --- a/lib/Catalyst/Request.pm +++ b/lib/Catalyst/Request.pm @@ -1,6 +1,6 @@ package Catalyst::Request; -use IO::Socket qw[AF_INET inet_aton]; +use Socket qw( getaddrinfo getnameinfo AI_NUMERICHOST NI_NAMEREQD NIx_NOSERV ); use Carp; use utf8; use URI::http; @@ -132,14 +132,17 @@ sub _build_body_data { my $fh = $self->body; local $_ = $fh; return $self->data_handlers->{$match}->($fh, $self); - } else { - Catalyst::Exception->throw("$content_type is does not have an available data handler"); + } else { + Catalyst::Exception->throw( + sprintf '%s does not have an available data handler. Valid data_handlers are %s.', + $content_type, join ', ', sort keys %{$self->data_handlers} + ); } } has _use_hash_multivalue => ( - is=>'ro', - required=>1, + is=>'ro', + required=>1, default=> sub {0}); # Amount of data to read from input on each pass @@ -248,7 +251,7 @@ sub prepare_body { my ( $self ) = @_; # If previously applied middleware created the HTTP::Body object, then we - # just use that one. + # just use that one. if(my $plack_body = $self->_has_env ? $self->env->{'plack.request.http.body'} : undef) { $self->_body($plack_body); @@ -280,7 +283,7 @@ sub prepare_body { # Ok if we get this far, we have to read psgi.input into the new body # object. Lets play nice with any plack app or other downstream, so # we create a buffer unless one exists. - + my $stream_buffer; if ($self->env->{'psgix.input.buffered'}) { # Be paranoid about previous psgi middleware or apps that read the @@ -436,7 +439,27 @@ has hostname => ( lazy => 1, default => sub { my ($self) = @_; - gethostbyaddr( inet_aton( $self->address ), AF_INET ) || $self->address + my ( $err, $sockaddr ) = getaddrinfo( + $self->address, + # no service + '', + { flags => AI_NUMERICHOST } + ); + if ( $err ) { + $self->_log->warn("resolve of hostname failed: $err"); + return $self->address; + } + ( $err, my $hostname ) = getnameinfo( + $sockaddr->{addr}, + NI_NAMEREQD, + # we are only interested in the hostname, not the servicename + NIx_NOSERV + ); + if ( $err ) { + $self->_log->warn("resolve of hostname failed: $err"); + return $self->address; + } + return $hostname; }, ); @@ -771,7 +794,7 @@ sub param { # If anything in @_ is undef, carp about that, and remove it from # the list; - + my @params = grep { defined($_) ? 1 : do {carp "You called ->params with an undefined value"; 0} } @_; if ( @params == 1 ) { @@ -1122,7 +1145,7 @@ If parameters have already been set will clear the parameters and build them aga =head2 $self->env -Access to the raw PSGI env. +Access to the raw PSGI env. =head2 meta