Skip to content

Only load what is required from cgi for Ruby 3.5 #3247

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Jun 9, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion build_tools/custom_service.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
# frozen_string_literal: true

require 'json'
require 'cgi'
require "cgi/escape"
require "cgi/util" if RUBY_VERSION < "3.5"

module BuildTools
class CustomService
Expand Down
2 changes: 2 additions & 0 deletions gems/aws-sdk-core/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
Unreleased Changes
------------------

* Issue - Only load required `cgi` modules for Ruby 3.5.

3.225.1 (2025-06-05)
------------------

Expand Down
3 changes: 2 additions & 1 deletion gems/aws-sdk-core/lib/aws-sdk-core/endpoints/matchers.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# frozen_string_literal: true

require 'cgi'
require "cgi/escape"
require "cgi/util" if RUBY_VERSION < "3.5"

module Aws
module Endpoints
Expand Down
3 changes: 2 additions & 1 deletion gems/aws-sdk-core/lib/aws-sdk-core/util.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# frozen_string_literal: true

require 'cgi'
require "cgi/escape"
require "cgi/util" if RUBY_VERSION < "3.5"

module Aws
# @api private
Expand Down
3 changes: 2 additions & 1 deletion gems/aws-sdk-core/lib/aws-sdk-core/xml/error_handler.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# frozen_string_literal: true

require 'cgi'
require "cgi/escape"
require "cgi/util" if RUBY_VERSION < "3.5"

module Aws
module Xml
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# frozen_string_literal: true

require 'cgi'
require "cgi/escape"
require "cgi/util" if RUBY_VERSION < "3.5"
require 'net/http'
require 'net/https'
require 'delegate'
Expand Down
3 changes: 2 additions & 1 deletion gems/aws-sdk-core/lib/seahorse/util.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# frozen_string_literal: true

require 'cgi'
require "cgi/escape"
require "cgi/util" if RUBY_VERSION < "3.5"

module Seahorse
# @api private
Expand Down
4 changes: 2 additions & 2 deletions gems/aws-sdk-core/spec/aws/sts/presigner_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ module STS



expect(CGI.parse(actual_url)).to eq(CGI.parse(expected_url))
expect(URI.decode_www_form(actual_url)).to eq(URI.decode_www_form(expected_url))
end

it 'can presign with legacy sts endpoint' do
Expand All @@ -64,7 +64,7 @@ module STS
headers: { 'X-K8s-Aws-Id' => 'my-eks-cluster' }
)

expect(CGI.parse(actual_url)).to eq(CGI.parse(expected_url))
expect(URI.decode_www_form(actual_url)).to eq(URI.decode_www_form(expected_url))
end
end
end
Expand Down
14 changes: 7 additions & 7 deletions gems/aws-sdk-ec2/spec/client_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -97,19 +97,19 @@ module EC2
.to eq(destination_region)

presigned_url = resp.context.params[:presigned_url]
presigned_url_params = CGI.parse(presigned_url.split('?').last)
presigned_url_params = URI.decode_www_form(presigned_url.split('?').last).to_h

expect(presigned_url)
.to match(/^https:\/\/ec2\.#{source_region}.amazonaws.com/)

expect(presigned_url_params['Action']).to eq(['CopySnapshot'])
expect(presigned_url_params['Version']).to eq(['2016-11-15'])
expect(presigned_url_params['DestinationRegion']).to eq([destination_region])
expect(presigned_url_params['SourceRegion']).to eq([source_region])
expect(presigned_url_params['SourceSnapshotId']).to eq([source_snapshot_id])
expect(presigned_url_params['Action']).to eq('CopySnapshot')
expect(presigned_url_params['Version']).to eq('2016-11-15')
expect(presigned_url_params['DestinationRegion']).to eq(destination_region)
expect(presigned_url_params['SourceRegion']).to eq(source_region)
expect(presigned_url_params['SourceSnapshotId']).to eq(source_snapshot_id)

expect(presigned_url_params['X-Amz-Signature'])
.to eq(['c34b30736cc5cd6a10af02c1edb50aed3d7424577644fb912f676846a65311cf'])
.to eq('c34b30736cc5cd6a10af02c1edb50aed3d7424577644fb912f676846a65311cf')
end
end

Expand Down
4 changes: 2 additions & 2 deletions gems/aws-sdk-polly/spec/presigner_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ module Polly
}

actual_url = pre.synthesize_speech_presigned_url(params)
expect(CGI.parse(actual_url)).to eq(CGI.parse(expected_url))
expect(URI.decode_www_form(actual_url)).to eq(URI.decode_www_form(expected_url))
end

it 'can presign #synthesize_speech using region and credentials' do
Expand All @@ -93,7 +93,7 @@ module Polly
}

actual_url = pre.synthesize_speech_presigned_url(params)
expect(CGI.parse(actual_url)).to eq(CGI.parse(expected_url))
expect(URI.decode_www_form(actual_url)).to eq(URI.decode_www_form(expected_url))
end

end
Expand Down
2 changes: 2 additions & 0 deletions gems/aws-sdk-s3/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
Unreleased Changes
------------------

