From e502a8e21e597895ccb6508b35af1d975c33aeb0 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Mon, 4 Jan 2016 11:41:30 +0000 Subject: avoid StringIO#binmode for the next few years Apparently, StringIO#binmode has been totally broken in 1.9+ and I've always hidden this bug with the combination of an explicit string and magic "encoding: binary" comments :x ref: https://bugs.ruby-lang.org/issues/11945 --- lib/yahns/http_client.rb | 2 +- lib/yahns/http_context.rb | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/lib/yahns/http_client.rb b/lib/yahns/http_client.rb index 109b545..c300742 100644 --- a/lib/yahns/http_client.rb +++ b/lib/yahns/http_client.rb @@ -3,7 +3,7 @@ # License: GPL-3.0+ (https://www.gnu.org/licenses/gpl-3.0.txt) # frozen_string_literal: true class Yahns::HttpClient < Kgio::Socket # :nodoc: - NULL_IO = StringIO.new.binmode # :nodoc: + NULL_IO = StringIO.new(''.dup) # :nodoc: include Yahns::HttpResponse QEV_FLAGS = Yahns::Queue::QEV_RD # used by acceptor diff --git a/lib/yahns/http_context.rb b/lib/yahns/http_context.rb index c7258ad..10be062 100644 --- a/lib/yahns/http_context.rb +++ b/lib/yahns/http_context.rb @@ -80,13 +80,16 @@ module Yahns::HttpContext # :nodoc: def tmpio_for(len, env) # short requests are most common - return StringIO.new.binmode if len && len <= @client_body_buffer_size; - - # too big or chunked, unknown length - tmp = @input_buffer_tmpdir - mbs = @client_max_body_size - tmp = mbs ? Yahns::CapInput.new(mbs, tmp) : Yahns::TmpIO.new(tmp) - (env['rack.tempfiles'] ||= []) << tmp + if len && len <= @client_body_buffer_size; + # Can't use binmode, yet: https://bugs.ruby-lang.org/issues/11945 + tmp = StringIO.new + tmp.set_encoding(Encoding::ASCII_8BIT) + else # too big or chunked, unknown length + tmp = @input_buffer_tmpdir + mbs = @client_max_body_size + tmp = mbs ? Yahns::CapInput.new(mbs, tmp) : Yahns::TmpIO.new(tmp) + (env['rack.tempfiles'] ||= []) << tmp + end tmp end end -- cgit v1.2.3-24-ge0c7