2016-06-16 5 views
1

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

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

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

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

Если я делать запросы ГОЛОВЫ на каждом URL первых, чтобы определить его тип контента и контент-размер, это поможет с проблемой памяти, но это займет почти в два раза больше времени (0,7 сек для запроса головы а затем 0,7 для фактического запроса)

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

ответ

2

Возможно, но это сложно.

Согласно HTTP/1.1 spec, на самом деле существует «частичное GET».

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

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

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

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

+0

Я искал информацию об этом в течение часа, и это, безусловно, лучший и самый тщательный ответ. Спасибо. 'HEAD', а затем' GET'. – MothOnMars