* Issue - Only load required `cgi` modules for Ruby 3.5.

1.189.0 (2025-06-02)
------------------

Expand Down
3 changes: 2 additions & 1 deletion gems/aws-sdk-s3/lib/aws-sdk-s3/legacy_signer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
require 'set'
require 'time'
require 'openssl'
require 'cgi'
require "cgi/escape"
require "cgi/util" if RUBY_VERSION < "3.5"
require 'aws-sdk-core/query'

module Aws
Expand Down
3 changes: 2 additions & 1 deletion gems/aws-sdk-s3/lib/aws-sdk-s3/object_multipart_copier.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
# frozen_string_literal: true

require 'thread'
require 'cgi'
require "cgi/escape"
require "cgi/util" if RUBY_VERSION < "3.5"

module Aws
module S3
Expand Down
3 changes: 2 additions & 1 deletion gems/aws-sdk-s3/lib/aws-sdk-s3/plugins/url_encoded_keys.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
# frozen_string_literal: true

require 'uri'
require 'cgi'
require "cgi/escape"
require "cgi/util" if RUBY_VERSION < "3.5"

module Aws
module S3
Expand Down
4 changes: 2 additions & 2 deletions gems/aws-sdk-s3/spec/object/presigned_url_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ module S3
now = Time.parse('20130524T000000Z')
allow(Time).to receive(:now).and_return(now)
url = obj.presigned_url(:get, expires_in: 86_400)
expect(CGI.parse(url)).to eq(CGI.parse(
expect(URI.decode_www_form(url)).to eq(URI.decode_www_form(
'https://examplebucket.s3.amazonaws.com/test.txt?X-Amz-Algorithm='\
'AWS4-HMAC-SHA256&X-Amz-Credential=ACCESS_KEY_ID%2F20130524%2F'\
'us-east-1%2Fs3%2Faws4_request&X-Amz-Date=20130524T000000Z&'\
Expand Down Expand Up @@ -159,7 +159,7 @@ module S3
allow(Time).to receive(:now).and_return(now)
url, headers = obj.presigned_request(
:get, expires_in: 86_400, request_payer: 'peccy')
expect(CGI.parse(url)).to eq(CGI.parse(
expect(URI.decode_www_form(url)).to eq(URI.decode_www_form(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are these actually equivalent? Is there any supporting documentation for these implementations?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CGI.parse: https://docs.ruby-lang.org/en/3.4/CGI.html#method-c-parse
URI.decode_www_form: https://docs.ruby-lang.org/en/3.4/URI.html#method-c-decode_www_form

It treats it as x-www-form-urlencoded, which uses the query string format of key=value&key2=value.

They return data in a slightly different format. CGI.parse returns a hash, URI.decode_www_form an array of 2-element arrays. For tests to just check against this is fine, if it were exposed to users it would need a different solution.

'https://examplebucket.s3.amazonaws.com/test.txt?X-Amz-Algorithm='\
'AWS4-HMAC-SHA256&X-Amz-Credential=ACCESS_KEY_ID%2F20130524%2F'\
'us-east-1%2Fs3%2Faws4_request&X-Amz-Date=20130524T000000Z'\
Expand Down
4 changes: 2 additions & 2 deletions gems/aws-sdk-s3/spec/presigner_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ def initialize(expiration_time)
key: 'test.txt',
expires_in: 86_400
)
expect(CGI.parse(actual_url)).to eq(CGI.parse(expected_url))
expect(URI.decode_www_form(actual_url)).to eq(URI.decode_www_form(expected_url))
end

it 'can sign with a given time' do
Expand Down Expand Up @@ -248,7 +248,7 @@ def initialize(expiration_time)
key: 'test.txt',
expires_in: 86_400
)
expect(CGI.parse(actual_url)).to eq(CGI.parse(expected_url))
expect(URI.decode_www_form(actual_url)).to eq(URI.decode_www_form(expected_url))
end

it 'can sign with a given time' do
Expand Down
2 changes: 2 additions & 0 deletions gems/aws-sigv2/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
Unreleased Changes
------------------

* Issue - Only load required `cgi` modules for Ruby 3.5.

1.3.0 (2025-06-02)
------------------

Expand Down
3 changes: 2 additions & 1 deletion gems/aws-sigv2/lib/aws-sigv2/signer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
require 'openssl'
require 'base64'
require 'uri'
require 'cgi'
require "cgi/escape"
require "cgi/util" if RUBY_VERSION < "3.5"

module Aws
module Sigv2
Expand Down
2 changes: 2 additions & 0 deletions gems/aws-sigv4/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
Unreleased Changes
------------------

* Issue - Only load required `cgi` modules for Ruby 3.5.

1.12.0 (2025-06-02)
------------------

Expand Down
3 changes: 2 additions & 1 deletion gems/aws-sigv4/lib/aws-sigv4/signer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
require 'time'
require 'uri'
require 'set'
require 'cgi'
require "cgi/escape"
require "cgi/util" if RUBY_VERSION < "3.5"
require 'pathname'
require 'aws-eventstream'

Expand Down
Loading