Skip to content

Commit e14016a

Browse files
committed
Add more tests
1 parent 347d7e8 commit e14016a

File tree

3 files changed

+115
-65
lines changed

3 files changed

+115
-65
lines changed

lib/mint/http.ex

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -965,15 +965,19 @@ defmodule Mint.HTTP do
965965
defp recv_response([], acc, conn, ref, timeout) do
966966
start_time = System.monotonic_time(:millisecond)
967967

968-
with {:ok, conn, entries} <- recv(conn, 0, timeout) do
969-
timeout =
970-
if is_integer(timeout) do
971-
timeout - System.monotonic_time(:millisecond) - start_time
972-
else
973-
timeout
974-
end
968+
case recv(conn, 0, timeout) do
969+
{:ok, conn, entries} ->
970+
timeout =
971+
if is_integer(timeout) do
972+
timeout - System.monotonic_time(:millisecond) - start_time
973+
else
974+
timeout
975+
end
976+
977+
recv_response(entries, acc, conn, ref, timeout)
975978

976-
recv_response(entries, acc, conn, ref, timeout)
979+
{:error, conn, reason, _responses} ->
980+
{:error, conn, reason}
977981
end
978982
end
979983

test/mint/http1/conn_test.exs

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -460,26 +460,50 @@ defmodule Mint.HTTP1Test do
460460
assert responses == [{:status, ref, 200}]
461461
end
462462

463-
test "starting a connection in :passive mode and using Mint.HTTP.recv_response/3",
464-
%{port: port, server_ref: server_ref} do
465-
assert {:ok, conn} = HTTP1.connect(:http, "localhost", port, mode: :passive)
466-
assert_receive {^server_ref, server_socket}
463+
describe "Mint.HTTP.recv_response/3" do
464+
test "receives response", %{port: port, server_ref: server_ref} do
465+
assert {:ok, conn} = HTTP1.connect(:http, "localhost", port, mode: :passive)
466+
assert_receive {^server_ref, server_socket}
467467

468-
{:ok, conn, ref} = HTTP1.request(conn, "GET", "/", [], nil)
468+
{:ok, conn, ref} = HTTP1.request(conn, "GET", "/", [], nil)
469469

470-
:ok = :gen_tcp.send(server_socket, "HTTP/1.1 200 OK\r\n")
471-
:ok = :gen_tcp.send(server_socket, "content-type: text/plain\r\n")
472-
:ok = :gen_tcp.send(server_socket, "content-length: 10\r\n\r\n")
473-
:ok = :gen_tcp.send(server_socket, "hello")
474-
:ok = :gen_tcp.send(server_socket, "world")
475-
476-
assert {:ok, _conn, response} = Mint.HTTP.recv_response(conn, ref, 100)
477-
478-
assert response == %{
479-
body: "helloworld",
480-
headers: [{"content-type", "text/plain"}, {"content-length", "10"}],
481-
status: 200
482-
}
470+
:ok = :gen_tcp.send(server_socket, "HTTP/1.1 200 OK\r\n")
471+
:ok = :gen_tcp.send(server_socket, "content-type: text/plain\r\n")
472+
:ok = :gen_tcp.send(server_socket, "content-length: 10\r\n\r\n")
473+
:ok = :gen_tcp.send(server_socket, "hello")
474+
:ok = :gen_tcp.send(server_socket, "world")
475+
476+
assert {:ok, _conn, response} = Mint.HTTP.recv_response(conn, ref, 100)
477+
478+
assert response == %{
479+
body: "helloworld",
480+
headers: [{"content-type", "text/plain"}, {"content-length", "10"}],
481+
status: 200
482+
}
483+
end
484+
485+
test "handles errors", %{port: port, server_ref: server_ref} do
486+
assert {:ok, conn} = HTTP1.connect(:http, "localhost", port, mode: :passive)
487+
assert_receive {^server_ref, server_socket}
488+
489+
{:ok, conn, ref} = HTTP1.request(conn, "GET", "/", [], nil)
490+
491+
:ok = :gen_tcp.send(server_socket, "HTTP/1.1 200 OK\r\n")
492+
:ok = :gen_tcp.close(server_socket)
493+
494+
assert {:error, _conn, %Mint.TransportError{reason: :closed}} =
495+
Mint.HTTP.recv_response(conn, ref, 100)
496+
end
497+
498+
test "handles timeout", %{port: port, server_ref: server_ref} do
499+
assert {:ok, conn} = HTTP1.connect(:http, "localhost", port, mode: :passive)
500+
assert_receive {^server_ref, _server_socket}
501+
502+
{:ok, conn, ref} = HTTP1.request(conn, "GET", "/", [], nil)
503+
504+
assert {:error, _conn, %Mint.TransportError{reason: :timeout}} =
505+
Mint.HTTP.recv_response(conn, ref, 1)
506+
end
483507
end
484508

