View Source Mobilizon.Web.ReverseProxy (Mobilizon v4.1.0-alpha.1)

A reverse proxy.

Mobilizon.Web.ReverseProxy.call(conn, url, options)

It is not meant to be added into a plug pipeline, but to be called from another plug or controller.

Supports ["GET", "HEAD"] HTTP methods, and only allows [200, 206, 304] status codes.

Responses are chunked to the client while downloading from the upstream.

Some request / responses headers are preserved:

  • request: ["accept", "user-agent", "accept-encoding", "cache-control", "if-modified-since", "if-unmodified-since", "if-none-match", "range", "if-range"]
  • response: ["etag", "date", "last-modified", "content-length", "content-type", "content-disposition", "content-encoding", "content-range", "accept-ranges", "vary"]

If no caching headers (["etag", "date", "last-modified"]) are returned by upstream, cache-control will be set to "public, max-age=1209600".

Options:

  • redirect_on_failure (default false). Redirects the client to the real remote URL if there's any HTTP errors. Any error during body processing will not be redirected as the response is chunked. This may expose remote URL, clients IPs, ….

  • max_body_length (default :infinity): limits the content length to be approximately the specified length. It is validated with the content-length header and also verified when proxying.

  • max_read_duration (default 30000 ms): the total time the connection is allowed to read from the remote upstream.

  • inline_content_types:

    • true will not alter content-disposition (up to the upstream),

    • false will add content-disposition: attachment to any request,

    • a list of allowlisted content types

    • keep_user_agent will forward the client's user-agent to the upstream. This may be useful if the upstream is doing content transformation (encoding, …) depending on the request.

  • req_headers, resp_headers additional headers.

  • http: options for hackney.

Summary

Types

@type option() ::
  {:keep_user_agent, boolean()}
  | {:max_read_duration, :timer.time() | :infinity}
  | {:max_body_length, non_neg_integer() | :infinity}
  | {:http, []}
  | {:req_headers, [{String.t(), String.t()}]}
  | {:resp_headers, [{String.t(), String.t()}]}
  | {:inline_content_types, boolean() | [String.t()]}
  | {:redirect_on_failure, boolean()}

Functions

Link to this function

call(conn, url, opts \\ [])

View Source
@spec call(Plug.Conn.t(), url :: String.t(), [option()]) :: Plug.Conn.t()
@spec filename(String.t()) :: String.t() | nil