gpt4 book ai didi

http - Phoenix 测试不接受大写的响应 header

转载 作者:可可西里 更新时间:2023-11-01 16:28:07 24 4
gpt4 key购买 nike

我一直在玩 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. 为什么 Header 必须使用小写字符?
  2. 为什么开发环境和测试环境中的行为不同?

最佳答案

此错误仅在测试环境中引发的原因可以在 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 的测试适配器时,标题键才真正被验证。这只发生在测试环境中的原因是因为在 header 上执行这些验证可能很昂贵,因此在非测试环境中会跳过它们。 This commit是引入了仅在测试环境中验证的限制的提交。

顺便说一句, header 不必是小写的(正如您可以从它在非测试环境中工作的事实中看出的那样),但我认为按照 Plug 的约定它应该是。

关于http - Phoenix 测试不接受大写的响应 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37213544/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com