diff options
author | Stan Hu <stanhu@gmail.com> | 2017-12-24 09:35:30 -0800 |
---|---|---|
committer | Stan Hu <stanhu@gmail.com> | 2017-12-25 05:28:51 -0800 |
commit | a83c41f6c6e0035c40916b3cbdda7fdd4f7e925f (patch) | |
tree | ce0ed5b1113e9eec082b832f098504d4bb061d2e | |
parent | 5e6dd15a996f57d7a8760f4c9c1dbd7beeeaadff (diff) | |
download | gitlab-ce-a83c41f6c6e0035c40916b3cbdda7fdd4f7e925f.tar.gz |
Fix Error 500s with anonymous clones for a project that has moved
Closes #41457
-rw-r--r-- | changelogs/unreleased/sh-handle-anonymous-clones-project-moved.yml | 5 | ||||
-rw-r--r-- | lib/gitlab/checks/project_moved.rb | 13 | ||||
-rw-r--r-- | spec/lib/gitlab/checks/project_moved_spec.rb | 7 |
3 files changed, 22 insertions, 3 deletions
diff --git a/changelogs/unreleased/sh-handle-anonymous-clones-project-moved.yml b/changelogs/unreleased/sh-handle-anonymous-clones-project-moved.yml new file mode 100644 index 00000000000..a0860871152 --- /dev/null +++ b/changelogs/unreleased/sh-handle-anonymous-clones-project-moved.yml @@ -0,0 +1,5 @@ +--- +title: Fix Error 500s with anonymous clones for a project that has moved +merge_request: +author: +type: fixed diff --git a/lib/gitlab/checks/project_moved.rb b/lib/gitlab/checks/project_moved.rb index 3a1c0a3455e..c1da2471b54 100644 --- a/lib/gitlab/checks/project_moved.rb +++ b/lib/gitlab/checks/project_moved.rb @@ -2,6 +2,7 @@ module Gitlab module Checks class ProjectMoved REDIRECT_NAMESPACE = "redirect_namespace".freeze + ANONYMOUS_ID_KEY = 'anonymous'.freeze def initialize(project, user, redirected_path, protocol) @project = project @@ -22,7 +23,7 @@ module Gitlab def add_redirect_message Gitlab::Redis::SharedState.with do |redis| - key = self.class.redirect_message_key(user.id, project.id) + key = self.class.redirect_message_key(user_identifier, project.id) redis.setex(key, 5.minutes, redirect_message) end end @@ -45,8 +46,14 @@ module Gitlab attr_reader :project, :redirected_path, :protocol, :user - def self.redirect_message_key(user_id, project_id) - "#{REDIRECT_NAMESPACE}:#{user_id}:#{project_id}" + def self.redirect_message_key(user_identifier, project_id) + "#{REDIRECT_NAMESPACE}:#{user_identifier}:#{project_id}" + end + + def user_identifier + return ANONYMOUS_ID_KEY unless user.present? + + user.id end def remote_url_message(rejected) diff --git a/spec/lib/gitlab/checks/project_moved_spec.rb b/spec/lib/gitlab/checks/project_moved_spec.rb index fa1575e2177..3d72e78332d 100644 --- a/spec/lib/gitlab/checks/project_moved_spec.rb +++ b/spec/lib/gitlab/checks/project_moved_spec.rb @@ -35,6 +35,13 @@ describe Gitlab::Checks::ProjectMoved, :clean_gitlab_redis_shared_state do project_moved = described_class.new(project, user, 'foo/bar', 'http') expect(project_moved.add_redirect_message).to eq("OK") end + + it 'should handle anonymous clones' do + project_moved = described_class.new(project, nil, 'foo/bar', 'http') + + expect(project_moved.add_redirect_message).to eq("OK") + expect(Gitlab::Redis::SharedState.with { |redis| redis.get("redirect_namespace:anonymous:#{project.id}") }).not_to be_nil + end end describe '#redirect_message' do |