writeFile :: FilePath -> String -> IO()
String
. Ese es tu problema, allí mismo. String
es para texto unicode. Intentar almacenar datos binarios en él dará lugar a la corrupción. No está claro en este caso si la corrupción se está haciendo por simpleHTTP
o por writeFile
, pero en última instancia no es importante. Está utilizando el tipo incorrecto, y algo está corrompiendo los datos cuando se enfrentan con bytes que no constituyen una codificación Unicode válida.
En cuanto a la fijación de esto, las versiones más recientes de HTTP
son polimórficas en su tipo de devolución, y pueden manejar la devolución de los bytes sin formato en un ByteString
. Solo necesita cambiar la forma en que está escribiendo los bytes en el archivo, para que no se infiera que quiere 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 construcción para obtener una solicitud polimórfica es un poco torpe. Si issue #1 alguna vez se repara, entonces usará getRequest url
será suficiente.
Tu respuesta es un poco incorrecta porque 'getRequest' devuelve' Request_String', lo que impide que sea polimórfica. Editaré en una versión que funcione para mí. –
Whoops. Buena atrapada. Y eso es un error tonto. – Carl