2017-08-02 2 views
0

Ich versuche, eine Middleware zu erstellen, die 500 Fehler an einen Remote-Server sendet. Die Fehlerinformation befindet sich im Antworttext.Wie Antwort Körper in WAI Middleware lesen?

Wie kann ich den Antwortkörper von einer Response als irgendeine Art Schnur erhalten? Ich sehe responseToStream, aber ich kann nicht herausfinden, wie man es benutzt.

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

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

Das Ergebnis 'responseToStream' ist ein 3-fach; Ich nehme an, mit "Körper" meinst du, dass du an der dritten Komponente interessiert bist und nicht an den ersten beiden (die konkrete, d. H. Nicht abstrakte, algebraische Typen sind, so dass du direkt auf ihre Felder zugreifen kannst). Für die dritte Komponente könnten Sie wahrscheinlich einfach eine Funktion für Builder -> IO() 'übergeben, die jeden' ​​Builder' an ein 'IORef' (oder' MVar' in einer gleichzeitigen Einstellung) anpasst - "der erste Parameter bietet die Möglichkeit, einen weiteren Datenblock zu senden "(hier wird das Senden nur im Speicher gespeichert). – user2407038

Antwort

0

eine Implementierung des Kommentars von @ 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 
Verwandte Themen