Xpoint
   [напомнить пароль]

LWP::UserAgent->max_size()

Метки: [без меток]
[удл]
2004-09-05 16:00:31 [обр] frobenius(0/3)[досье]

Добрый день.
Очень хочется забирать разный размер контента с каждым запросом (в частности, 9 раз ничего не забирать, а на 10-й забрать весь контент)

=== cut ===
$agent = LWP::UserAgent->new();
$agent->agent('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)');
$agent->proxy('http', 'http://66.23.49.60:80');
$agent->max_size(10); # get only first 10 bytes

$request = HTTP::Request->new(GET => 'http://someurl.com');
for $i (1..10) {
 $agent->max_size(10000000000) if ($i==10);
 # $agent->max_size(undef) if ($i==10); # get all content if it is last iteration
 $response = $agent->request($request);
}
=== cut ===

так вот, проблема в том, что и в 10-й раз все равно отдается 10 байт :(
смотрим Data::Dumper для UserAgent (предпоследний и последний) -
$VAR1 = bless( {
                 'agent' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)',
                 'protocols_forbidden' => undef,
                 'proxy' => {
                              'http' => 'http://66.23.49.60:80'
                            },
                 'protocols_allowed' => undef,
                 'use_eval' => 1,
                 'max_size' => 10,
                 'from' => undef,
                 'requests_redirectable' => [
                                              'GET',
                                              'HEAD'
                                            ],
                 'timeout' => 180,
                 'parse_head' => 1,
                 'no_proxy' => []
               }, 'LWP::UserAgent' );

 $VAR1 = bless( {
                 'agent' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)',
                 'protocols_forbidden' => undef,
                 'proxy' => {
                              'http' => 'http://66.23.49.60:80'
                            },
                 'protocols_allowed' => undef,
                 'use_eval' => 1,
                 'max_size' => '10000000000',
                 'from' => undef,
                 'requests_redirectable' => [
                                              'GET',
                                              'HEAD'
                                            ],
                 'timeout' => 180,
                 'parse_head' => 1,
                 'no_proxy' => []
               }, 'LWP::UserAgent' );

вроде бы все правильно - 'max_size' меняется как надо.

теперь смотрим на ответ сервера:

$VAR1 = bless( {
                 '_protocol' => 'HTTP/1.1',
                 '_request' => bless( {
                                        '_method' => 'GET',
                                        '_headers' => bless( {
                                                               'accept-language' => 'en',
                                                               'user-agent' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)',
                                                               'range' => 'bytes=0-9',
                                                               'accept-encoding' => 'gzip',
                                                               'accept' => 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, / '
                                                             }, 'HTTP::Headers' ),
                                        '_uri' => bless( do{\(my $o = 'http://someurl.com')}, 'URI::http' ),
                                        '_content' => ''
                                      }, 'HTTP::Request' ),
                 '_headers' => bless( {
                                        'client-response-num' => '1',
                                        'expires' => 'Sun, 05 Sep 2004 11:53:03 GMT',
                                        'content-type' => 'text/html; charset=UTF-8',
                                        'content-length' => '10',
                                        'content-range' => 'bytes 0-9/9920',
                                        'date' => 'Sun, 05 Sep 2004 11:53:03 GMT',
                                        'connection' => 'close',
                                        'client-date' => 'Sun, 05 Sep 2004 12:53:57 GMT',
                                        'via' => '1.1 netcachedc (NetCache NetApp/5.5R4)'
                                      }, 'HTTP::Headers' ),
                 '_msg' => 'OK',
                 '_rc' => '200',
                 '_content' => ' '
               }, 'HTTP::Response' );

тут видно, что дажде несмотря на то что max_size в UserAgent установлен на новый - большой (10000000)
все равно в запросе отправляется старое 'range' => 'bytes=0-9' ! ну и ответ приходит соответственный ('content-range' => 'bytes 0-9/9920')

вопрос собственное в том, как это исправить и где может быть проблема. (кэш, прокси, lwp, в моем коде) ?

P.S. метод HEAD не предлагать, Java-серверы (или jsp/сервлеты) его как-то странно и по-разному обрабатывают.

