Plug.Conn.Utils

Utilities for working with connection data

Source

Summary

content_type(binary)

Parses content type (without wildcards)

list(binary)

Parses a comma-separated list of header values

media_type(binary)

Parses media types (with wildcards)

params(t)

Parses headers parameters

token(token)

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

validate_utf8!(arg, context)

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
Source
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"]
Source
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
Source
params(t)

Specs:

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("=")
%{}
Source
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
Source
validate_utf8!(arg, context)

Specs:

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

Validates the given binary is valid UTF-8.

Source