使用插入凤凰后处理控制器响应

时间:2015-09-21 20:54:29

标签: elixir phoenix-framework

如何创建插件,例如如果bodycontent-type,则将回复的text/plain变为大写?在其他中间件中,您可以拨打resp = next(conn, params)然后修改resp,但我还没有看到插件。

1 个答案:

答案 0 :(得分:12)

您可以定义使用register_before_send/2的插件并检查响应的content-type标头(请注意,Plug期望标头为小写)。一个天真的实现(没有错误检查)将是:

defmodule Plug.UpperCaser do
  @behaviour Plug

  import Plug.Conn

  def init(opts), do: opts

  def call(conn, _opts) do
    register_before_send(conn, fn(conn) ->
      [content_type | _tail] = get_resp_header(conn, "content-type")
      if String.contains?(content_type, "text/plain") do
        resp(conn, conn.status, conn.resp_body |> to_string |> String.upcase)
      else
        conn
      end
    end)
  end
end

resp/3用作send_resp/3会导致无限循环,您必须重新启动服务器。