2017-08-02 5 views
0

J'essaie de créer un middleware qui enverra 500 erreurs à un serveur distant. L'information d'erreur est dans le corps de la réponse.Comment lire le corps de la réponse dans le middleware WAI?

Comment puis-je obtenir le corps de réponse d'un Response comme n'importe quel type de chaîne? Je vois responseToStream mais je n'arrive pas à comprendre comment l'utiliser.

import Network.Wai 
import Data.ByteString.Lazy (ByteString) 

responseBody :: Response -> IO ByteString 
responseBody res = _ 
+1

Le résultat de 'responseToStream' est un 3-tuple; Je suppose que par "corps" vous voulez dire que vous êtes intéressé par le 3ème composant et non par les deux premiers (qui sont des types algébriques concrets, c'est-à-dire non-abstraits, donc vous pouvez accéder directement à leurs champs). Pour la 3ème compilation, vous pourriez probablement passer une fonction pour 'Builder -> IO()' qui 'mappend's chaque' Builder' à un 'IORef' (ou' MVar' dans un paramètre simultané) - "le premier paramètre fournit un moyen d'envoyer un autre morceau de données "(ici 'envoi' est juste en train d'enregistrer en mémoire). – user2407038

Répondre

0

Une mise en œuvre du commentaire par @ user2407038:

import Data.IORef (newIORef,modifyIORef',readIORef) 
import Data.Monoid ((<>)) 
import Data.ByteString.Lazy (ByteString) 
import Data.ByteString.Builder (toLazyByteString) 

import Network.Wai 

responseBody :: Response -> IO ByteString 
responseBody res = 
    let (status,headers,body) = responseToStream res in 
    body $ \f -> do 
    content <- newIORef mempty 
    f (\chunk -> modifyIORef' content (<> chunk)) (return()) 
    toLazyByteString <$> readIORef content