diff --git a/spec/std/http/server/server_spec.cr b/spec/std/http/server/server_spec.cr index ffd157725db3..88737649ae8d 100644 --- a/spec/std/http/server/server_spec.cr +++ b/spec/std/http/server/server_spec.cr @@ -59,6 +59,9 @@ module HTTP io = IO::Memory.new response = Response.new(io) response.close + response.closed?.should be_true + io.closed?.should be_false + expect_raises(IO::Error, "Closed stream") { response << "foo" } io.to_s.should eq("HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n") end diff --git a/src/http/server/response.cr b/src/http/server/response.cr index 9a3c7fc6c8d2..615bec1dcaf5 100644 --- a/src/http/server/response.cr +++ b/src/http/server/response.cr @@ -42,6 +42,7 @@ class HTTP::Server # :nodoc: def reset + # This method is called by RequestProcessor to avoid allocating a new instance for each iteration. @headers.clear @cookies = nil @status_code = 200 @@ -104,6 +105,11 @@ class HTTP::Server @output.close end + # Returns `true` if this response has been closed. + def closed? + @output.closed? + end + # Generates an error response using *message* and *code*. # # Calls `reset` and then writes the given message. @@ -154,6 +160,7 @@ class HTTP::Server @sync = false @flush_on_newline = false @chunked = false + @closed = false end private def unbuffered_read(slice : Bytes) @@ -182,6 +189,10 @@ class HTTP::Server end end + def closed? + @closed + end + def close unless response.wrote_headers? response.content_length = @out_count @@ -204,6 +215,7 @@ class HTTP::Server private def unbuffered_close @io << "0\r\n\r\n" if @chunked + @closed = true end private def unbuffered_rewind