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=e937fb193cf09894657850ea0a2dc51e14283289;hp=1306b94f2dee59251d1a7e20dc66eadae1854ce5;hb=3b1178b01f1d71618f6a52357ec91ab40e2fc5e3;hpb=efc1a69b1e03a40bc721aa745846d45f855b9511 diff --git a/lib/Catalyst/Request.pm b/lib/Catalyst/Request.pm index 1306b94..e937fb1 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; @@ -123,7 +123,7 @@ sub _build_body_data { # Not sure if these returns should not be exceptions... my $content_type = $self->content_type || return; - return unless ($self->method eq 'POST' || $self->method eq 'PUT'); + return unless ($self->method eq 'POST' || $self->method eq 'PUT' || $self->method eq 'PATCH'); my ($match) = grep { $content_type =~/$_/i } keys(%{$self->data_handlers}); @@ -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,21 @@ 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 } + ); + return $self->address + if $err; + ( $err, my $hostname ) = getnameinfo( + $sockaddr->{addr}, + NI_NAMEREQD, + # we are only interested in the hostname, not the servicename + NIx_NOSERV + ); + return $err ? $self->address : $hostname; }, ); @@ -771,7 +788,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 +1139,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