diff options
author | Eric Wong <e@80x24.org> | 2016-08-03 02:57:15 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2016-08-03 02:59:25 +0000 |
commit | f1f430323bcab90bdbbe980d6ef5b60602796a55 (patch) | |
tree | f242391bf9bedc59434915cb063ea6bcd00f6dfe /test/test_auto_chunk.rb | |
parent | f770e5ba01bfcbc3c9f5c3eb12b28abdf6849f15 (diff) | |
download | yahns-f1f430323bcab90bdbbe980d6ef5b60602796a55.tar.gz |
We might as well do it since puma and thin both do(*), and we can still do writev for now to get some speedups by avoiding Rack::Chunked overhead. timing runs of "curl --no-buffer http://127.0.0.1:9292/ >/dev/null" results in a best case drop from ~260ms to ~205ms on one VM by disabling Rack::Chunked in the below config.ru $ ruby -I lib bin/yahns-rackup -E none config.ru ==> config.ru <== class Body STR = ' ' * 1024 * 16 def each 10000.times { yield STR } end end use Rack::Chunked if ENV['RACK_CHUNKED'] run(lambda do |env| [ 200, [ %w(Content-Type text/plain) ], Body.new ] end) (*) they can do Content-Length, but I don't think it's worth the effort at the server level.
Diffstat (limited to 'test/test_auto_chunk.rb')
-rw-r--r-- | test/test_auto_chunk.rb | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/test/test_auto_chunk.rb b/test/test_auto_chunk.rb new file mode 100644 index 0000000..a97fe26 --- /dev/null +++ b/test/test_auto_chunk.rb @@ -0,0 +1,56 @@ +# Copyright (C) 2013-2016 all contributors <yahns-public@yhbt.net> +# License: GPL-3.0+ <https://www.gnu.org/licenses/gpl-3.0.txt> +# frozen_string_literal: true +require_relative 'server_helper' + +class TestAutoChunk < Testcase + ENV["N"].to_i > 1 and parallelize_me! + include ServerHelper + alias setup server_helper_setup + alias teardown server_helper_teardown + + def test_auto_head + err = @err + cfg = Yahns::Config.new + host, port = @srv.addr[3], @srv.addr[1] + cfg.instance_eval do + GTL.synchronize do + app = Rack::Builder.new do + use Rack::ContentType, "text/plain" + run(lambda do |env| + [ 200, {}, %w(a b c) ] + end) + end + app(:rack, app) { listen "#{host}:#{port}" } + end + logger(Logger.new(err.path)) + end + pid = mkserver(cfg) + s = TCPSocket.new(host, port) + s.write("GET / HTTP/1.0\r\n\r\n") + assert s.wait(30), "IO wait failed" + buf = s.read + assert_match %r{\r\n\r\nabc\z}, buf + s.close + + s = TCPSocket.new(host, port) + s.write("GET / HTTP/1.1\r\nHost: example.com\r\n\r\n") + buf = ''.dup + Timeout.timeout(30) do + until buf =~ /\r\n\r\n1\r\na\r\n1\r\nb\r\n1\r\nc\r\n0\r\n\r\n\z/ + buf << s.readpartial(16384) + end + end + assert_match(%r{^Transfer-Encoding: chunked\r\n}, buf) + s.close + + Net::HTTP.start(host, port) do |http| + req = Net::HTTP::Get.new("/") + res = http.request(req) + assert_equal 200, res.code.to_i + assert_equal 'abc', res.body + end + ensure + quit_wait(pid) + end +end |