package Exception::WebInterface::OwnServer::BadRequest; $Exception::WebInterface::OwnServer::BadRequest::VERSION = '0.008'; use base qw(Exception); package QBit::WebInterface::OwnServer::Request; $QBit::WebInterface::OwnServer::Request::VERSION = '0.008'; use qbit; use base qw(QBit::WebInterface::Request); __PACKAGE__->mk_ro_accessors(qw(socket)); my $CHOMP_QR = qr/[\r\n]+$/; sub init { my ($self) = @_; $self->SUPER::init(); my $request_str = readline($self->socket); $request_str = '' unless defined($request_str); $request_str =~ s/$CHOMP_QR//; if ($request_str =~ /^(GET|POST|HEAD)\s+(.+?)\s+HTTP\/1\.[01]$/) { $self->{'method'} = $1; $self->{'uri'} = $2; } else { throw Exception::WebInterface::OwnServer::BadRequest gettext('Bad request'); } $self->{'query_string'} = $self->{'uri'} =~ /\?(.+)$/ ? $1 : ''; while ((my $str = readline($self->socket)) !~ /^[\r\n]{1,2}$/) { $str =~ s/$CHOMP_QR//; my ($name, $value) = split(/:\s*/, $str, 2); $name = uc($name); $name =~ tr/-/_/; $self->{'headers'}{$name} = $value; } } sub http_header { my ($self, $name) = @_; $name = uc($name); $name =~ tr/-/_/; my $value = $self->{'headers'}{$name}; return defined($value) ? $value : ''; } sub method {shift->{'method'}} sub uri {shift->{'uri'}} sub scheme {'http'} sub server_name {'localhost'} sub server_port {shift->{'port'}} sub remote_addr {'127.0.0.1'} sub query_string {shift->{'query_string'}} sub _read_from_stdin { my ($self, $buffer_ref, $size) = @_; $self->{'__CAN_READ_BYTES__'} = $self->http_header('CONTENT_LENGTH') unless exists($self->{'__CAN_READ_BYTES__'}); $size = $self->{'__CAN_READ_BYTES__'} if $size > $self->{'__CAN_READ_BYTES__'}; my $readed = read($self->socket, $$buffer_ref, $size); $self->{'__CAN_READ_BYTES__'} -= $readed; return $readed; } TRUE;