Skip to content

Commit 212110b

Browse files
committed
Pass headers down instead of using a block
Right now we are buffering entire gems in memory when we download them. * https://github.com/rubygems/rubygems/blob/66c94f65c8a05484f2d12cb0bccd8513da5c65ef/lib/rubygems/request.rb#L208-L216 I would like to open the possibility of streaming assets rather than storing the entire asset in memory. In order to accomplish this, I would like to allow callers to pass a block to indicate that they "want to stream". Before this commit, we would use the block to set headers on the request object. This commit passes the headers down to construct the request object. Callers know the headers they want to set before calling the method, so it makes sense to pass them in via parameters rather than as a block
1 parent 66c94f6 commit 212110b

File tree

5 files changed

+24
-43
lines changed

5 files changed

+24
-43
lines changed

lib/rubygems/remote_fetcher.rb

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -210,9 +210,7 @@ def fetch_file(uri, *_)
210210

211211
def fetch_http(uri, last_modified = nil, head = false, depth = 0)
212212
fetch_type = head ? Gem::Net::HTTP::Head : Gem::Net::HTTP::Get
213-
response = request uri, fetch_type, last_modified do |req|
214-
headers.each {|k,v| req.add_field(k,v) }
215-
end
213+
response = request uri, fetch_type, last_modified, headers
216214

217215
case response
218216
when Gem::Net::HTTPOK, Gem::Net::HTTPNotModified then
@@ -308,15 +306,13 @@ def cache_update_path(uri, path = nil, update = true)
308306
# a Gem::Net::HTTP response object. request maintains a table of persistent
309307
# connections to reduce connect overhead.
310308

311-
def request(uri, request_class, last_modified = nil)
309+
def request(uri, request_class, last_modified = nil, headers = {})
312310
proxy = proxy_for @proxy, uri
313311
pool = pools_for(proxy).pool_for uri
314312

315-
request = Gem::Request.new uri, request_class, last_modified, pool
313+
request = Gem::Request.new uri, request_class, last_modified, pool, headers
316314

317-
request.fetch do |req|
318-
yield req if block_given?
319-
end
315+
request.fetch
320316
end
321317

322318
def https?(uri)

lib/rubygems/request.rb

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def self.create_with_proxy(uri, request_class, last_modified, proxy) # :nodoc:
1414
proxy ||= get_proxy_from_env(uri.scheme)
1515
pool = ConnectionPools.new proxy_uri(proxy), cert_files
1616

17-
new(uri, request_class, last_modified, pool.pool_for(uri))
17+
new(uri, request_class, last_modified, pool.pool_for(uri), {})
1818
end
1919

2020
def self.proxy_uri(proxy) # :nodoc:
@@ -26,12 +26,13 @@ def self.proxy_uri(proxy) # :nodoc:
2626
end
2727
end
2828

29-
def initialize(uri, request_class, last_modified, pool)
29+
def initialize(uri, request_class, last_modified, pool, initheader)
3030
@uri = uri
3131
@request_class = request_class
3232
@last_modified = last_modified
3333
@requests = Hash.new(0).compare_by_identity
3434
@user_agent = user_agent
35+
@initheader = initheader
3536

3637
@connection_pool = pool
3738
end
@@ -139,7 +140,7 @@ def connection_for(uri)
139140
end
140141

141142
def fetch
142-
request = @request_class.new @uri.request_uri
143+
request = @request_class.new @uri.request_uri, @initheader
143144

144145
unless @uri.nil? || @uri.user.nil? || @uri.user.empty?
145146
request.basic_auth Gem::UriFormatter.new(@uri.user).unescape,
@@ -155,8 +156,6 @@ def fetch
155156
request.add_field "If-Modified-Since", @last_modified.httpdate
156157
end
157158

158-
yield request if block_given?
159-
160159
perform_request request
161160
end
162161

lib/rubygems/s3_uri_signer.rb

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -177,13 +177,11 @@ def ec2_metadata_credentials_imds_v1
177177
end
178178

179179
def ec2_metadata_request(url, token:)
180-
request = ec2_iam_request(Gem::URI(url), Gem::Net::HTTP::Get)
180+
request = ec2_iam_request(Gem::URI(url), Gem::Net::HTTP::Get, token ? {
181+
"X-aws-ec2-metadata-token" => token
182+
} : {})
181183

182-
response = request.fetch do |req|
183-
if token
184-
req.add_field "X-aws-ec2-metadata-token", token
185-
end
186-
end
184+
response = request.fetch
187185

