Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Баг в LWP или у меня руки не из того места растут?  (Прочитано 810 раз)
0 Пользователей и 1 Гость смотрят эту тему.
perl6
Помогающий

ru
Offline Offline

« : 02-07-2022 23:50 » 

Приветствую. Понадобилось решить такую задачу - есть покупные прокси, резидентские, приобретены для парсинга. Так как там лимит по трафу, при превышении, плати еще, мною принято гениальное при свой простоте решение - не грузить страницы весом более (в моем случае, 150 Кб)... Так вот, в LWP есть фишка, вроде max_size(), которая казалось бы должна помочь, зачем голову то напрягать, раз умные дяди разрабы либы уже подумали за нас.

Но, как это обычно бывает, не все так просто!!! При указании лимита, страница ГРУЗИТСЯ ровно на этот лимит, а потом серверу шлется "Client Connect Aborted" и соединение закрывается. Если проще, например, указал я лимит в 150Кб, а страница весит 300Кб. Эта опция загрузит 150Кб, а потом разорвет коннект. Может так оно и надо, а разраб либы лучше меня знает, только это решение мне не подходит. Траф все-равно израсходуется, а кусок страницы мне не нужен.

Почесав репу и посмотрев доки, было принято решение придумать что-то свое. Порассуждав логически, я пришел к выводу, что можно "навесив" соотв. обработчик, получить через заголовок Content-Length размер страницы, если он больше лимита, то ничего не грузить.

Вот такой вот говнокод спас ситуацию:

Код: (Perl)
       $ua->add_handler(response_header => sub {
           my ($response, $ua) = @_;
       
           die if $response->header('content-length') > 150000;
       
      }, m_code => [200]);;


Все работает нормально, однако, есть нехорошие сервера, вроде mail.ru, где LWP не видит заголовок Content-Length, хотя, он там есть.

Собственно, непонятно, кто виноват и что делать? То ли это я где накосячил, то ли LWP спотыкается на заголовках, ибо у того же mail.ru реальная дичь там творится, заголовков много и данных в них...
« Последнее редактирование: 02-07-2022 23:57 от perl6 » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 03-07-2022 01:02 » 

Длина — не обязательный параметр. Для динамического контента, часто, размер не известен. Если веб-сервер не ждет все тело от бекенда и бекенд не предоставляет длину, то это твой случай.
Я бы считывал нужное количество байт и на потом закрывал бы сокет. Смотри response_data:
Цитата
This handler is called for each chunk of data received for the response. The handler might croak to abort the request.
This handler needs to return a TRUE value to be called again for subsequent chunks for the same request.
Для таких случаев часто используется chunk-encoded transfer. Думаю, тут речь про это. Уточнить можешь посмотрев исходники.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
perl6
Помогающий

ru
Offline Offline

« Ответ #2 : 03-07-2022 22:34 » new

Хорошо, спасибо Вам за наводку.  Внимание! Говорит и показывает...
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines