Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > вопрос по HTTP::Request


Автор: sPhoenix 21.11.2008, 21:57
допустим через HTTP::Daemon принимается http-запрос.
методом get_request() его можно представить в виде HTTP::Request

если потом вызвать метод as_string() то вроде как я должен буду получить исходный запрос.
Но дело в том что он довольно таки сильно искажается.
1. В http-заголовке все переносы строки \x0D\x0A преобразуются в \x0A, 
а некоторые сервера отказываются принимать такой запрос.
но исправить заголовок обратно несложно и все работает.

2. Следующая проблема в POST запросе для аплоада файлов. 
запрос изменяется достаточно сильно и никакие веб-сервера его более не принимают,
причем искажается и содержимое файлов. 

есть ли способы как-нибудь изъять весь http-запрос неповрежденным?
заранее спасибо.

Автор: tolkien 22.11.2008, 01:42
Отправляйте запрос через проксю и смотрите ее логи

Автор: sPhoenix 22.11.2008, 16:36
попытался сравнить POST-запрос (аплоад файла), который возвращает метод as_string() с POST-запросом, полученным через сокеты, но в чем причина различий не обнаружил:
1. то что описывал -  \x0A вместо \x0D\x0A
2. изменен порядок следования строк в HTTP-заголовке 

Тем не менее почему-то запрос, полученый через сокеты и перенаправленный на веб-сервер работает отлично.
Если больше советов не будет наверно оставлю этот способ...
хотя скрипт будет красивее если использовать HTTP::Daemon.

Но теперь у меня возникла другая проблема - как через сокеты оптимальнее всего получать HTTP-запрос?
Я сделал так:
Код

sub RecvHttpRequest()
{
    my $socket = shift;
    my ($buf,$http,$tick);
    my $select = new IO::Select($socket);
    while($tick<3) #Ждать 3 таймаута
    {
        if(defined($select->can_read(0.09)))
        {   
            last if !sysread($socket, $buf, 4096);
            $http.=$buf;
        }else{
            $tick++;
        }
    }
    $select->remove($socket);
    return $http;
}


но мне кажется что это не очень правильно. Что скажете?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)