From c98942ca949e3d210c4c61939f1e3e18ccd466a8 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Tue, 3 Mar 2015 07:54:54 +0000 Subject: extras/proxy_pass: log exceptions leading to 502 It may be useful for us to track down potential errors in our code or log when an upstream misbehaves. --- test/server_helper.rb | 6 ++-- test/test_extras_proxy_pass.rb | 78 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 test/test_extras_proxy_pass.rb (limited to 'test') diff --git a/test/server_helper.rb b/test/server_helper.rb index e2641a9..1ce2f29 100644 --- a/test/server_helper.rb +++ b/test/server_helper.rb @@ -72,10 +72,10 @@ module ServerHelper @ru = nil end - def mkserver(cfg) + def mkserver(cfg, srv = @srv) fork do - ENV["YAHNS_FD"] = @srv.fileno.to_s - @srv.autoclose = false + ENV["YAHNS_FD"] = srv.fileno.to_s + srv.autoclose = false yield if block_given? Yahns::Server.new(cfg).start.join end diff --git a/test/test_extras_proxy_pass.rb b/test/test_extras_proxy_pass.rb new file mode 100644 index 0000000..513e574 --- /dev/null +++ b/test/test_extras_proxy_pass.rb @@ -0,0 +1,78 @@ +# Copyright (C) 2015 all contributors +# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt) +require_relative 'server_helper' + +class TestExtrasProxyPass < Testcase + ENV["N"].to_i > 1 and parallelize_me! + include ServerHelper + + class ProxiedApp + def call(env) + h = [ %w(Content-Length 3), %w(Content-Type text/plain) ] + case env['REQUEST_METHOD'] + when 'GET' + [ 200, h, [ "hi\n"] ] + when 'HEAD' + [ 200, h, [] ] + when 'PUT' + buf = env['rack.input'].read + [ 201, { + 'Content-Length' => buf.bytesize.to_s, + 'Content-Type' => 'text/plain', + }, [ buf ] ] + end + end + end + + def setup + @srv2 = TCPServer.new(ENV["TEST_HOST"] || "127.0.0.1", 0) + server_helper_setup + end + + def teardown + @srv2.close if defined?(@srv2) && !@srv2.closed? + server_helper_teardown + end + + def test_proxy_pass + err, cfg, host, port = @err, Yahns::Config.new, @srv.addr[3], @srv.addr[1] + host2, port2 = @srv2.addr[3], @srv2.addr[1] + pid = mkserver(cfg) do + $LOAD_PATH.unshift "#{Dir.pwd}/extras" + require 'proxy_pass' + @srv2.close + cfg.instance_eval do + app(:rack, ProxyPass.new("http://#{host2}:#{port2}/")) do + listen "#{host}:#{port}" + end + stderr_path err.path + end + end + + pid2 = mkserver(cfg, @srv2) do + @srv.close + cfg.instance_eval do + app(:rack, ProxiedApp.new) do + listen "#{host2}:#{port2}" + end + stderr_path err.path + end + end + + Net::HTTP.start(host, port) do |http| + res = http.request(Net::HTTP::Get.new('/')) + assert_equal 200, res.code.to_i + n = res.body.bytesize + assert_operator n, :>, 1 + res = http.request(Net::HTTP::Head.new('/')) + assert_equal 200, res.code.to_i + assert_equal n, res['Content-Length'].to_i + assert_nil res.body + + res = http.put(Net::HTTP::Put.new('/')) + end + ensure + quit_wait pid + quit_wait pid2 + end +end -- cgit v1.2.3-24-ge0c7