спустя 1 час 3 минуты [обр] Алексей Севрюков(61/1292)[досье]
frobenius[досье] А если просто каждый раз давать свой content-range? А на последнем указывать тот, который заберет остаток. И скажите пожалуйста зачем это нужно, возможно у проблемы есть другое решение.
спустя 44 минуты [обр] frobenius(0/3)[досье]

совсем не понял ответа.

  1. если в запросе было указано поле 'range', то это поле 'content-range' возвращается сервером (это ответ), так что его менять нельзя, или что ты имел ввиду под "удвоением" ?
  1. если ты имел ввиду на самом деле поле 'range' (в запросе) то оно как раз устанавливается в соответствии с 'max_size' в UserAgent.

причем насколько я подозреваю непосредственно в методе UserAgent::request(); так что руками поменять поля объекта тоже не получится.

  1. зачем это нужно - не имеет значения, мне кажется я достаточно подробно описал и проблему и код и отладочную информацию.

Если надо - вкратце: хочется накликать некоторые данные, а в конце посмотреть счетчик.
Так как контент очень большой то во время "кликанья" не хочется нагружать ни свой ни чужой сервер трафиком.
"Другие решения" - это

  1. метод HEAD. Но как я писал - Java web приложения не всегда его отрабатывают (быть может в зависимости от web сервера, а быть может от реализации методов doGet(), doPost(), service() в сервлетах).
  2. самому открывать сокеты на этот сервер и разрывать соединение сразу после получения заголовков или того что он уже успеет прислать. Но это долго и не нужно, если есть max_size()

на данный момент создал 2 разных объекта UserAgent с разными max_size. как-то громоздко это. вот и хочу избавиться.
чисто в научных целях.

спустя 31 минуту [обр] Алексей Севрюков(61/1292)[досье]

frobenius[досье] Ну тогда даже не знаю. Про java web точно ничего сказать не могу. Но оптимальным был бы конечно именно хеад.
Варинат Б хорош, и не сказать что долго. Читаете все пока не встретите 2 CRLF, и перестаете читать.
И поясните пожалуйста, Вам заголовки то эти при обычных кликах нужны или нет? Если не нужны, то зачем вообще получать ответ от сервера? Запрос послан, обработан, а данные можно и не получать.

Или же Вы можете свой вариант оставить, но тогда придется в цикле каждый раз новый объект HTTP::Request создавать.

спустя 14 минут [обр] frobenius(0/3)[досье]

да, заголовки нужны. ну по крайней мере статус ответа.
так как общение происходит через различные прокси, которые могут падать, то вероятность того, что запрос не пройдет - становится значительной.
считать количество успешных запросов - надо.

не обязательно в цикле, я на данный момент, как и писал, просто создал заранее почти идентичные $agent и $fast_agent - и использую когда надо.

просто вопрос мучает - почему нельзя менять в процессе работы между запросами max_size().

спустя 26 минут [обр] Алексей Севрюков(61/1292)[досье]

frobenius[досье] Я уже объяснил Вам. Скорее всего потому что max_size действует только на один HTTP::Request, попробуйте в цикле создавать новый объект HTTP::Request.

Есть так же метод is_success, который показывает успешный запрос или нет. Так что заголовки наверно-таки не нужны.

спустя 1 день [обр] Закиров Руслан(51/343)[досье]

frobenius[досье] Скорее всего это "фича", что если у реквеста установлен range, то его не меняем. По этому можете очищать данный заголовок в цикле перед тем как отдать реквест агенту:

$request->remove_header( 'range' );

Алексей Севрюков[досье] is_success скорее всего использует теже самые заголовки.

спустя 2 часа 32 минуты [обр] Алексей Севрюков(61/1292)[досье]
Закиров Руслан[досье] Возможно и использует. Об этом и речь :-) Ему и нужны ТОЛЬКО заголовки.
спустя 4 месяца 12 дней [обр] Владимир Палант(146/4445)[досье]
М Перенесено из форума "Программирование::Perl::CGI интерфейс"
спустя 2 года 2 месяца [обр] Алексей Севрюков(61/1292)[досье]
М frobenius[досье] Вы разобрались с темой?
Powered by POEM™ Engine Copyright © 2002-2005