凤凰城测试不接受大写的响应标题

时间:2016-05-13 15:09:08

标签: http request response elixir phoenix-framework

我一直在玩Phoenix,我想提供PDF文件的下载链接:

以下代码在我的开发环境中正常工作。当我点击链接时,会下载PDF文件。

case  File.read(localpath) do
  {:ok, pdf_content} ->
    conn
    |> put_resp_header("Content-Type", "application/pdf")
    |> put_resp_header("Content-Disposition", ~s[attachment; filename="#{file}"])
    |>200, pdf_content)
  {:error, _} ->
    conn
    |>:not_found, "Not Found")
end

但是,当我运行测试来验证行为时,我会收到错误:

 ** (Plug.Conn.InvalidHeaderError) header key is not lowercase: "Content-Type"
 stacktrace:
   (plug) lib/plug/conn.ex:957: Plug.Conn.validate_header_key!/2
   (plug) lib/plug/conn.ex:556: Plug.Conn.put_resp_header/3

这对我来说有点奇怪,原因有两个:

  1. 为什么标题必须是较低的字符?
  2. 为什么dev和测试环境中的行为有所不同?

1 个答案:

答案 0 :(得分:4)

仅在Plug.Conn的源代码中可以看到在测试环境中引发此错误的原因,特别是these lines

defp validate_header_key!({Plug.Adapters.Test.Conn, _}, key) do
  unless valid_header_key?(key) do
    raise InvalidHeaderError, message: "header key is not lowercase: " <> inspect(key)
  end
end

defp validate_header_key!(_adapter, _key) do
  :ok
end

如此代码所示,仅当适配器是Plug的测试适配器时,才会实际验证标头密钥。这只发生在测试环境中的原因是因为在头文件上执行这些验证可能会很昂贵,因此在非测试环境中会跳过这些验证。 This commit是仅在测试环境中引入验证限制的提交。

顺便说一句,标题没有 是小写的(正如你可以看出它在非测试环境中工作的那样),但我认为通过Plug&#它的惯例应该是。