Skip to content
This repository has been archived by the owner on Apr 14, 2021. It is now read-only.

Commit

Permalink
Set X-Gemfile-Source when fetching gems
Browse files Browse the repository at this point in the history
Since gemstash will only support RubyGems >= 2.4 (rubygems/gemstash#32),
we only set this header in RubyGems 2.0+.
  • Loading branch information
agis committed Oct 20, 2015
1 parent 73afaf7 commit b1aefb5
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 1 deletion.
1 change: 1 addition & 0 deletions .rubocop_todo.yml
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,7 @@ Style/RescueModifier:
- 'lib/bundler/fetcher.rb'
- 'lib/bundler/resolver.rb'
- 'spec/realworld/dependency_api_spec.rb'
- 'spec/realworld/gemfile_source_header_spec.rb'

# Offense count: 1
# Configuration parameters: Methods.
Expand Down
3 changes: 2 additions & 1 deletion lib/bundler/rubygems_integration.rb
Original file line number Diff line number Diff line change
Expand Up @@ -586,7 +586,8 @@ def download_gem(spec, uri, path)
uri = Bundler.settings.mirror_for(uri)
proxy = configuration[:http_proxy]
dns = Resolv::DNS.new
fetcher = Gem::RemoteFetcher.new(proxy, dns)
fetcher = Bundler::GemRemoteFetcher.new(proxy, dns)
fetcher.headers = { "X-Gemfile-Source" => spec.remote.original_uri.to_s } if spec.remote.original_uri
fetcher.download(spec, uri, path)
end

Expand Down
63 changes: 63 additions & 0 deletions spec/realworld/gemfile_source_header_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
require "spec_helper"
require "thread"

describe "fetching dependencies with a mirrored source", :rubygems => ">= 2.0" do
let(:mirror) { "https://server.example.org" }
let(:original) { "http://127.0.0.1:#{@port}" }

before do
setup_server
bundle "config --local mirror.#{mirror} #{original}"
end

after { @t.kill }

it "sets the 'X-Gemfile-Source' header and bundles successfully" do
gemfile <<-G
source "#{mirror}"
gem 'weakling'
G

bundle :install

expect(out).to include("Installing weakling")
expect(out).to include("Bundle complete")
should_be_installed "weakling 0.0.3"
end

private

def setup_server
# need to hack, so we can require rack
old_gem_home = ENV["GEM_HOME"]
ENV["GEM_HOME"] = Spec::Path.base_system_gems.to_s
require "rack"
ENV["GEM_HOME"] = old_gem_home

@port = 21_459
@port += 1 while TCPSocket.new("127.0.0.1", @port) rescue false
@server_uri = "http://127.0.0.1:#{@port}"

require File.expand_path("../../support/artifice/endpoint_mirror_source", __FILE__)

@t = Thread.new {
Rack::Server.start(:app => EndpointMirrorSource,
:Host => "0.0.0.0",
:Port => @port,
:server => "webrick",
:AccessLog => [])
}.run

wait_for_server(@port)
end

def wait_for_server(port, seconds = 15)
tries = 0
sleep 0.5
TCPSocket.new("127.0.0.1", port)
rescue => e
raise(e) if tries > (seconds * 2)
tries += 1
retry
end
end
13 changes: 13 additions & 0 deletions spec/support/artifice/endpoint_mirror_source.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
require File.expand_path("../endpoint", __FILE__)

class EndpointMirrorSource < Endpoint
get "/gems/:id" do
if request.env["HTTP_X_GEMFILE_SOURCE"] == "https://server.example.org/"
File.read("#{gem_repo1}/gems/#{params[:id]}")
else
halt 500
end
end
end

Artifice.activate_with(EndpointMirrorSource)

0 comments on commit b1aefb5

Please sign in to comment.