В Haskell ищем пакет, который позволяет использовать тело веб-ответа в виде потока

из RWH http://book.realworldhaskell.org/read/extended-example-web-client-programming.html

Используемая здесь библиотека HTTP не лениво считывает результат HTTP. В результате это может привести к потреблению большого объема оперативной памяти при загрузке больших файлов, таких как подкасты. Доступны другие библиотеки, не имеющие этого ограничения. Мы использовали этот, потому что он стабилен, прост в установке и достаточно прост в использовании. Мы предлагаем мини-http, доступный в Hackage, для серьезных потребностей HTTP.

mini-http устарел из-за взлома. Вопрос прост: знаете ли вы какой-либо пакет, который предлагает и API для выполнения http-запросов и использования тела ответа без его полной загрузки в память.

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

Может быть, основанный на итерации API?


person Sadache    schedule 20.06.2010    source источник


Ответы (2)


Вы хотите загружать файлы на стороне клиента в виде потока? Как насчет ленивый интерфейс download-curl?

Может быть хорошо для ваших нужд (или с небольшой настройкой).

person Don Stewart    schedule 20.06.2010
comment
так как вы предлагаете это, я полагаю, вы имеете в виду безопасный ленивый? - person Sadache; 21.06.2010
comment
Он, безусловно, обеспечивает ленивый поток, который можно преобразовать путем итерации. В потоках, основанных на ленивости по частям, нет ничего изначально небезопасного, на самом деле, в данном случае, на мой взгляд, это идеальная абстракция. См. мнения Дункана: stackoverflow. ком/вопросы/2981582/ - person Don Stewart; 21.06.2010
comment
как насчет ленивого возврата ByteString базового HTTP-пакета? - person Sadache; 21.06.2010
comment
lazy ByteString, кажется, работает в пакете HTTP, чем он уступает другим ленивым подходам? - person Sadache; 22.06.2010

В общем, есть общая проблема, связанная с ленивым разбором чего-то с проверкой. Когда вы получаете ответ HTTP, который содержит заголовок «Content-Length», вы должны убедиться, что вы прочитаете все эти данные, прежде чем соединение будет закрыто. Это означает, что вы не можете сказать, что ответ действителен, пока не прочитаете его до конца. И вашему сопоставлению придется подождать, а затем обработать весь результат.
Чтобы избежать того, что ваша библиотека может быть менее строгой и проверять только правильность заголовка и, возможно, первую часть данных (в случае фрагментации или сжатия) и возвращать тело с меньшей длиной или равно "Content-Length". Или вы можете использовать свой собственный поток фрагментов, который возвращает Success или Fail в качестве последнего фрагмента.
Другой подход заключается в том, чтобы пожертвовать своим процессором для обработки ответа, когда вы его читаете (например, внутри монады), и когда нет достоверных данных для при следующем чтении вы прервете все свои предыдущие расчеты.

Я бы посоветовал также взглянуть на http://hackage.haskell.org/package/http-monad. Никогда не использовал его, но я надеюсь, что с монадным интерфейсом он реализует этот последний подход.

person ony    schedule 21.06.2010