Packages

Ewebmachine contains macros and plugs to allow you to compose HTTP decision handlers and run the HTTP decision tree to get your HTTP response. This project is a rewrite for Elixir and Plug of basho webmachine.

Current section

Files

Jump to
ewebmachine lib conn_logger.ex
Raw

lib/conn_logger.ex

defmodule Ewebmachine.App do
@moduledoc false
use Application
import Supervisor.Spec
def start(_,_), do:
Supervisor.start_link([
supervisor(Ewebmachine.Log,[]),
worker(GenEvent,[[name: Ewebmachine.Events]])
], strategy: :one_for_one)
end
defmodule Ewebmachine.Log do
alias Plug.Conn
@moduledoc false
# Public API, self describing
def start_link, do:
Agent.start_link(fn->[] end, name: __MODULE__)
def put(conn), do:
Agent.update(__MODULE__,fn l->[conn|l] end)
def list, do:
Agent.get(__MODULE__,& &1)
def get(id), do:
Agent.get(__MODULE__,fn l->Enum.find(l,&(&1.private[:machine_log]==id)) end)
def id, do:
(make_ref |> :erlang.term_to_binary |> Base.url_encode64)
# Conn modifiers called by automate during run
def debug_init(conn) do
if conn.private[:machine_debug] do
conn
|> Conn.put_private(:machine_log,id)
|> Conn.put_private(:machine_init_at,:erlang.now)
|> Conn.put_private(:machine_decisions,[])
|> Conn.put_private(:machine_calls,[])
else conn end
end
def debug_call(conn,module,function,in_args,out_term) do
if conn.private[:machine_log] do
Conn.put_private(conn,:machine_calls,
[{module,function,in_args,out_term}|conn.private.machine_calls])
else conn end
end
def debug_enddecision(conn) do
if conn.private[:machine_log] do
case conn.private.machine_decisions do
[{decision,_}|rest] ->
conn
|> Conn.put_private(:machine_decisions,[{decision,Enum.reverse(conn.private.machine_calls)}|rest])
|> Conn.put_private(:machine_calls,[])
_->conn
end
else conn end
end
def debug_decision(conn,decision) do
if conn.private[:machine_log] do
case Regex.run(~r/^v[0-9]([a-z]*[0-9]*)$/,to_string(decision)) do
[_,decision]->
conn = debug_enddecision(conn)
Conn.put_private(conn,:machine_decisions,[{decision,[]}|conn.private.machine_decisions])
_->conn
end
else conn end
end
end