writeFile :: FilePath -> String -> IO()
String
. Questo è il tuo problema, proprio lì. String
è per testo Unicode. Il tentativo di memorizzare dati binari in esso porterà alla corruzione. Non è chiaro in questo caso se la corruzione viene eseguita da simpleHTTP
o da writeFile
, ma alla fine non è importante. Stai utilizzando il tipo sbagliato e qualcosa sta corrompendo i dati quando confrontati con byte che non costituiscono una codifica Unicode valida.
Per quanto riguarda il fissaggio, le nuove versioni di HTTP
sono di tipo polimorfico nel tipo restituito e possono gestire la restituzione dei byte non elaborati in un ByteString
. Hai solo bisogno di cambiare il modo in cui stai scrivendo i byte nel file, in modo che non deduca che vuoi un String
.
import qualified Data.ByteString as B
import Network.HTTP
import Network.URI (parseURI)
main = do
jpg <- get "http://www.irregularwebcomic.net/comics/irreg2557.jpg"
B.writeFile "irreg2557.jpg" jpg
where
get url = let uri = case parseURI url of
Nothing -> error $ "Invalid URI: " ++ url
Just u -> u in
simpleHTTP (defaultGETRequest_ uri) >>= getResponseBody
La costruzione per ottenere una richiesta polimorfica è un po 'maldestra. Se issue #1 viene risolto, utilizzare getRequest url
sarà sufficiente.
La tua risposta è leggermente errata perché 'getRequest' restituisce un' Request_String', che impedisce di essere polimorfico. Modificherò in una versione che funziona per me. –
Whoops. Buona pesca. E questo è un insetto stupido. – Carl