485509
test "changing the connection mode with set_mode/2",

test/mint/http2/conn_test.exs

Lines changed: 61 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2087,45 +2087,6 @@ defmodule Mint.HTTP2Test do
20872087
assert HTTP2.open?(conn)
20882088
end
20892089

2090-
@tag connect_options: [mode: :passive]
2091-
test "starting a connection with :passive mode and using Mint.HTTP.recv_response/3", %{
2092-
conn: conn
2093-
} do
2094-
{conn, ref} = open_request(conn)
2095-
2096-
assert_recv_frames [headers(stream_id: stream_id)]
2097-
2098-
data =
2099-
server_encode_frames([
2100-
headers(
2101-
stream_id: stream_id,
2102-
hbf:
2103-
server_encode_headers([
2104-
{":status", "200"},
2105-
{"content-type", "text/plain"},
2106-
{"content-length", "10"}
2107-
]),
2108-
flags: set_flags(:headers, [:end_headers])
2109-
),
2110-
data(
2111-
stream_id: stream_id,
2112-
data: "helloworld",
2113-
flags: set_flags(:data, [:end_stream])
2114-
)
2115-
])
2116-
2117-
:ok = :ssl.send(server_get_socket(), data)
2118-
assert {:ok, _conn, response} = Mint.HTTP.recv_response(conn, ref, 100)
2119-
2120-
assert response == %{
2121-
body: "helloworld",
2122-
headers: [{"content-type", "text/plain"}, {"content-length", "10"}],
2123-
status: 200
2124-
}
2125-
2126-
assert HTTP2.open?(conn)
2127-
end
2128-
21292090
test "changing the mode of a connection with set_mode/2", %{conn: conn} do
21302091
assert_raise ArgumentError, ~r"^can't use recv/3", fn ->
21312092
HTTP2.recv(conn, 0, 100)
@@ -2206,6 +2167,67 @@ defmodule Mint.HTTP2Test do
22062167
end
22072168
end
22082169

2170+
describe "Mint.HTTP.recv_response/3" do
2171+
@describetag connect_options: [mode: :passive]
2172+
2173+
test "receives response", %{conn: conn} do
2174+
{conn, ref} = open_request(conn)
2175+
2176+
assert_recv_frames [headers(stream_id: stream_id)]
2177+
2178+
data =
2179+
server_encode_frames([
2180+
headers(
2181+
stream_id: stream_id,
2182+
hbf:
2183+
server_encode_headers([
2184+
{":status", "200"},
2185+
{"content-type", "text/plain"},
2186+
{"content-length", "10"}
2187+
]),
2188+
flags: set_flags(:headers, [:end_headers])
2189+
),
2190+
data(
2191+
stream_id: stream_id,
2192+
data: "helloworld",
2193+
flags: set_flags(:data, [:end_stream])
2194+
)
2195+
])
2196+
2197+
:ok = :ssl.send(server_get_socket(), data)
2198+
assert {:ok, _conn, response} = Mint.HTTP.recv_response(conn, ref, 100)
2199+
2200+
assert response == %{
2201+
body: "helloworld",
2202+
headers: [{"content-type", "text/plain"}, {"content-length", "10"}],
2203+
status: 200
2204+
}
2205+
2206+
assert HTTP2.open?(conn)
2207+
end
2208+
2209+
test "handles errors", %{conn: conn} do
2210+
{conn, ref} = open_request(conn)
2211+
assert_recv_frames [headers(stream_id: _stream_id)]
2212+
:ok = :ssl.close(server_get_socket())
2213+
2214+
assert {:error, _conn, %Mint.TransportError{reason: :closed}} =
2215+
Mint.HTTP.recv_response(conn, ref, 100)
2216+
2217+
assert HTTP2.open?(conn)
2218+
end
2219+
2220+
test "handles timeout", %{conn: conn} do
2221+
{conn, ref} = open_request(conn)
2222+
assert_recv_frames [headers(stream_id: _stream_id)]
2223+
2224+
assert {:error, _conn, %Mint.TransportError{reason: :timeout}} =
2225+
Mint.HTTP.recv_response(conn, ref, 1)
2226+
2227+
assert HTTP2.open?(conn)
2228+
end
2229+
end
2230+
22092231
describe "ping" do
22102232
test "if we send a PING we then get a :pong reply", %{conn: conn} do
22112233
assert {:ok, conn, ref} = HTTP2.ping(conn)

0 commit comments

Comments
 (0)