Ограничить размер ответа, прочитанного остальным клиентом

Я использую гем Ruby rest-client (1.6.7) для получения данных с помощью HTTP-запросов GET. Однако иногда ответы больше, чем я хочу обработать, поэтому я хотел бы каким-то образом остановить чтение RestClient, как только оно превысит установленный мной предел размера. В документации говорится

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

но я не вижу, как это мне помогает. Я не вижу ничего похожего на хук в обработке входящего потока данных, только операции, которые я мог бы выполнить после того, как все это будет прочитано. Я не хочу тратить время и память на чтение огромного ответа в буфер только для того, чтобы отбросить его.

Как я могу установить ограничение на количество данных, прочитанных RestClient в запросе GET? Или я могу использовать другой клиент, который упрощает установку такого ограничения?


person Old Pro    schedule 03.10.2013    source источник
comment
Можете ли вы просто использовать заголовок Content-Length для проверки размера ответа и затем решить, следует ли продолжать?   -  person EdvardM    schedule 10.07.2015


Ответы (1)


rest-client использует Ruby Net::HTTP ниже: https://github.com/rest-client/rest-client/blob/master/lib/restclient/request.rb#L303

К сожалению, похоже, что Net::HTTP не позволит вам отказаться от ответа на основе его длины, поскольку он, в конце концов, использует этот метод для отправки всех запросов: http://docs.ruby-lang.org/en/2.0.0/Net/HTTP.html#method-i-transport_request

Как видите, он использует HTTPResponse для чтения HTTP-ответа с сервера: http://ruby-doc.org/stdlib-2.0.0/libdoc/net/http/rdoc/Net/HTTPResponse.html#method-i-read_body

HTTPResponse кажется местом, где вы можете контролировать, читать ли весь ответ и сохранять его в памяти или читать и выбрасывать. Если вы не хотите даже читать ответ, я думаю, вам нужно закрыть сокет.

Я не знаю, есть ли rest-клиенты с нужным вам функционалом. Я думаю, вам нужно написать свой собственный маленький клиент для отдыха, если вы хотите иметь такой тонкий контроль.

person Timmy    schedule 20.08.2015
comment
У меня есть еще немного времени, чтобы прочитать код. Вы можете использовать :raw_response => true, и в этом случае вы можете обрабатывать тело ответа по частям. github.com/rest-client/ rest-client/blob/ Обратите внимание, что тело будет сохранено в любом случае. Если вы хотите перестать читать ответ, вам придется взломать метод fetch_body, чтобы выбрасывать куски, никуда не записывая их. - person Timmy; 22.08.2015