2010-06-20 13 views
3

de RWH http://book.realworldhaskell.org/read/extended-example-web-client-programming.htmlDans Haskell la recherche d'un package qui permet de consommer un corps de réponse Web en tant que flux

La bibliothèque HTTP utilisé ici ne lit pas le résultat HTTP paresseusement. En conséquence, il peut entraîner la consommation d'une grande quantité de RAM lors du téléchargement de gros fichiers tels que des podcasts. D'autres bibliothèques sont disponibles qui n'ont pas cette limitation. Nous avons utilisé celui-ci parce qu'il est stable, facile à installer et relativement facile à utiliser. Nous suggérons le mini-http, disponible chez Hackage, pour les besoins HTTP sérieux.

mini-http est déconseillé lors du hackage. La recherche est simple: Connaissez-vous un paquet qui offre et api pour faire des requêtes http et consommer le corps de la réponse sans le charger entièrement en mémoire.

Ce que je veux, c'est une API qui offre un flux qui peut être transformé en itérant sur elle. Une fois l'exemple simple compte les octets dans une réponse.

Peut-être une api basée sur l'itérétion?

Répondre

2

Vous souhaitez télécharger des fichiers en tant que flux? Que diriez-vous de download-curl's lazy interface?

Peut-être bien pour vos besoins (ou avec un peu de peaufinage).

+0

puisque vous le suggérez je suppose que vous voulez dire paresseux sûr? – Sadache

+0

Il fournit certainement un flux paresseux qui peut être transformé en itérant sur lui. Il n'y a rien d'intrinsèquement dangereux au sujet des cours d'eau qui se fonde sur la paresse en morceaux, en fait, dans ce cas, c'est l'abstraction parfaite, à mon avis. Voir les vues de Duncan: http://stackoverflow.com/questions/2981582/haskell-lazy-i-o- and-closing-files/2984556#2984556 –

+0

qu'en est-il du retour paresseux ByteString du paquet HTTP de base? – Sadache

2

En général, il y a un problème commun lié à l'analyse paresseuse de quelque chose avec validation. Lorsque vous recevez une réponse HTTP qui contient l'en-tête "Content-Length", vous devez vérifier que vous allez lire toutes ces données avant que la connexion ne soit fermée. Cela signifie que vous ne pouvez pas dire que la réponse est valable jusqu'à ce que vous lisiez jusqu'à la fin. Et votre cartographie devra attendre et ensuite traiter l'ensemble du résultat.
Pour éviter que votre bibliothèque ne soit moins stricte et ne vérifie que l'exactitude des en-têtes et probablement la première partie des données (en cas de segmentation ou compression) et retourne le corps avec une longueur inférieure ou égale à "Content-Length". Ou vous pouvez utiliser votre propre flux de segments qui renvoie Success ou Fail comme dernier segment.
Une autre approche consiste à sacrifier votre CPU pour traiter la réponse lorsque vous la lisez (par exemple, à l'intérieur de monad) et quand il n'y a pas de données valides pour la prochaine lecture, vous annulez tous vos calculs précédents. Je voudrais suggérer de regarder http-monad aussi. Je ne l'ai jamais utilisé, mais j'espère qu'avec l'interface monad il implémente cette dernière approche.