Plug.Conn.Utils

Utilities for working with connection data

Summary

Functions

Parses a comma-separated list of header values

Parses a value as defined in [RFC-1341][1]. For convenience, trims whitespace at the end of the token. Returns false if the token is invalid

Parses content type (without wildcards)

Parses headers parameters

Parses media types (with wildcards)

Validates the given binary is valid UTF-8

Types

params :: [{binary, binary}]

Functions

content_type(binary)

Specs

content_type(binary) ::
  {:ok, type :: binary, subtype :: binary, params} |
  :error

Parses content type (without wildcards).

It is similar to media_type/1 except wildcards are not accepted in the type nor in the subtype.

Examples

iex> content_type "x-sample/json; charset=utf-8"
{:ok, "x-sample", "json", %{"charset" => "utf-8"}}

iex> content_type "x-sample/json  ; charset=utf-8  ; foo=bar"
{:ok, "x-sample", "json", %{"charset" => "utf-8", "foo" => "bar"}}

iex> content_type "\r\n text/plain;\r\n charset=utf-8\r\n"
{:ok, "text", "plain", %{"charset" => "utf-8"}}

iex> content_type "text/plain"
{:ok, "text", "plain", %{}}

iex> content_type "x/*"
:error

iex> content_type "*/*"
:error
list(binary)

Specs

list(binary) :: [binary]

Parses a comma-separated list of header values.

Examples

iex> list("foo, bar")
["foo", "bar"]

iex> list("foobar")
["foobar"]

iex> list("")
[]

iex> list("empties, , are,, filtered")
["empties", "are", "filtered"]
media_type(binary)

Specs

media_type(binary) ::
  {:ok, type :: binary, subtype :: binary, params} |
  :error

Parses media types (with wildcards).

Type and subtype are case insensitive while the sensitiveness of params depends on their keys and therefore are not handled by this parser.

Returns:

  • {:ok, type, subtype, map_of_params} if everything goes fine
  • :error if the media type isn’t valid

Examples

iex> media_type "text/plain"
{:ok, "text", "plain", %{}}

iex> media_type "APPLICATION/vnd.ms-data+XML"
{:ok, "application", "vnd.ms-data+xml", %{}}

iex> media_type "text/*; q=1.0"
{:ok, "text", "*", %{"q" => "1.0"}}

iex> media_type "*/*; q=1.0"
{:ok, "*", "*", %{"q" => "1.0"}}

iex> media_type "x y"
:error

iex> media_type "*/html"
:error

iex> media_type "/"
:error

iex> media_type "x/y z"
:error
params(t)

Specs

params(binary) :: params

Parses headers parameters.

Keys are case insensitive and downcased, invalid key-value pairs are discarded.

Examples

iex> params("foo=bar")
%{"foo" => "bar"}

iex> params("  foo=bar  ")
%{"foo" => "bar"}

iex> params("FOO=bar")
%{"foo" => "bar"}

iex> params("Foo=bar; baz=BOING")
%{"foo" => "bar", "baz" => "BOING"}

iex> params("foo=BAR ; wat")
%{"foo" => "BAR"}

iex> params("=")
%{}
token(token)

Specs

token(binary) :: binary | false

Parses a value as defined in RFC-1341. For convenience, trims whitespace at the end of the token. Returns false if the token is invalid.

Examples

iex> token("foo")
"foo"

iex> token("foo-bar")
"foo-bar"

iex> token("<foo>")
false

iex> token(~s["<foo>"])
"<foo>"

iex> token(~S["<f\oo>\"<b\ar>"])
"<foo>\"<bar>"

iex> token("foo  ")
"foo"

iex> token("foo bar")
false
validate_utf8!(arg, context)

Specs

validate_utf8!(binary, binary) :: :ok | no_return

Validates the given binary is valid UTF-8.