From 6fc4ca53762a4082e9f6ff0786392c99f8f08d11 Mon Sep 17 00:00:00 2001 From: Oskar Eichler Date: Sun, 30 Aug 2026 02:19:12 +0200 Subject: [PATCH 1/2] Support array response headers in CGI --- lib/rackup/handler/cgi.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/rackup/handler/cgi.rb b/lib/rackup/handler/cgi.rb index a8f8a11..7ba8723 100644 --- a/lib/rackup/handler/cgi.rb +++ b/lib/rackup/handler/cgi.rb @@ -40,8 +40,10 @@ def self.serve(app) def self.send_headers(status, headers) $stdout.print "Status: #{status}\r\n" headers.each { |k, vs| - vs.split("\n").each { |v| - $stdout.print "#{k}: #{v}\r\n" + Array(vs).each { |value| + value.split("\n").each { |v| + $stdout.print "#{k}: #{v}\r\n" + } } } $stdout.print "\r\n" From ec33dd90191fac47958d461ca06c64dad30e7c6a Mon Sep 17 00:00:00 2001 From: Oskar Eichler Date: Sun, 30 Aug 2026 15:09:16 +0700 Subject: [PATCH 2/2] Test array response headers in CGI --- test/spec_cgi.rb | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 test/spec_cgi.rb diff --git a/test/spec_cgi.rb b/test/spec_cgi.rb new file mode 100644 index 0000000..400bff1 --- /dev/null +++ b/test/spec_cgi.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +# Released under the MIT License. +# Copyright, 2026, by Oskar Eichler. + +require_relative 'helper' +require_relative '../lib/rackup/handler/cgi' + +describe Rackup::Handler::CGI do + it 'writes string and array response header values' do + output = StringIO.new + original_stdout = $stdout + $stdout = output + + Rackup::Handler::CGI.send_headers( + 200, + 'vary' => "accept\norigin", + 'set-cookie' => ['session=one', 'session=two'] + ) + + output.string.must_equal( + "Status: 200\r\n" \ + "vary: accept\r\n" \ + "vary: origin\r\n" \ + "set-cookie: session=one\r\n" \ + "set-cookie: session=two\r\n\r\n" + ) + ensure + $stdout = original_stdout + end +end