Skip to content

Commit 8532300

Browse files
authored
fix: Corrects the order of caching + authorization middlewares
Fix order of caching + authorization middlewares
2 parents c98caa0 + 28a38b1 commit 8532300

File tree

6 files changed

+288
-2
lines changed

6 files changed

+288
-2
lines changed

Gemfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ group :test do
1919
install_if -> { RUBY_VERSION >= '2.8' } do
2020
gem 'rexml', '>= 3.2.4'
2121
end
22+
gem 'faraday-http-cache', '~> 2.5', '>= 2.5.1'
2223
gem 'json', '>= 2.3.0'
2324
gem 'jwt', '~> 2.2', '>= 2.2.1'
2425
gem 'mime-types', '~> 3.3', '>= 3.3.1'
@@ -29,6 +30,7 @@ group :test do
2930
gem 'rspec', '~> 3.9'
3031
gem 'simplecov', require: false
3132
gem 'test-queue'
33+
gem 'timecop', '~> 0.9.8'
3234
gem 'vcr', '~> 6.1'
3335
gem 'webmock', '~> 3.8', '>= 3.8.2'
3436
end

lib/octokit/client.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,13 +261,15 @@ def client_without_redirects(options = {})
261261
conn_opts[:proxy] = @proxy if @proxy
262262
conn_opts[:ssl] = { verify_mode: @ssl_verify_mode } if @ssl_verify_mode
263263
conn = Faraday.new(conn_opts) do |http|
264+
http_cache_middleware = http.builder.handlers.delete(Faraday::HttpCache) if Faraday.const_defined?(:HttpCache)
264265
if basic_authenticated?
265266
http.request(*FARADAY_BASIC_AUTH_KEYS, @login, @password)
266267
elsif token_authenticated?
267268
http.request :authorization, 'token', @access_token
268269
elsif bearer_authenticated?
269270
http.request :authorization, 'Bearer', @bearer_token
270271
end
272+
http.builder.handlers.push(http_cache_middleware) unless http_cache_middleware.nil?
271273
http.headers['accept'] = options[:accept] if options.key?(:accept)
272274
end
273275
conn.builder.delete(Octokit::Middleware::FollowRedirects)

lib/octokit/connection.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ def agent
106106
http.headers[:accept] = default_media_type
107107
http.headers[:content_type] = 'application/json'
108108
http.headers[:user_agent] = user_agent
109+
http_cache_middleware = http.builder.handlers.delete(Faraday::HttpCache) if Faraday.const_defined?(:HttpCache)
109110
if basic_authenticated?
110111
http.request(*FARADAY_BASIC_AUTH_KEYS, @login, @password)
111112
elsif token_authenticated?
@@ -115,6 +116,7 @@ def agent
115116
elsif application_authenticated?
116117
http.request(*FARADAY_BASIC_AUTH_KEYS, @client_id, @client_secret)
117118
end
119+
http.builder.handlers.push(http_cache_middleware) unless http_cache_middleware.nil?
118120
end
119121
end
120122

spec/cassettes/Octokit_Client_Repositories/_repositories/performs_requests_per_user_when_using_caching_middleware.json

Lines changed: 237 additions & 0 deletions
Large diffs are not rendered by default.

spec/octokit/client/repositories_spec.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
# frozen_string_literal: true
2+
require "faraday-http-cache"
3+
require "timecop"
24

35
describe Octokit::Client::Repositories do
46
before do
@@ -260,6 +262,22 @@
260262
expect(repositories).to be_kind_of Array
261263
assert_requested :get, github_url('/user/repos')
262264
end
265+
it 'performs requests per user when using caching middleware' do
266+
Timecop.freeze(VCR.current_cassette.originally_recorded_at || Time.now) do
267+
client_with_caching = oauth_client_with_http_cache_middleware(access_token: test_github_token)
268+
client_with_caching.repositories
269+
client_with_caching.repositories
270+
271+
client_with_caching_two = oauth_client_with_http_cache_middleware(access_token: test_github_token_two)
272+
client_with_caching_two.repositories
273+
client_with_caching_two.repositories
274+
275+
client_with_caching.repositories
276+
client_with_caching_two.repositories
277+
278+
assert_requested :get, github_url('/user/repos'), times: 2
279+
end
280+
end
263281
end # .repositories
264282

265283
describe '.all_repositories', :vcr do

spec/spec_helper.rb

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@
5252
c.filter_sensitive_data('<<ACCESS_TOKEN>>') do
5353
test_github_token
5454
end
55+
c.filter_sensitive_data('<<ACCESS_TOKEN>>') do
56+
test_github_token_two
57+
end
5558
c.filter_sensitive_data('<GITHUB_COLLABORATOR_TOKEN>') do
5659
test_github_collaborator_token
5760
end
@@ -176,6 +179,10 @@ def test_github_token
176179
ENV.fetch 'OCTOKIT_TEST_GITHUB_TOKEN', 'x' * 40
177180
end
178181

182+
def test_github_token_two
183+
ENV.fetch 'OCTOKIT_TEST_GITHUB_TOKEN_TWO', 'y' * 40
184+
end
185+
179186
def test_github_collaborator_token
180187
ENV.fetch 'OCTOKIT_TEST_GITHUB_COLLABORATOR_TOKEN', 'x' * 40
181188
end
@@ -299,8 +306,8 @@ def basic_auth_client(login: test_github_login, password: test_github_password)
299306
Octokit::Client.new(login: login, password: password)
300307
end
301308

302-
def oauth_client
303-
Octokit::Client.new(access_token: test_github_token)
309+
def oauth_client(access_token: test_github_token)
310+
Octokit::Client.new(access_token: access_token)
304311
end
305312

306313
def enterprise_admin_client
@@ -321,6 +328,24 @@ def enterprise_admin_client
321328
client
322329
end
323330

331+
def http_cache_middleware_store
332+
@http_cache_middleware_store ||= Faraday::HttpCache::MemoryStore.new
333+
end
334+
335+
def oauth_client_with_http_cache_middleware(access_token: test_github_token)
336+
stack = Faraday::RackBuilder.new do |builder|
337+
builder.use Faraday::HttpCache, serializer: Marshal, store: http_cache_middleware_store, shared_cache: false
338+
builder.adapter Faraday.default_adapter
339+
end
340+
341+
client = oauth_client(access_token: access_token)
342+
343+
client.configure do |c|
344+
c.middleware = stack
345+
end
346+
client
347+
end
348+
324349
def enterprise_management_console_client
325350
stack = Faraday::RackBuilder.new do |builder|
326351
builder.request :multipart

0 commit comments

Comments
 (0)