Можно ли отбросить http-запрос в Ruby в зависимости от его текущего размера?

Я использую Typhoeus в качестве примера, но код может быть в любом Ruby. Предположим, есть 10000 URL, которые выглядят так:

http://example.com/somerandomstringwithoutextension
  1. URL могут быть любого типа контента - видео, HTML, изображения, что угодно.
  2. Мне нужно только загрузить HTML-документы и игнорировать остальные для скорости и эффективности использования памяти.

Если я запускаю следующий код для видео размером 5 ГБ, это приведет к сбою приложения, поскольку оно попытается загрузить все видео в память.

res = Typhoeus::Request.new(url, timeout: 15, followlocation: true).run

Если я сначала сделаю запросы HEAD для каждого URL-адреса, чтобы определить его тип и размер, это поможет решить проблему с памятью, но это займет почти вдвое больше времени (0,7 с для запроса заголовка, а затем 0,7 для фактического запроса).)

Есть ли какой-нибудь способ сделать http-запрос в Ruby, посмотреть, какой в ​​данный момент размер передаваемого содержимого, и отбросить его, если он достигнет определенного предела? Например, отбрасывать запросы, если они больше 5 МБ? Кроме того, можно удалить его в зависимости от типа контента.

1 ответ

Это может быть возможно, но это сложно.

Согласно спецификации HTTP/1.1, существует "частичное GET".

Семантика метода GET меняется на "частичное GET", если сообщение запроса включает в себя поле заголовка Range. Частичное GET запрашивает, чтобы была передана только часть объекта, как описано в разделе 14.35. Метод частичного GET предназначен для уменьшения ненужного использования сети, позволяя завершить частично извлеченные объекты без передачи данных, уже сохраненных клиентом.

Вы можете указать поле заголовка Range для запуска "частичного GET", но это зависит от того, поддерживает ли его сервер. Также я сомневаюсь, что клиент Typhoeus поддерживает частичное GET, возможно, вам придется использовать Net::HTTP чтобы достичь этого, и я не уверен, что это достижимо либо.

Я бы посоветовал вам придерживаться первоначального плана: сначала HEAD, а затем GET, так как он предназначен для HEAD.

Метод HEAD идентичен GET, за исключением того, что сервер НЕ ДОЛЖЕН возвращать тело сообщения в ответе. Метаинформация, содержащаяся в заголовках HTTP в ответ на запрос HEAD, ДОЛЖНА быть идентична информации, отправленной в ответ на запрос GET. Этот метод может использоваться для получения метаинформации о сущности, подразумеваемой запросом, без передачи самого тела сущности. Этот метод часто используется для тестирования гипертекстовых ссылок на валидность, доступность и последние изменения.

Другие вопросы по тегам