defmodule Req.Request do
@moduledoc """
The request pipeline struct.
Fields:
* `:method` - the HTTP request method
* `:url` - the HTTP request URL
* `:headers` - the HTTP request headers
* `:body` - the HTTP request body
* `:unix_socket` - if set, connect through the given UNIX domain socket
* `:halted` - whether the request pipeline is halted. See `halt/1`
* `:request_steps` - the list of request steps
* `:response_steps` - the list of response steps
* `:error_steps` - the list of error steps
* `:private` - a map reserved for libraries and frameworks to use.
Prefix the keys with the name of your project to avoid any future
conflicts. Only accepts `t:atom/0` keys.
"""
defstruct [
:method,
:url,
headers: [],
body: "",
unix_socket: nil,
halted: false,
request_steps: [],
response_steps: [],
error_steps: [],
private: %{}
]
@doc """
Gets the value for a specific private `key`.
"""
def get_private(request, key, default \\ nil) when is_atom(key) do
Map.get(request.private, key, default)
end
@doc """
Assigns a private `key` to `value`.
"""
def put_private(request, key, value) when is_atom(key) do
put_in(request.private[key], value)
end
@doc """
Halts the request pipeline preventing any further steps from executing.
"""
def halt(request) do
%{request | halted: true}
end
end