我一直在玩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
这对我来说有点奇怪,原因有两个:
答案 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&#它的惯例应该是。