Skip to content

Commit 7dde3bb

Browse files
committed
Update docs & test
1 parent 90142af commit 7dde3bb

File tree

3 files changed

+38
-6
lines changed

3 files changed

+38
-6
lines changed

lib/mint/http.ex

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -900,6 +900,11 @@ defmodule Mint.HTTP do
900900
Contrary to `recv/3`, this function does not return partial responses on errors. Use
901901
`recv/3` for full control.
902902
903+
> #### Error {: .error}
904+
>
905+
> This function can only be used for one-off requests. If there is another concurrent request,
906+
> started by `request/5`, it will crash.
907+
903908
## Options
904909
905910
* `:timeout` - the maximum amount of time in milliseconds waiting to receive the response.
@@ -979,8 +984,9 @@ defmodule Mint.HTTP do
979984
end
980985

981986
# Ignore entries from other requests.
982-
defp recv_response([_entry | rest], acc, conn, ref, timeout) do
983-
recv_response(rest, acc, conn, ref, timeout)
987+
defp recv_response([entry | _rest], _acc, _conn, _ref, _timeout) when is_tuple(entry) do
988+
ref = elem(entry, 1)
989+
raise "received unexpected response from request #{inspect(ref)}"
984990
end
985991

986992
defp recv_response([], acc, conn, ref, timeout) do

test/mint/http1/conn_test.exs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,28 @@ defmodule Mint.HTTP1Test do
528528

529529
refute HTTP1.open?(conn)
530530
end
531+
532+
test "raises on multiple requests " do
533+
{:ok, port, server_ref} =
534+
TestServer.start(fn %{socket: socket} ->
535+
:ok = :gen_tcp.send(socket, "HTTP/1.1 200 OK\r\n")
536+
:ok = :gen_tcp.send(socket, "content-type: text/plain\r\n")
537+
:ok = :gen_tcp.send(socket, "content-length: 10\r\n\r\n")
538+
:ok = :gen_tcp.send(socket, "hello")
539+
:ok = :gen_tcp.send(socket, "world")
540+
end)
541+
542+
assert {:ok, conn} = HTTP1.connect(:http, "localhost", port, mode: :passive)
543+
assert_receive {^server_ref, _server_socket}
544+
545+
{:ok, conn, ref} = Mint.HTTP.request(conn, "GET", "/", [], nil)
546+
547+
assert_raise RuntimeError,
548+
"received unexpected response from request #{inspect(ref)}",
549+
fn ->
550+
Mint.HTTP.request_and_response(conn, "GET", "/", [], nil)
551+
end
552+
end
531553
end
532554

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

test/support/mint/http1/test_server.ex

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
defmodule Mint.HTTP1.TestServer do
2-
def start do
2+
def start(fun \\ nil) do
33
{:ok, listen_socket} = :gen_tcp.listen(0, mode: :binary, packet: :raw)
44
server_ref = make_ref()
55
parent = self()
66

7-
spawn_link(fn -> loop(listen_socket, parent, server_ref) end)
7+
spawn_link(fn -> loop(listen_socket, parent, server_ref, fun) end)
88

99
with {:ok, port} <- :inet.port(listen_socket) do
1010
{:ok, port, server_ref}
1111
end
1212
end
1313

14-
defp loop(listen_socket, parent, server_ref) do
14+
defp loop(listen_socket, parent, server_ref, fun) do
1515
case :gen_tcp.accept(listen_socket) do
1616
{:ok, socket} ->
1717
send(parent, {server_ref, socket})
@@ -22,7 +22,11 @@ defmodule Mint.HTTP1.TestServer do
2222
{:error, :einval} -> :ok
2323
end
2424

25-
loop(listen_socket, parent, server_ref)
25+
if fun do
26+
fun.(%{socket: socket, parent: parent})
27+
end
28+
29+
loop(listen_socket, parent, server_ref, fun)
2630

2731
{:error, :closed} ->
2832
:ok

0 commit comments

Comments
 (0)