Packages
plug
1.0.2
1.20.3
1.20.2
1.20.1
retired
1.20.0
retired
1.19.5
1.19.4
1.19.3
1.19.2
1.19.1
1.19.0
1.18.5
1.18.4
1.18.3
1.18.2
1.18.1
1.18.0
1.17.4
1.17.3
1.17.2
1.17.1
1.17.0
1.16.6
1.16.5
1.16.4
1.16.3
1.16.2
1.16.1
1.16.0
1.15.6
1.15.5
1.15.4
1.15.3
1.15.2
1.15.1
1.15.0
1.14.2
1.14.1
1.14.0
1.13.6
1.13.5
1.13.4
1.13.3
1.13.2
1.13.1
retired
1.13.0
retired
1.12.1
1.12.0
1.11.1
1.11.0
1.10.4
1.10.3
1.10.2
1.10.1
1.10.0
1.9.0
1.8.3
1.8.2
1.8.1
1.8.0
1.7.2
1.7.1
1.7.0
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.1
1.5.0
1.5.0-rc.2
1.5.0-rc.1
1.5.0-rc.0
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.4.0-rc.0
1.3.6
1.3.5
1.3.4
1.3.3
1.3.2
1.3.1
1.3.0
1.2.6
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.2.0-rc.0
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.14.0
0.13.1
0.13.0
0.12.2
0.12.1
0.12.0
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.0
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.0
0.6.0
0.5.3
0.5.2
0.5.1
0.5.0
0.4.4
0.4.3
0.4.2
0.4.1
Compose web applications with functions
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
lib/plug/mime.ex
defmodule Plug.MIME do
@moduledoc """
Maps MIME types to file extensions and vice versa.
MIME types can be extended in your application configuration
as follows:
config :plug, :mimes, %{
"application/vnd.api+json" => ["json-api"]
}
After adding the configuration, Plug needs to be recompiled.
If you are using mix, it can be done with:
$ touch deps/plug/mix.exs
$ mix deps.compile plug
"""
@compile :no_native
@default_type "application/octet-stream"
# Read all the MIME type mappings into the `mapping` variable.
@external_resource "lib/plug/mime.types"
stream = File.stream!("lib/plug/mime.types")
mapping = Enum.flat_map(stream, fn (line) ->
if String.starts_with?(line, ["#", "\n"]) do
[]
else
[type|exts] = line |> String.strip |> String.split
[{type, exts}]
end
end)
app = Application.get_env(:plug, :mimes, %{})
mapping = Enum.reduce app, mapping, fn {k, v}, acc ->
List.keystore(acc, k, 0, {k, v})
end
@doc """
Returns whether a MIME type is registered.
## Examples
iex> Plug.MIME.valid?("text/plain")
true
iex> Plug.MIME.valid?("foo/bar")
false
"""
@spec valid?(String.t) :: boolean
def valid?(type) do
is_list entry(type)
end
@doc """
Returns the extensions associated with a given MIME type.
## Examples
iex> Plug.MIME.extensions("text/html")
["html", "htm"]
iex> Plug.MIME.extensions("application/json")
["json"]
iex> Plug.MIME.extensions("foo/bar")
[]
"""
@spec extensions(String.t) :: [String.t]
def extensions(type) do
entry(type) || []
end
@doc """
Returns the MIME type associated with a file extension. If no MIME type is
known for `file_extension`, `#{inspect @default_type}` is returned.
## Examples
iex> Plug.MIME.type("txt")
"text/plain"
iex> Plug.MIME.type("foobarbaz")
#{inspect @default_type}
"""
@spec type(String.t) :: String.t
def type(file_extension)
for {type, exts} <- mapping, ext <- exts do
def type(unquote(ext)), do: unquote(type)
end
def type(_ext), do: @default_type
@doc """
Guesses the MIME type based on the path's extension. See `type/1`.
## Examples
iex> Plug.MIME.path("index.html")
"text/html"
"""
@spec path(Path.t) :: String.t
def path(path) do
case Path.extname(path) do
"." <> ext -> type(ext)
_ -> @default_type
end
end
# entry/1
@spec entry(String.t) :: list(String.t)
for {type, exts} <- mapping do
defp entry(unquote(type)), do: unquote(exts)
end
defp entry(_type), do: nil
end