2010-11-30 33 views
3

J'ai regardé dans Mochiweb, mais je ne peux pas trouver un moyen de lire le corps pendant que je reçois la demande à travers le socket. Je ne suis pas limité à Mochiweb, toute autre bibliothèque HTTP serait bonne pour moi.Lire dans Erlang le corps d'une requête HTTP telle qu'elle est reçue

J'ai également essayé gen_tcp:listen(Port, [{packet, http}]), de cette façon je peux lire le corps/en-têtes pendant que je reçois la requête HTTP, mais je dois gérer manuellement les réponses et garder le socket ouvert pour plus de demandes, donc je préfère ne pas utiliser Solution.

Mon intention est de recevoir une requête avec de grands corps et de ne pas attendre de recevoir le corps entier pour commencer à le lire/traiter.

Répondre

3

Avec mochiweb, vous pouvez plier des blocs du corps de la demande en utilisant Req:stream_body/3. Il attend une fonction de gestionnaire de segments comme deuxième argument. Ce gestionnaire est appelé avec {ChunkSize, BinaryData} et votre état pour chaque tronçon, tel qu'il est reçu de la socket.

Exemple (récupération d'un [inversé] liste des morceaux):

MaxChunkSize = 100, 
InitialState = [], 
ChunkHandler = fun ({_Size, Bin}, State) -> [Bin | State] end, 
List = Req:stream_body(MaxChunkSize, ChunkHandler, InitialState), 
... 
+0

Cela doit être fait à l'intérieur du gestionnaire de requêtes défini? Mais le gestionnaire de requêtes est appelé lorsque la requête complète a été reçue, n'est-ce pas? Je ne vois pas comment 'Req: stream_body (...)' lit le corps pendant qu'il arrive à travers le socket. Je dois me tromper dans quelque chose, mais je ne sais pas où. – Ricardo

+0

le gestionnaire de requêtes est appelé assez tôt, dès que les en-têtes ont été lus. à l'intérieur du gestionnaire, vous pouvez soit recevoir la requête complète en utilisant 'Req: recv_body/0', soit le streamer en utilisant' Req: stream_body/3'. L'implémentation de 'stream_body' lit les données de la socket en segments et les transmet à votre fonction de gestionnaire de segments. crois moi, ça marche! –

+0

OK, cela a du sens. Merci pour votre aide Félix. – Ricardo