From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-2.9 required=3.0 tests=ALL_TRUSTED,BAYES_00, URIBL_BLOCKED shortcircuit=no autolearn=unavailable version=3.3.2 X-Original-To: yahns-public@yhbt.net Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 9F79F1FD7B for ; Tue, 3 Mar 2015 07:59:34 +0000 (UTC) From: Eric Wong To: yahns-public@yhbt.net Subject: [PATCH 2/3] extras/proxy_pass: log exceptions leading to 502 Date: Tue, 3 Mar 2015 07:59:29 +0000 Message-Id: <1425369570-28427-3-git-send-email-e@80x24.org> In-Reply-To: <1425369570-28427-1-git-send-email-e@80x24.org> References: <1425369570-28427-1-git-send-email-e@80x24.org> List-Id: It may be useful for us to track down potential errors in our code or log when an upstream misbehaves. --- extras/proxy_pass.rb | 4 +++ test/server_helper.rb | 6 ++-- test/test_extras_proxy_pass.rb | 78 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 test/test_extras_proxy_pass.rb diff --git a/extras/proxy_pass.rb b/extras/proxy_pass.rb index 8a32cac..de6a2b1 100644 --- a/extras/proxy_pass.rb +++ b/extras/proxy_pass.rb @@ -189,6 +189,10 @@ class ProxyPass # :nodoc: res rescue => e retry if ures && ures.fail_retryable? && request_method != "POST" + if defined?(Yahns::Log) + logger = env['rack.logger'] and + Yahns::Log.exception(logger, 'proxy_pass', e) + end ERROR_502 end 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 -- EW