From 5b4b44e6d6285241fe6abc894206da17a306dd75 Mon Sep 17 00:00:00 2001 From: Yusuke Nakamura Date: Mon, 16 Dec 2019 21:14:21 +0900 Subject: [PATCH] Use String#dup in Excon::Utils#binary_encode for frozen string Excon::Utils#binary_encode may receive frosen string. --- lib/excon/connection.rb | 6 +++--- lib/excon/socket.rb | 2 +- lib/excon/utils.rb | 12 +++++++----- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/lib/excon/connection.rb b/lib/excon/connection.rb index 275bb775..0e109969 100644 --- a/lib/excon/connection.rb +++ b/lib/excon/connection.rb @@ -161,7 +161,7 @@ def request_call(datum) socket.write(request) # write out request + headers while true # write out body with chunked encoding chunk = datum[:request_block].call - binary_encode(chunk) + chunk = binary_encode(chunk) if chunk.length > 0 socket.write(chunk.length.to_s(16) << CR_NL << chunk << CR_NL) else @@ -180,10 +180,10 @@ def request_call(datum) end # if request + headers is less than chunk size, fill with body - binary_encode(request) + request = binary_encode(request) chunk = body.read([datum[:chunk_size] - request.length, 0].max) if chunk - binary_encode(chunk) + chunk = binary_encode(chunk) socket.write(request << chunk) else socket.write(request) # write out request + headers diff --git a/lib/excon/socket.rb b/lib/excon/socket.rb index a9ad7f04..19b80951 100644 --- a/lib/excon/socket.rb +++ b/lib/excon/socket.rb @@ -237,7 +237,7 @@ def read_block(max_length) end def write_nonblock(data) - binary_encode(data) + data = binary_encode(data) loop do written = nil begin diff --git a/lib/excon/utils.rb b/lib/excon/utils.rb index 70603dd2..7ea19ac4 100644 --- a/lib/excon/utils.rb +++ b/lib/excon/utils.rb @@ -12,7 +12,9 @@ module Utils def binary_encode(string) if FORCE_ENC && string.encoding != Encoding::ASCII_8BIT - string.force_encoding('BINARY') + string.dup.force_encoding('BINARY') + else + string end end @@ -89,7 +91,7 @@ def query_string(datum) def split_header_value(str) return [] if str.nil? str = str.dup.strip - binary_encode(str) + str = binary_encode(str) str.scan(%r'\G((?:"(?:\\.|[^"])+?"|[^",]+)+) (?:,\s*|\Z)'xn).flatten end @@ -97,21 +99,21 @@ def split_header_value(str) # Escapes HTTP reserved and unwise characters in +str+ def escape_uri(str) str = str.dup - binary_encode(str) + str = binary_encode(str) str.gsub(UNESCAPED) { "%%%02X" % $1[0].ord } end # Unescapes HTTP reserved and unwise characters in +str+ def unescape_uri(str) str = str.dup - binary_encode(str) + str = binary_encode(str) str.gsub(ESCAPED) { $1.hex.chr } end # Unescape form encoded values in +str+ def unescape_form(str) str = str.dup - binary_encode(str) + str = binary_encode(str) str.gsub!(/\+/, ' ') str.gsub(ESCAPED) { $1.hex.chr } end