HORIZON HASKELLDocslts/ghc-9.10.x248f8f02026-10-05Search names, modules, packages, or :: a typeCtrl K

GHC 9.10.3 · lts/ghc-9.10.x · 248f8f0 · 2026-10-05

Modulehttp-common-0.8.3.4Haskell2010

Network.Http.RequestBuilder

  • 1 type
  • 13 values
  • Packagehttp-common-0.8.3.4
  • Exports14
  • LanguageHaskell2010
  • LicenceBSD-3-Clause
  • SourceRequestBuilder.hs
newtypenewtype RequestBuilder α
#

The RequestBuilder monad allows you to abuse do-notation to conveniently setup a Request object.

Instances4Monad, Functor, Applicative, MonadState
valuebuildRequest :: Monad ν => RequestBuilder α -> ν Request
#

Run a RequestBuilder from within a monadic action.

Older versions of this library had buildRequest in IO; there's no longer a need for that, but this code path will continue to work for existing users.

    q <- buildRequest $ do
             http GET "/"

Run a RequestBuilder, yielding a Request object you can use on the given connection.

    let q = buildRequest1 $ do
                http POST "/api/v1/messages"
                setContentType "application/json"
                setHostname "clue.example.com" 80
                setAccept "text/html"
                setHeader "X-WhoDoneIt" "The Butler"

Obviously it's up to you to later actually send JSON data.

Set the [virtual] hostname for the request. In ordinary conditions you won't need to call this, as the Host: header is a required header in HTTP 1.1 and is set directly from the name of the server you connected to when calling Network.Http.Connection.openConnection.

valuesetAccept' :: [(ByteString, Float)] -> RequestBuilder ()
#

Indicate the content types you are willing to receive in a reply from the server in order of preference. A call of the form:

        setAccept' [("text/html", 1.0),
                    ("application/xml", 0.8),
                    ("*/*", 0)]

will result in an Accept: header value of text/html; q=1.0, application/xml; q=0.8, */*; q=0.0 as you would expect.

Set username and password credentials per the HTTP basic authentication method.

        setAuthorizationBasic "Aladdin" "open sesame"

will result in an Authorization: header value of Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==.

Basic authentication does not use a message digest function to encipher the password; the above string is only base-64 encoded and is thus plain-text visible to any observer on the wire and all caches and servers at the other end, making basic authentication completely insecure. A number of web services, however, use SSL to encrypt the connection that then use HTTP basic authentication to validate requests. Keep in mind in these cases the secret is still sent to the servers on the other side and passes in clear through all layers after the SSL termination. Do not use basic authentication to protect secure or user-originated privacy-sensitve information.

Specify the length of the request body, in bytes.

RFC 2616 requires that we either send a Content-Length header or use Transfer-Encoding: chunked. If you know the exact size ahead of time, then call this function; the body content will still be streamed out by io-streams in more-or-less constant space.

This function is special: in a PUT or POST request, http-streams will assume chunked transfer-encoding unless you specify a content length here, in which case you need to ensure your body function writes precisely that many bytes.

Specify that this request should set the expectation that the server needs to approve the request before you send it.

This function is special: in a PUT or POST request, http-streams will wait for the server to reply with an HTTP/1.1 100 Continue status before sending the entity body. This is handled internally; you will get the real response (be it successful 2xx, client error, 4xx, or server error 5xx) in receiveResponse. In theory, it should be 417 if the expectation failed.

Only bother with this if you know the service you're talking to requires clients to send an Expect: 100-continue header and will handle it properly. Most servers don't do any precondition checking, automatically send an intermediate 100 response, and then just read the body regardless, making this a bit of a no-op in most cases.

Override the default setting about how the entity body will be sent.

This function is special: this explicitly sets the Transfer-Encoding: header to chunked and will instruct the library to actually tranfer the body as a stream ("chunked transfer encoding"). See setContentLength for forcing the opposite. You really won't need this in normal operation, but some people are control freaks.

Set a generic header to be sent in the HTTP request. The other methods in the RequestBuilder API are expressed in terms of this function, but we recommend you use them where offered for their stronger types.

If sending multipart form data (RFC 7578), you need to set the MIME type to "multipart/form-data" and specify the boundary separator that will be used.

This function is special: you must subsequently use Network.Http.Client.multipartFormBody to sequence the individual body parts. When sending the request it will separate the individual parts by the boundary value set by this function.