module HScraper.Network
( fetchResponse
, parseParams
, fetchRequestWith
, defaultGETRequest
, fetchGETRequest
, defaultPOSTRequest
, fetchPOSTRequest
) where
import Control.Monad
import qualified Data.ByteString.Lazy as BL
import Data.ByteString.Char8 (pack)
import qualified Data.ByteString as B
import Data.Text.Encoding
import qualified Data.Text as T
import Control.Applicative((<$>))
import Network.HTTP.Conduit
import Network.HTTP.Types.Method
import Network.HTTP.Types.Header
fetchResponse :: String -> IO T.Text
fetchResponse url = liftM (decodeUtf8 . B.concat . BL.toChunks ) $ simpleHttp url
parseParams :: [(String, String)] -> String
parseParams [] = ""
parseParams [(name, value)] = name ++ "=" ++ value
parseParams ((name, value) : xs) = name ++ "=" ++ value ++ "&" ++ parseParams xs
fetchRequestWith :: Request -> Manager -> IO T.Text
fetchRequestWith req manager = decodeUtf8 . B.concat . BL.toChunks . responseBody <$> httpLbs req manager
defaultGETRequest :: String -> [(String,String)] -> IO Request
defaultGETRequest url list = do
initReq <- parseUrl url
return initReq { method = methodGet
, queryString = pack $ parseParams list
}
fetchGETRequest :: String -> [(String, String)] -> IO T.Text
fetchGETRequest url list = do
req <- defaultGETRequest url list
man <- newManager tlsManagerSettings
res <- httpLbs req man
return $ decodeUtf8 . B.concat . BL.toChunks $ responseBody res
defaultPOSTRequest :: String -> [(String,String)] -> IO Request
defaultPOSTRequest url list = do
initReq <- parseUrl url
return initReq { method = methodPost
, requestBody = RequestBodyBS $ Data.ByteString.Char8.pack $ parseParams list
, requestHeaders = [ (hContentType, pack "application/x-www-form-urlencoded" ) ]
}
fetchPOSTRequest :: String -> [(String, String)] -> IO T.Text
fetchPOSTRequest url list = do
req <- defaultPOSTRequest url list
manager <- newManager tlsManagerSettings
res <- httpLbs req manager
return $ decodeUtf8 . B.concat . BL.toChunks $ responseBody res