Server.Request

type alias Parser decodesTo =
Parser decodesTo ValidationError

A Server.Request.Parser lets you send a Server.Response.Response based on an incoming HTTP request. For example, using a Server.Request.Parser, you could check a session cookie to decide whether to respond by rendering a page for the logged-in user, or else respond with an HTTP redirect response (see the Server.Response docs).

You can access the incoming HTTP request's:

Note that this data is not available for pre-rendered pages or pre-rendered API Routes, only for server-rendered pages. This is because when a page is pre-rendered, there is no incoming HTTP request to respond to, it is rendered before a user requests the page and then the pre-rendered page is served as a plain file (without running your Route Module).

That's why RouteBuilder.preRender has data : RouteParams -> DataSource Data:

import DataSource exposing (DataSource)
import RouteBuilder exposing (StatelessRoute)

type alias Data =
    {}

data : RouteParams -> DataSource Data
data routeParams =
    DataSource.succeed Data

route : StatelessRoute RouteParams Data ActionData
route =
    RouteBuilder.preRender
        { data = data
        , head = head
        , pages = pages
        }
        |> RouteBuilder.buildNoState { view = view }

A server-rendered Route Module does have access to a user's incoming HTTP request because it runs every time the page is loaded. That's why data is a Request.Parser in server-rendered Route Modules. Since you have an incoming HTTP request for server-rendered routes, RouteBuilder.serverRender has data : RouteParams -> Request.Parser (DataSource (Response Data)). That means that you can use the incoming HTTP request data to choose how to respond. For example, you could check for a dark-mode preference cookie and render a light- or dark-themed page and render a different page.

That's a mouthful, so let's unpack what it means.

Request.Parser means you can pull out

data from the request payload using a Server Request Parser.

import DataSource exposing (DataSource)
import RouteBuilder exposing (StatelessRoute)
import Server.Request as Request exposing (Request)
import Server.Response as Response exposing (Response)

type alias Data =
    {}

data :
    RouteParams
    -> Request.Parser (DataSource (Response Data))
data routeParams =
    {}
        |> Server.Response.render
        |> DataSource.succeed
        |> Request.succeed

route : StatelessRoute RouteParams Data ActionData
route =
    RouteBuilder.serverRender
        { head = head
        , data = data
        }
        |> RouteBuilder.buildNoState { view = view }
succeed : value -> Parser value
fromResult : Result String value -> Parser value

Turn a Result into a Request. Useful with andThen. Turns Err into a skipped request handler (non-matching request), and Ok values into a succeed (matching request).

Forms

ServerForms error combined
-> Parser
(Result
{ fields : List ( String, String )
, errors : Dict String (List error)
}
combined
)
error
(DataSource (Validation error combined kind constraints))
-> Parser
(DataSource
(Result (Response error) ( Response error, combined ))
)
rawFormData : Parser (List ( String, String ))

Direct Values

method : Parser Method
rawBody : Parser (Maybe String)
allCookies : Parser (Dict String String)
rawHeaders : Parser (Dict String String)
queryParams : Parser (Dict String (List String))
requestTime : Parser Posix
optionalHeader : String -> Parser (Maybe String)
expectContentType : String -> Parser ()
expectJsonBody : Decoder value -> Parser value
acceptMethod : ( Method, List Method ) -> Parser value -> Parser value
acceptContentTypes : ( String, List String ) -> Parser value -> Parser value

Transforming

map : (a -> b) -> Parser a -> Parser b
map2 : (a -> b -> c) -> Parser a -> Parser b -> Parser c
oneOf : List (Parser a) -> Parser a
andMap : Parser a -> Parser (a -> b) -> Parser b

Decode an argument and provide it to a function in a decoder.

decoder : Decoder String
decoder =
    succeed (String.repeat)
        |> andMap (field "count" int)
        |> andMap (field "val" string)


""" { "val": "hi", "count": 3 } """
    |> decodeString decoder
--> Success "hihihi"
andThen : (a -> Parser b) -> Parser a -> Parser b

Query Parameters

queryParam : String -> Parser (Maybe String)
expectQueryParam : String -> Parser String

Cookies

expectCookie : String -> Parser String

Headers

expectHeader : String -> Parser String

Multi-part forms and file uploads

type alias File =
{ name : String
, mimeType : String
, body : String
}
( { field : String -> Parser String
, optionalField : String -> Parser (Maybe String)
, fileField : String -> Parser File
}
-> Parser decodedForm
)
-> Parser decodedForm

Request Parsers That Can Fail

expectBody : Parser String

Same as rawBody, but will only match when a body is present in the HTTP request.

Map Functions

(value1 -> value2 -> value3 -> valueCombined)
-> Parser value1
-> Parser value2
-> Parser value3
-> Parser valueCombined
(value1 -> value2 -> value3 -> value4 -> valueCombined)
-> Parser value1
-> Parser value2
-> Parser value3
-> Parser value4
-> Parser valueCombined
(value1 -> value2 -> value3 -> value4 -> value5 -> valueCombined)
-> Parser value1
-> Parser value2
-> Parser value3
-> Parser value4
-> Parser value5
-> Parser valueCombined
(value1 -> value2 -> value3 -> value4 -> value5 -> value6 -> valueCombined)
-> Parser value1
-> Parser value2
-> Parser value3
-> Parser value4
-> Parser value5
-> Parser value6
-> Parser valueCombined
( value1
-> value2
-> value3
-> value4
-> value5
-> value6
-> value7
-> valueCombined
)
-> Parser value1
-> Parser value2
-> Parser value3
-> Parser value4
-> Parser value5
-> Parser value6
-> Parser value7
-> Parser valueCombined
( value1
-> value2
-> value3
-> value4
-> value5
-> value6
-> value7
-> value8
-> valueCombined
)
-> Parser value1
-> Parser value2
-> Parser value3
-> Parser value4
-> Parser value5
-> Parser value6
-> Parser value7
-> Parser value8
-> Parser valueCombined
( value1
-> value2
-> value3
-> value4
-> value5
-> value6
-> value7
-> value8
-> value9
-> valueCombined
)
-> Parser value1
-> Parser value2
-> Parser value3
-> Parser value4
-> Parser value5
-> Parser value6
-> Parser value7
-> Parser value8
-> Parser value9
-> Parser valueCombined

Method Type

type Method
= Connect
| Delete
| Get
| Head
| Options
| Patch
| Post
| Put
| Trace
| NonStandard String

Gets the HTTP Method as a String, like 'GET', 'PUT', etc.

Internals

TODO internal only

Parser (DataSource response)
-> Decoder
(Result
(DataSource response)
)

TODO internal only