188186
case response
189187
when Gem::Net::HTTPOK then
@@ -194,11 +192,11 @@ def ec2_metadata_request(url, token:)
194192
end
195193

196194
def ec2_metadata_token
197-
request = ec2_iam_request(Gem::URI(EC2_IAM_TOKEN), Gem::Net::HTTP::Put)
195+
request = ec2_iam_request(Gem::URI(EC2_IAM_TOKEN), Gem::Net::HTTP::Put, {
196+
"X-aws-ec2-metadata-token-ttl-seconds" => "60"
197+
})
198198

199-
response = request.fetch do |req|
200-
req.add_field "X-aws-ec2-metadata-token-ttl-seconds", 60
201-
end
199+
response = request.fetch
202200

203201
case response
204202
when Gem::Net::HTTPOK then
@@ -208,9 +206,9 @@ def ec2_metadata_token
208206
end
209207
end
210208

211-
def ec2_iam_request(uri, verb)
209+
def ec2_iam_request(uri, verb, headers)
212210
@request_pool ||= create_request_pool(uri)
213-
Gem::Request.new(uri, verb, nil, @request_pool)
211+
Gem::Request.new(uri, verb, nil, @request_pool, headers)
214212
end
215213

216214
def create_request_pool(uri)

test/rubygems/test_gem_remote_fetcher.rb

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -516,7 +516,7 @@ def test_fetch_http
516516
@fetcher = fetcher
517517
url = "http://gems.example.com/redirect"
518518

519-
def fetcher.request(uri, request_class, last_modified = nil)
519+
def fetcher.request(uri, request_class, last_modified = nil, headers = {})
520520
url = "http://gems.example.com/redirect"
521521
if defined? @requested
522522
res = Gem::Net::HTTPOK.new nil, 200, nil
@@ -541,7 +541,7 @@ def test_fetch_http_redirects
541541
@fetcher = fetcher
542542
url = "http://gems.example.com/redirect"
543543

544-
def fetcher.request(uri, request_class, last_modified = nil)
544+
def fetcher.request(uri, request_class, last_modified = nil, headers = {})
545545
url = "http://gems.example.com/redirect"
546546
res = Gem::Net::HTTPMovedPermanently.new nil, 301, nil
547547
res.add_field "Location", url
@@ -560,7 +560,7 @@ def test_fetch_http_redirects_without_location
560560
@fetcher = fetcher
561561
url = "http://gems.example.com/redirect"
562562

563-
def fetcher.request(uri, request_class, last_modified = nil)
563+
def fetcher.request(uri, request_class, last_modified = nil, headers = {})
564564
res = Gem::Net::HTTPMovedPermanently.new nil, 301, nil
565565
res
566566
end
@@ -572,18 +572,6 @@ def fetcher.request(uri, request_class, last_modified = nil)
572572
assert_equal "redirecting but no redirect location was given (#{url})", e.message
573573
end
574574

575-
def test_request_block
576-
fetcher = Gem::RemoteFetcher.new nil
577-
@fetcher = fetcher
578-
579-
assert_throws :block_called do
580-
fetcher.request Gem::URI("http://example"), Gem::Net::HTTP::Get do |req|
581-
assert_kind_of Gem::Net::HTTPGenericRequest, req
582-
throw :block_called
583-
end
584-
end
585-
end
586-
587575
def test_yaml_error_on_size
588576
use_ui @stub_ui do
589577
fetcher = Gem::RemoteFetcher.new nil

test/rubygems/test_gem_remote_fetcher_s3.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ def initialize(uri, method)
4949
super
5050
end
5151

52-
def ec2_iam_request(uri, verb)
53-
fake_s3_request = FakeGemRequest.new(uri, verb, nil, nil)
52+
def ec2_iam_request(uri, verb, headers)
53+
fake_s3_request = FakeGemRequest.new(uri, verb, nil, nil, headers)
5454
@aws_iam_calls << fake_s3_request
5555

5656
case uri.to_s
@@ -90,7 +90,7 @@ def res.body = FakeS3URISigner.instance_profile
9090
class FakeGemFetcher < Gem::RemoteFetcher
9191
attr_reader :fetched_uri, :last_s3_uri_signer
9292

93-
def request(uri, request_class, last_modified = nil)
93+
def request(uri, ...)
9494
@fetched_uri = uri
9595
res = Gem::Net::HTTPOK.new nil, 200, nil
9696
def res.body = "success"

0 commit comments

Comments
 (0)