2016-11-15 4 views
0

J'essaie de diffuser un formulaire en plusieurs parties en utilisant hackney.Diffuser un fichier en utilisant hackney

Ceci est mon code actuel:

method = :post 
path = "https://httpbin.org/post" 
req_headers = [ 
    {"Content-Type", "multipart/form-data"} 
] 

{:ok, pid} = :hackney.request(method, path, req_headers, :stream, []) 

:hackney.send_multipart_body(pid, {:file, "/Users/gmile/.vimrc"}) 

{:ok, _status, _headers, pid} = :hackney.start_response(pid) 

{:ok, body} = :hackney.body(pid) 

en ligne avec :hackney.send_multipart_body/2, je vois arriver exception:

** (ArgumentError) argument error 
    :erlang.byte_size(nil) 
    (hackney) src/hackney_multipart.erl:134: :hackney_multipart.mp_header/2 
    (hackney) src/hackney_multipart.erl:239: :hackney_multipart.mp_file_header/2 
    (hackney) src/hackney_request.erl:222: :hackney_request.stream_multipart/2 
    (hackney) src/hackney.erl:432: anonymous fn/2 in :hackney.send_multipart_body/2 
    read_and_stream.exs:13: (file) 

Question: ce que je fais mal?

Il y a clairement un bogue dans mon code, mais comme il y a peu de documentation sur :hackney.send_multipart_body/2, je ne peux pas m'en sortir.


J'ai commencé le débogage.

Voici le chemin d'exécution du stacktrace, dans l'ordre d'appel:

  1. https://github.com/benoitc/hackney/blob/master/src/hackney.erl#L432
  2. https://github.com/benoitc/hackney/blob/master/src/hackney_request.erl#L222
  3. https://github.com/benoitc/hackney/blob/master/src/hackney_multipart.erl#L239
  4. https://github.com/benoitc/hackney/blob/master/src/hackney_multipart.erl#L134

Si je comprends bien, il devrait y avoir un Boundary vari pouvoir défini dans le processus client HTTP. Cependant, je n'arrive pas à comprendre où cela se passe.

+1

Je pense que vous devez utiliser ': stream_multipart' comme le 4ème argument (au lieu de': flux ') dans l'appel': hackney.request/5'. – Dogbert

+0

Merci monsieur monsieur. Vous venez de me sauver quelques heures de me gratter la tête :) S'il vous plaît poster la réponse et je vais l'accepter. – gmile

Répondre

1

Pour utiliser :hackney.send_multipart_body/2, le corps de votre demande (quatrième argument) devrait être :stream_multipart, non :stream:

{:ok, pid} = :hackney.request(method, path, req_headers, :stream_multipart, [])