2016-05-13 44 views
2

我已經與鳳凰玩弄,我想提供一個下載鏈接到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 

這似乎不可思議我有2個原因:

  1. 爲什麼有頭有在較低的字符?
  2. 爲什麼開發和測試環境中的行爲不同?

回答

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的慣例它應該是。