Slide 1

Slide 1 text

Plug, Friend of Web Developers @shanelogsdon @slogsdon

Slide 2

Slide 2 text

What is Plug? • Specification for composable modules • Connection adapters • github.com/elixir-lang/plug | hexdocs.pm/plug

Slide 3

Slide 3 text

Function Plug (Plug.Conn.t, Plug.opts) :: Plug.Conn.t plug :my_function_plug plug :my_function_plug, opt_a: true

Slide 4

Slide 4 text

Function Plug def json_header_plug(conn, _opts) do conn |> put_resp_content_type("application/json") end

Slide 5

Slide 5 text

Module Plug init(Plug.opts) :: Plug.opts call(Plug.Conn.t, Plug.opts) :: Plug.Conn.t plug MyModulePlug plug MyModulePlug, opt_a: true

Slide 6

Slide 6 text

Module Plug defmodule JSONHeaderPlug do def init(opts) do opts end def call(conn, _opts) do conn |> put_resp_content_type("application/json") end end

Slide 7

Slide 7 text

Plug’s plugs • Plug.Parsers • Parses request bodies • Plug.Static • Serves static files • Plug.Logger • Logs requests via Logger • And more

Slide 8

Slide 8 text

Plug’s other modules • Plug.Router • Simple HTTP router • Plug.Debugger • Displays formatted runtime errors • Plug.Builder • Conveniences for working with pipelines • And more

Slide 9

Slide 9 text

Plug composition • Plug.Builder.plug/2 • Accumulates plugs + options to module attribute • Attribute values seen as pipeline • Plug.Builder.compile/3 • Expands pipeline into quoted terms

Slide 10

Slide 10 text

Plug composition plug Plug.Logger plug Plug.Head

Slide 11

Slide 11 text

Plug composition Module.register_attribute(:plugs, accumulate: true) # [] @plugs {Plug.Logger, [], true} # [{Plug.Logger, [], true} | @plugs] @plugs {Plug.Head, [], true} # [{Plug.Head, [], true} | @plugs]

Slide 12

Slide 12 text

Plug composition case Plug.Logger.call(conn, Plug.Logger.init(opts)) do %Plug.Conn{} = c1 -> case Plug.Head.call(c, Plug.Head.init(opts)) do %Plug.Conn{} = c2 -> c2 _ -> :error end _ -> :error end

Slide 13

Slide 13 text

Connection adapters • Plug.Conn.Adapter • Defines API for Plug to receive/send requests/responses via webservers • Adapters: • Cowboy (Plug.Adapters.Cowboy) • Conveniences can be added to adapters, e.g. Plug.Adapters.Cowboy.http/3

Slide 14

Slide 14 text

Demo • $ mix new --sup our_app • Plug.Router (Plug.Builder) • Plug.Test

Slide 15

Slide 15 text

Questions?