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;