Skip to content

Commit 3477fcc

Browse files
authored
Report only actually written bytes in resp_body_bytes (#692)
1 parent 6a07435 commit 3477fcc

2 files changed

Lines changed: 29 additions & 5 deletions

File tree

lib/bandit/adapter.ex

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -298,12 +298,14 @@ defmodule Bandit.Adapter do
298298
end
299299

300300
defp send_data(adapter, data, end_request) do
301-
socket =
302-
if send_resp_body?(adapter),
303-
do: Bandit.HTTPTransport.send_data(adapter.transport, data, end_request),
304-
else: adapter.transport
301+
{socket, data_size} =
302+
if send_resp_body?(adapter) do
303+
{Bandit.HTTPTransport.send_data(adapter.transport, data, end_request),
304+
IO.iodata_length(data)}
305+
else
306+
{adapter.transport, 0}
307+
end
305308

306-
data_size = IO.iodata_length(data)
307309
metrics = Map.update(adapter.metrics, :resp_body_bytes, data_size, &(&1 + data_size))
308310

309311
metrics =

test/bandit/http1/telemetry_test.exs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,28 @@ defmodule HTTP1TelemetryTest do
239239
|> send_file(200, Path.join([__DIR__, "../../support/sendfile"]), 0, :all)
240240
end
241241

242+
test "it should not count suppressed response bodies in `stop` events for HEAD requests",
243+
context do
244+
Req.head!(context.req, url: "/do_read_body")
245+
246+
assert_receive {:telemetry, [:bandit, :request, :stop], measurements, _metadata}, 500
247+
248+
# The response body is suppressed for HEAD requests, so no body bytes were
249+
# actually written (mirroring what send_file responses already report)
250+
assert measurements
251+
~> %{
252+
monotonic_time: integer(roughly: System.monotonic_time()),
253+
duration: integer(max: System.convert_time_unit(1, :second, :native)),
254+
req_header_end_time: integer(roughly: System.monotonic_time()),
255+
req_body_start_time: integer(roughly: System.monotonic_time()),
256+
req_body_end_time: integer(roughly: System.monotonic_time()),
257+
req_body_bytes: 0,
258+
resp_body_bytes: 0,
259+
resp_start_time: integer(roughly: System.monotonic_time()),
260+
resp_end_time: integer(roughly: System.monotonic_time())
261+
}
262+
end
263+
242264
@tag :capture_log
243265
test "it should send `stop` events for malformed requests", context do
244266
client = SimpleHTTP1Client.tcp_client(context)

0 commit comments

Comments
 (0)