Skip to content

Instantly share code, notes, and snippets.

@c-spencer
Last active August 29, 2015 14:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save c-spencer/a8b3d8d7a2697d6db0f0 to your computer and use it in GitHub Desktop.
Save c-spencer/a8b3d8d7a2697d6db0f0 to your computer and use it in GitHub Desktop.
defmodule WrangleTest.Disabled do
use Wrangle
plug :serve
decide :service_available?, do: false
end
# compiled decision tree
defp(do_decide(:handle_service_not_available, var!(conn))) do
Plug.Conn.resp(var!(conn), 503, "Service not available.")
end
defmodule WrangleTest.Simple do
use Wrangle
plug :serve
handle :ok, _ do
"HELLO!"
end
end
# compiled decision tree
defp(do_decide(:handle_ok, var!(conn))) do
content = case(var!(conn)) do
_ ->
"HELLO!"
end
Plug.Conn.resp(var!(conn), 200, content)
end
defp(do_decide(:handle_precondition_failed, var!(conn))) do
Plug.Conn.resp(var!(conn), 412, "Precondition failed.")
end
defp(do_decide(:if_match_exists?, var!(conn))) do
if(has_header(var!(conn), "if-match")) do
if(var!(conn).assigns().headers()["if-match"] == "*") do
do_decide(:if_unmodified_since_exists?, var!(conn))
else
do_decide(:handle_precondition_failed, var!(conn))
end
else
do_decide(:if_unmodified_since_exists?, var!(conn))
end
end
defp(do_decide(:if_none_match_exists?, var!(conn))) do
if(has_header(var!(conn), "if-none-match")) do
if(var!(conn).assigns().headers()["if-none-match"] == "*") do
if(var!(conn).method() in ["GET", "HEAD"]) do
Plug.Conn.resp(var!(conn), 304, "")
else
do_decide(:handle_precondition_failed, var!(conn))
end
else
do_decide(:handle_ok, var!(conn))
end
else
do_decide(:handle_ok, var!(conn))
end
end
defp(do_decide(:if_unmodified_since_exists?, var!(conn))) do
if(has_header(var!(conn), "if-unmodified-since")) do
case(handle_decision(var!(conn), (
datestring = to_char_list(var!(conn).assigns().headers()["if-unmodified-since"])
case(:httpd_util.convert_request_date(datestring)) do
:bad_date ->
false
date ->
{true, assign(var!(conn), :if_unmodified_since_date, date)}
end
))) do
{true, var!(conn)} ->
do_decide(:handle_precondition_failed, var!(conn))
{false, var!(conn)} ->
do_decide(:if_none_match_exists?, var!(conn))
end
else
do_decide(:if_none_match_exists?, var!(conn))
end
end
defp(do_decide(:known_method?, var!(conn))) do
if(var!(conn).method() in @known_methods) do
if(var!(conn).method() in @allowed_methods) do
if(var!(conn).method() == "OPTIONS") do
Plug.Conn.resp(var!(conn), 200, "")
else
case(handle_decision(var!(conn), if(var!(conn).assigns().headers()["accept"]) do
true
else
{false, assign(var!(conn), :media_type, ConNeg.find_best(:accept, "*/*", @available_media_types))}
end)) do
{true, var!(conn)} ->
case(handle_decision(var!(conn), (
type = ConNeg.find_best(:accept, var!(conn).assigns().headers()["accept"], @available_media_types)
{!is_nil(type), assign(var!(conn), :media_type, type)}
))) do
{true, var!(conn)} ->
do_decide(:if_match_exists?, var!(conn))
{false, var!(conn)} ->
Plug.Conn.resp(var!(conn), 406, "No acceptable resource available.")
end
{false, var!(conn)} ->
do_decide(:if_match_exists?, var!(conn))
end
end
else
Plug.Conn.resp(var!(conn), 405, "Method not allowed.")
end
else
Plug.Conn.resp(var!(conn), 501, "Unknown method.")
end
end
defmodule WrangleTest.R do
use Wrangle
plug :serve
def etag(_conn) do
1635
end
@available_media_types ["text/html", "application/json"]
@available_charsets ["utf-8"]
handle :ok, %Plug.Conn{assigns: %{media_type: "text/html"}} do
"HELLO"
end
handle :ok, %Plug.Conn{assigns: %{media_type: "application/json"}} do
~s({"message": "HELLO"})
end
def last_modified(_conn) do
{{2014, 12, 13}, {11, 36, 32}}
end
end
# compiled decision tree
defp(do_decide(:accept_charset_exists?, var!(conn))) do
if(has_header(var!(conn), "accept-charset")) do
case(handle_decision(var!(conn), (
charset = ConNeg.find_best(:charset, var!(conn).assigns().headers()["accept-charset"], @available_charsets)
{!is_nil(charset), assign(var!(conn), :charset, charset)}
))) do
{true, var!(conn)} ->
do_decide(:if_match_exists?, var!(conn))
{false, var!(conn)} ->
do_decide(:handle_not_acceptable, var!(conn))
end
else
do_decide(:if_match_exists?, var!(conn))
end
end
defp(do_decide(:handle_not_acceptable, var!(conn))) do
Plug.Conn.resp(var!(conn), 406, "No acceptable resource available.")
end
defp(do_decide(:handle_not_modified, var!(conn))) do
Plug.Conn.resp(var!(conn), 304, "")
end
defp(do_decide(:handle_ok, var!(conn))) do
content = case(var!(conn)) do
%Plug.Conn{assigns: %{media_type: "text/html"}} ->
"HELLO"
%Plug.Conn{assigns: %{media_type: "application/json"}} ->
~s"{\"message\": \"HELLO\"}"
end
Plug.Conn.resp(var!(conn), 200, content)
end
defp(do_decide(:handle_precondition_failed, var!(conn))) do
Plug.Conn.resp(var!(conn), 412, "Precondition failed.")
end
defp(do_decide(:if_match_exists?, var!(conn))) do
if(has_header(var!(conn), "if-match")) do
if(var!(conn).assigns().headers()["if-match"] == "*") do
do_decide(:if_unmodified_since_exists?, var!(conn))
else
case(handle_decision(var!(conn), (
etag = format_etag(etag(var!(conn)))
{etag == var!(conn).assigns().headers()["if-match"], assign(var!(conn), :etag, etag)}
))) do
{true, var!(conn)} ->
do_decide(:if_unmodified_since_exists?, var!(conn))
{false, var!(conn)} ->
do_decide(:handle_precondition_failed, var!(conn))
end
end
else
do_decide(:if_unmodified_since_exists?, var!(conn))
end
end
defp(do_decide(:if_modified_since_exists?, var!(conn))) do
if(has_header(var!(conn), "if-modified-since")) do
case(handle_decision(var!(conn), (
datestring = to_char_list(var!(conn).assigns().headers()["if-modified-since"])
case(:httpd_util.convert_request_date(datestring)) do
:bad_date ->
false
date ->
{true, assign(var!(conn), :if_modified_since_date, date)}
end
))) do
{true, var!(conn)} ->
case(handle_decision(var!(conn), case(last_modified(var!(conn))) do
nil ->
true
last_modified ->
modsincedate = var!(conn).assigns()[:if_modified_since_date]
case(last_modified == modsincedate) do
true ->
false
false ->
{true, assign(var!(conn), :last_modified, last_modified)}
end
end)) do
{true, var!(conn)} ->
do_decide(:handle_ok, var!(conn))
{false, var!(conn)} ->
do_decide(:handle_not_modified, var!(conn))
end
{false, var!(conn)} ->
do_decide(:handle_ok, var!(conn))
end
else
do_decide(:handle_ok, var!(conn))
end
end
defp(do_decide(:if_none_match?, var!(conn))) do
if(var!(conn).method() in ["GET", "HEAD"]) do
do_decide(:handle_not_modified, var!(conn))
else
do_decide(:handle_precondition_failed, var!(conn))
end
end
defp(do_decide(:if_none_match_exists?, var!(conn))) do
if(has_header(var!(conn), "if-none-match")) do
if(var!(conn).assigns().headers()["if-none-match"] == "*") do
do_decide(:if_none_match?, var!(conn))
else
case(handle_decision(var!(conn), (
etag = format_etag(etag(var!(conn)))
{etag == var!(conn).assigns().headers()["if-none-match"], assign(var!(conn), :etag, etag)}
))) do
{true, var!(conn)} ->
do_decide(:if_none_match?, var!(conn))
{false, var!(conn)} ->
do_decide(:if_modified_since_exists?, var!(conn))
end
end
else
do_decide(:if_modified_since_exists?, var!(conn))
end
end
defp(do_decide(:if_unmodified_since_exists?, var!(conn))) do
if(has_header(var!(conn), "if-unmodified-since")) do
case(handle_decision(var!(conn), (
datestring = to_char_list(var!(conn).assigns().headers()["if-unmodified-since"])
case(:httpd_util.convert_request_date(datestring)) do
:bad_date ->
false
date ->
{true, assign(var!(conn), :if_unmodified_since_date, date)}
end
))) do
{true, var!(conn)} ->
case(handle_decision(var!(conn), case(last_modified(var!(conn))) do
nil ->
true
last_modified ->
unmodsincedate = var!(conn).assigns()[:if_unmodified_since_date]
case(last_modified == unmodsincedate) do
true ->
{false, assign(var!(conn), :last_modified, last_modified)}
false ->
true
end
end)) do
{true, var!(conn)} ->
do_decide(:handle_precondition_failed, var!(conn))
{false, var!(conn)} ->
do_decide(:if_none_match_exists?, var!(conn))
end
{false, var!(conn)} ->
do_decide(:if_none_match_exists?, var!(conn))
end
else
do_decide(:if_none_match_exists?, var!(conn))
end
end
defp(do_decide(:known_method?, var!(conn))) do
if(var!(conn).method() in @known_methods) do
if(var!(conn).method() in @allowed_methods) do
if(var!(conn).method() == "OPTIONS") do
Plug.Conn.resp(var!(conn), 200, "")
else
case(handle_decision(var!(conn), if(var!(conn).assigns().headers()["accept"]) do
true
else
{false, assign(var!(conn), :media_type, ConNeg.find_best(:accept, "*/*", @available_media_types))}
end)) do
{true, var!(conn)} ->
case(handle_decision(var!(conn), (
type = ConNeg.find_best(:accept, var!(conn).assigns().headers()["accept"], @available_media_types)
{!is_nil(type), assign(var!(conn), :media_type, type)}
))) do
{true, var!(conn)} ->
do_decide(:accept_charset_exists?, var!(conn))
{false, var!(conn)} ->
do_decide(:handle_not_acceptable, var!(conn))
end
{false, var!(conn)} ->
do_decide(:accept_charset_exists?, var!(conn))
end
end
else
Plug.Conn.resp(var!(conn), 405, "Method not allowed.")
end
else
Plug.Conn.resp(var!(conn), 501, "Unknown method.")
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment