Packages

A simple kademlia implementation

Current section

Files

Jump to
exkad lib backends http server.ex
Raw

lib/backends/http/server.ex

defmodule Exkad.Backends.HTTP.Server do
defmodule Server do
alias Exkad.Backends.Simple
use Plug.Router
import Plug.Conn
alias Exkad.Node.Descriptor, as: ND
plug :match
plug :dispatch
def json({:ok, res}) do
json(%{"ok" => res})
end
def json({:value, {:ok, key}}) do
json(%{"value" => %{"ok" => key}})
end
def json(res) do
Poison.encode!(res)
end
def finish(res, conn, status \\ 200) do
conn
|> put_resp_content_type("application/json")
|> send_resp(status, res)
end
def to_desc(conn) do
d = Enum.into(conn.req_headers, %{})
%ND{id: d["fromid"], loc: d["fromloc"]}
end
get "/ping" do
%{node: node} = conn.plug_options
Simple.ping(node, to_desc(conn))
|> json
|> finish(conn)
end
get "/find/:node_id" do
%{node: node} = conn.plug_options
[_, to_find_id] = conn.path_info
from_desc = to_desc(conn)
Simple.find(node, to_find_id, from_desc)
|> json
|> finish(conn)
end
put "/item" do
%{node: node} = conn.plug_options
{:ok, body, conn} = read_body(conn)
Simple.put(node, body)
|> json
|> finish(conn)
end
get "/item/:key" do
%{node: node} = conn.plug_options
[_, key] = conn.path_info
Simple.get(node, key)
|> json
|> finish(conn)
end
put "/item/:ptr/meta" do
%{node: node} = conn.plug_options
[_, ptr, _] = conn.path_info
{:ok, term, conn} = read_body(conn)
Simple.put_meta(node, term, ptr)
|> json
|> finish(conn)
end
get "/search/:key" do
%{node: node} = conn.plug_options
[_, key] = conn.path_info
Simple.search(node, key)
|> json
|> finish(conn)
end
end
import Plug.Conn
def init(options) do
Enum.into(options, %{})
end
def call(conn, options) do
Map.put(conn, :plug_options, options) |> Server.call(options)
end
end