2016-05-13 8 views
2

Ich habe um mit Phoenix zu spielen und ich mag einen Download-Link zu einer PDF-Datei zur Verfügung zu stellen:Phoenix Tests akzeptieren keine aktivierten Antwort-Header

Der folgende Code in meiner Dev-Umgebung funktioniert gut. Wenn ich auf den Link klicke, wird eine PDF-Datei heruntergeladen.

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 

Allerdings, wenn ich Tests durchführen, das Verhalten zu überprüfen, werde ich eine Fehlermeldung erhalten:

** (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 

Dies erscheint mir aus 2 Gründen seltsam:

  1. Warum hat die Header in niedrigeren Buchstaben sein?
  2. Warum unterscheidet sich das Verhalten in der Entwicklungsumgebung und in der Testumgebung?

Antwort

4

Der Grund dieser Fehler nur in der Testumgebung erhöht wird, kann für Plug.Conn, speziell these lines im Quellcode zu sehen:

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 

Wie dieser Code zeigt, wird der Header-Schlüssel nur tatsächlich validiert, wenn Der Adapter ist Plugs Testadapter. Der Grund dafür, dass dies nur in der Testumgebung passiert, liegt darin, dass es teuer sein kann, diese Validierungen für die Header durchzuführen und sie daher in Nicht-Testumgebungen übersprungen werden. This commit ist das Commit, bei dem die Einschränkung der Validierung nur in der Testumgebung eingeführt wurde.

Übrigens, die Kopfzeile hat keine, um Kleinbuchstaben zu sein (wie Sie durch die Tatsache sagen können, dass es in Nicht-Test-Umgebungen funktioniert), aber ich denke, dass von Plug-Konvention sollte es sein.

Verwandte Themen