sub snippets { shift->captures(@_) }
has _read_position => (
- init_arg => undef,
+ # FIXME: work around Moose bug RT#75367
+ # init_arg => undef,
is => 'ro',
writer => '_set_read_position',
default => 0,
);
has _read_length => (
- init_arg => undef,
+ # FIXME: work around Moose bug RT#75367
+ # init_arg => undef,
is => 'ro',
default => sub {
my $self = shift;
required => 1,
);
+has io_fh => (
+ is=>'ro',
+ predicate=>'has_io_fh',
+ lazy=>1,
+ builder=>'_build_io_fh');
+
+sub _build_io_fh {
+ my $self = shift;
+ return $self->env->{'psgix.io'}
+ || die "Your Server does not support psgix.io";
+};
+
+has body_fh => (
+ is=>'ro',
+ predicate=>'has_body_fh',
+ lazy=>1,
+ builder=>'_build_body_fh');
+
+sub _build_body_fh {
+ (my $input_fh = shift->env->{'psgi.input'})->seek(0, 0);
+ return $input_fh;
+};
+
# Amount of data to read from input on each pass
our $CHUNKSIZE = 64 * 1024;
is => 'rw',
required => 1,
lazy => 1,
- default => sub { {} },
+ builder => 'prepare_body_parameters',
);
has uploads => (
has parameters => (
is => 'rw',
lazy => 1,
- builder => 'prepare_parameters',
+ builder => '_build_parameters',
+ clearer => '_clear_parameters',
);
# TODO:
sub prepare_parameters {
my ( $self ) = @_;
+ $self->_clear_parameters;
+ return $self->parameters;
+}
- $self->prepare_body;
+
+
+sub _build_parameters {
+ my ( $self ) = @_;
my $parameters = {};
my $body_parameters = $self->body_parameters;
my $query_parameters = $self->query_parameters;
$parameters;
}
-before body_parameters => sub {
- my ($self) = @_;
- $self->prepare_body;
- $self->prepare_body_parameters;
-};
-
has _uploadtmp => (
is => 'ro',
predicate => '_has_uploadtmp',
sub prepare_body_parameters {
my ( $self ) = @_;
- return unless $self->_body;
+ $self->prepare_body if ! $self->_has_body;
+ return {} unless $self->_body;
- $self->{body_parameters} = $self->_body->param; # FIXME!! Recursion here.
+ return $self->_body->param;
}
sub prepare_connection {
# and provide a custom reader..
sub body {
my $self = shift;
- $self->prepare_body();
+ $self->prepare_body unless ! $self->_has_body;
croak 'body is a reader' if scalar @_;
return blessed $self->_body ? $self->_body->body : $self->_body;
}
=head2 $req->read_chunk(\$buff, $max)
-Reads a chunk..
+Reads a chunk.
You have to set MyApp->config(parse_on_demand => 1) to use this directly.
=head2 $req->secure
Returns true or false, indicating whether the connection is secure
-(https). Note that the URI scheme (e.g., http vs. https) must be determined
-through heuristics, and therefore the reliability of $req->secure will depend
-on your server configuration. If you are serving secure pages on the standard
-SSL port (443) and/or setting the HTTPS environment variable, $req->secure
-should be valid.
+(https). The reliability of $req->secure may depend on your server
+configuration; Catalyst relies on PSGI to determine whether or not a
+request is secure (Catalyst looks at psgi.url_scheme), and different
+PSGI servers may make this determination in different ways (as by
+directly passing along information from the server, interpreting any of
+several HTTP headers, or using heuristics of their own).
=head2 $req->captures
Shortcut to $req->headers->user_agent. Returns the user agent (browser)
version string.
+=head2 $req->io_fh
+
+Returns a psgix.io bidirectional socket, if your server supports one. Used for
+when you want to jailbreak out of PSGI and handle bidirectional client server
+communication manually, such as when you are using cometd or websockets.
+
=head1 SETUP METHODS
You should never need to call these yourself in application code,
=head2 $self->prepare_connection()
Sets up various fields in the request like the local and remote addresses,
-request method, vhost requested etc.
+request method, hostname requested etc.
=head2 $self->prepare_parameters()
Ensures that the body has been parsed, then builds the parameters, which are
combined from those in the request and those in the body.
-This method is the builder for the 'parameters' attribute.
+If parameters have already been set will clear the parameters and build them again.
+
=head2 meta