summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStan Hu <stanhu@gmail.com>2017-12-24 09:35:30 -0800
committerStan Hu <stanhu@gmail.com>2017-12-25 05:28:51 -0800
commita83c41f6c6e0035c40916b3cbdda7fdd4f7e925f (patch)
treece0ed5b1113e9eec082b832f098504d4bb061d2e
parent5e6dd15a996f57d7a8760f4c9c1dbd7beeeaadff (diff)
downloadgitlab-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.yml5
-rw-r--r--lib/gitlab/checks/project_moved.rb13
-rw-r--r--spec/lib/gitlab/checks/project_moved_spec.rb7
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