unicorn Ruby/Rack server user+dev discussion/patches/pulls/bugs/help
 help / color / mirror / code / Atom feed
From: Eric Wong <e@80x24.org>
To: Martin Posthumus <martin.posthumus@gmail.com>
Cc: unicorn-public@yhbt.net
Subject: Re: Support for Rack 3 headers formatted as arrays
Date: Sat, 10 Dec 2022 02:42:46 +0000	[thread overview]
Message-ID: <20221210024246.GA8584@dcvr> (raw)
In-Reply-To: <f25e283e-95e7-a812-c0fd-c79bc31894de@gmail.com>

Martin Posthumus <martin.posthumus@gmail.com> wrote:
> Hello,
> As of Rack v3, the internal representation of headers containing multiple
> values appears to have been changed to use an array of strings rather than a
> newline-separated string. Pull request visible here:
> https://github.com/rack/rack/pull/1793
> The Rack changelog (https://github.com/rack/rack/blob/main/CHANGELOG.md)
> also includes this entry under 3.0.0:
> "Response header values can be an Array to handle multiple values (and no
> longer supports \n encoded headers)."

OK.  unicorn has no choice to support all Rack as long as Rack <= 2
applications exist...

> I'm running into some serialization issues with this sort of header when
> trying to run an application on Unicorn that makes use of multiple cookies.
> The `set-cookie` header is returning what appears to be a stringified array:
> set-cookie: ["my.cookie=.....; domain=......; path=/", "rack.session=......;
> path=/; httponly"]
> Which in turn results in cookies getting registered with names like
> `["rack.session` rather than `rack.session`.
> I'm not especially familiar with Unicorn's internals, but poking around a
> little bit, it looks like this might be related to the definition of
> `http_response_write` in lib/unicorn/http_response.rb, where it handles
> newline-separated strings, but not arrays. I can confirm that the set-cookie
> header value appears to be an array in this method, not a string.

Does this work for you?

diff --git a/lib/unicorn/http_response.rb b/lib/unicorn/http_response.rb
index b23e521..3308c9b 100644
--- a/lib/unicorn/http_response.rb
+++ b/lib/unicorn/http_response.rb
@@ -40,7 +40,10 @@ def http_response_write(socket, status, headers, body,
           # key in Rack < 1.5
           hijack = value
-          if value =~ /\n/
+          case value
+          when Array # Rack 3
+            value.each { |v| buf << "#{key}: #{v}\r\n" }
+          when /\n/ # Rack 2
             # avoiding blank, key-only cookies with /\n+/
             value.split(/\n+/).each { |v| buf << "#{key}: #{v}\r\n" }

> At present I'm only seeing this issue when running on a Unicorn server. When
> I swap out something like webrick, it appears the array values are handled
> as expected.

Yeah, I haven't looked deeply at Rack 3 support and hate dealing
with the culture of breaking changes prevalent in the Ruby world :<

  reply	other threads:[~2022-12-10  2:42 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-09 21:52 Support for Rack 3 headers formatted as arrays Martin Posthumus
2022-12-10  2:42 ` Eric Wong [this message]
2022-12-12 15:52   ` Martin Posthumus
2022-12-25 22:56     ` Eric Wong
2022-12-27  8:17       ` Jean Boussier
2023-01-11 11:12       ` Jean Boussier
2023-01-11 11:40         ` Eric Wong
2023-01-11 11:44           ` Jean Boussier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:

  List information: https://yhbt.net/unicorn/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20221210024246.GA8584@dcvr \
    --to=e@80x24.org \
    --cc=martin.posthumus@gmail.com \
    --cc=unicorn-public@yhbt.net \


* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).