Current section

Files

Jump to
plug_json_parser lib plug_json_parser.ex
Raw

lib/plug_json_parser.ex

defmodule PlugJsonParser do
alias Plug.Conn
defmodule BadRequestError do
@moduledoc """
Error raised when the request is not valid json
"""
defexception [:message]
defimpl Plug.Exception do
def status(_exception), do: 400
end
end
def parse(%Conn{} = conn, "application", "json", _headers, opts) do
case Conn.read_body(conn, opts) do
{:ok, body, conn} ->
decode_opts = opts[:plug_json_parser] || []
case Poison.decode(body, decode_opts) do
{:ok, decoded} ->
{:ok, decoded, conn}
{:error, :invalid} ->
raise BadRequestError, message: "Invalid JSON"
{:error, {:invalid, frag}} ->
raise BadRequestError, message: "Invalid JSON at \"#{frag}\""
end
{:more, _data, conn} ->
{:error, :too_large, conn}
end
end
def parse(conn, _type, _subtype, _headers, _opts) do
{:next, conn}
end
end