Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
This module handles building multipart/form-data. Example usage:
{-# LANGUAGE OverloadedStrings #-} import Network import Network.HTTP.Client import Network.HTTP.Client.MultipartFormData import Data.Text.Encoding as TE import Control.Monad main = void $ withManager defaultManagerSettings $ \m -> do req1 <- parseRequest "http://random-cat-photo.net/cat.jpg" res <- httpLbs req1 m req2 <- parseRequest "http://example.org/~friedrich/blog/addPost.hs" flip httpLbs m =<< (formDataBody [partBS "title" "Bleaurgh" ,partBS "text" $ TE.encodeUtf8 "矢田矢田矢田矢田矢田" ,partFileSource "file1" "/home/friedrich/Photos/MyLittlePony.jpg" ,partFileRequestBody "file2" "cat.jpg" $ RequestBodyLBS $ responseBody res] req2)
Synopsis
- type Part = PartM IO
- data PartM m
- partName :: PartM m -> Text
- partFilename :: PartM m -> Maybe String
- partContentType :: PartM m -> Maybe MimeType
- partHeaders :: PartM m -> [Header]
- partGetBody :: PartM m -> m RequestBody
- partBS :: Applicative m => Text -> ByteString -> PartM m
- partLBS :: Applicative m => Text -> ByteString -> PartM m
- partFile :: Text -> FilePath -> Part
- partFileSource :: Text -> FilePath -> Part
- partFileSourceChunked :: Text -> FilePath -> Part
- partFileRequestBody :: Applicative m => Text -> FilePath -> RequestBody -> PartM m
- partFileRequestBodyM :: Text -> FilePath -> m RequestBody -> PartM m
- addPartHeaders :: PartM m -> [Header] -> PartM m
- formDataBody :: MonadIO m => [Part] -> Request -> m Request
- formDataBodyWithBoundary :: Applicative m => ByteString -> [PartM m] -> Request -> m Request
- webkitBoundary :: IO ByteString
- webkitBoundaryPure :: RandomGen g => g -> (ByteString, g)
- renderParts :: Applicative m => ByteString -> [PartM m] -> m RequestBody
- renderPart :: Functor m => ByteString -> PartM m -> m RequestBody
Part type
A single part of a multipart message.
partHeaders :: PartM m -> [Header] Source #
List of additional headers
partGetBody :: PartM m -> m RequestBody Source #
Action in m which returns the body of a message.
Constructing parts
:: Applicative m | |
=> Text | Name of the corresponding <input>. |
-> ByteString | The body for this |
-> PartM m |
Make a Part
whose content is a strict ByteString
.
The Part
does not have a file name or content type associated
with it.
:: Applicative m | |
=> Text | Name of the corresponding <input>. |
-> ByteString | The body for this |
-> PartM m |
Make a Part
whose content is a lazy ByteString
.
The Part
does not have a file name or content type associated
with it.
Make a Part
from a file.
The entire file will reside in memory at once. If you want
constant memory usage, use partFileSource
.
The FilePath
supplied will be used as the file name of the
Part
. If you do not want to reveal this name to the server, you
must remove it prior to uploading.
The Part
does not have a content type associated with it.
partFileSourceChunked :: Text -> FilePath -> Part Source #
partFileSourceChunked
will read a file and send it in chunks.
Note that not all servers support this. Only use partFileSourceChunked
if you know the server you're sending to supports chunked request bodies.
The FilePath
supplied will be used as the file name of the
Part
. If you do not want to reveal this name to the server, you
must remove it prior to uploading.
The Part
does not have a content type associated with it.
:: Applicative m | |
=> Text | Name of the corresponding <input>. |
-> FilePath | File name to supply to the server. |
-> RequestBody | Data to upload. |
-> PartM m |
Construct a Part
from form name, filepath and a RequestBody
partFileRequestBody "who_calls" "caller.json" $ RequestBodyBS "{\"caller\":\"Jason J Jason\"}"
-- empty upload form partFileRequestBody "file" mempty mempty
The Part
does not have a content type associated with it.
:: Text | Name of the corresponding <input>. |
-> FilePath | File name to supply to the server. |
-> m RequestBody | Action that will supply data to upload. |
-> PartM m |
Construct a Part
from action returning the RequestBody
partFileRequestBodyM "cat_photo" "haskell-the-cat.jpg" $ do size <- fromInteger <$> withBinaryFile "haskell-the-cat.jpg" ReadMode hFileSize return $ RequestBodySource size $ CB.sourceFile "haskell-the-cat.jpg" $= CL.map fromByteString
The Part
does not have a content type associated with it.
Headers
addPartHeaders :: PartM m -> [Header] -> PartM m Source #
Add a list of additional headers to this Part
.
Building form data
formDataBody :: MonadIO m => [Part] -> Request -> m Request Source #
Add form data to the Request
.
This sets a new requestBody
, adds a content-type request header and changes the method to POST.
formDataBodyWithBoundary :: Applicative m => ByteString -> [PartM m] -> Request -> m Request Source #
Add form data with supplied boundary
Boundary
webkitBoundary :: IO ByteString Source #
Generate a boundary simillar to those generated by WebKit-based browsers.
webkitBoundaryPure :: RandomGen g => g -> (ByteString, g) Source #
Misc
:: Applicative m | |
=> ByteString | Boundary between parts. |
-> [PartM m] | |
-> m RequestBody |
Combine the Part
s to form multipart/form-data body
:: Functor m | |
=> ByteString | Boundary between parts. |
-> PartM m | |
-> m RequestBody |