From 87f0d7ea1e25a97264dcb630d75376ab3cd3a182 Mon Sep 17 00:00:00 2001
From: Peter Rice <peterrice@fastmail.com>
Date: Tue, 21 Jan 2025 22:58:59 -0500
Subject: [PATCH] Treat iolist of empty binaries as empty body

---
 src/hackney_request.erl | 21 ++++++++++-----------
 1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/src/hackney_request.erl b/src/hackney_request.erl
index 612a1707..3b72aaa7 100644
--- a/src/hackney_request.erl
+++ b/src/hackney_request.erl
@@ -77,12 +77,18 @@ perform(Client0, {Method0, Path0, Headers0, Body0}) ->
                                                                     Size, Boundary, Client0);
                                             <<>> when Method =:= <<"POST">> orelse Method =:= <<"PUT">> ->
                                               handle_body(Headers2, ReqType0, Body0, Client0);
-                                            [] when Method =:= <<"POST">> orelse Method =:= <<"PUT">> ->
-                                              handle_body(Headers2, ReqType0, Body0, Client0);
                                             <<>> ->
                                               {Headers2, ReqType0, Body0, Client0};
-                                            [] ->
-                                              {Headers2, ReqType0, Body0, Client0};
+                                            _ when is_list(Body0) ->
+                                              Body1 = iolist_to_binary(Body0),
+                                              case Body1 of
+                                                <<>> when Method =:= <<"POST">> orelse Method =:= <<"PUT">> ->
+                                                  handle_body(Headers2, ReqType0, Body1, Client0);
+                                                <<>> ->
+                                                  {Headers2, ReqType0, Body1, Client0};
+                                                _ ->
+                                                  handle_body(Headers2, ReqType0, Body1, Client0)
+                                              end;
                                             _ ->
                                               handle_body(Headers2, ReqType0, Body0, Client0)
                                           end,
@@ -348,13 +354,6 @@ handle_body(Headers, ReqType0, Body0, Client) ->
                             S = hackney_headers_new:get_value(<<"content-length">>, Headers),
                             {S, CT, Body0};
 
-                          _ when is_list(Body0) -> % iolist case
-                            Body1 = iolist_to_binary(Body0),
-                            S = erlang:byte_size(Body1),
-                            CT = hackney_headers_new:get_value(
-                                   <<"content-type">>, Headers, <<"application/octet-stream">>
-                                  ),
-                            {S, CT, Body1};
                           _ when is_binary(Body0) ->
                             S = erlang:byte_size(Body0),
                             CT = hackney_headers_new:get_value(