Current section
Files
Jump to
Current section
Files
lib/turbolinks_plug.ex
defmodule TurbolinksPlug do
import Plug.Conn
@session_key "_turbolinks_location"
@location_header "turbolinks-location"
@referrer_header "turbolinks-referrer"
def init(opts), do: opts
def call(conn, _) do
register_before_send(conn, &handle_redirect/1)
end
def handle_redirect(%Plug.Conn{status: s} = conn) when s == 301 or s == 302 do
location = get_resp_header(conn, "location") |> hd
referrer = get_req_header(conn, @referrer_header)
store_location_in_session(conn, location, referrer)
end
def handle_redirect(%Plug.Conn{status: s} = conn) when s >= 200 and s < 300 do
conn
|> get_session(@session_key)
|> set_location_header(conn)
end
def handle_redirect(conn), do: conn
defp store_location_in_session(conn, _location, []), do: conn
defp store_location_in_session(conn, location, _referrer) do
put_session(conn, @session_key, location)
end
defp set_location_header(nil, conn), do: conn
defp set_location_header(location, conn) do
conn
|> put_resp_header(@location_header, location)
|> delete_session(@session_key)
end
end