Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStan Hu <stanhu@gmail.com>2016-03-12 12:09:37 +0300
committerStan Hu <stanhu@gmail.com>2016-03-12 12:09:37 +0300
commitcc065fbeaa8b5e480d6ba5349198042e8a84b011 (patch)
treec5a7c11a77438a49b7bd73fc43b827eb0a549937 /lib/gitlab/middleware
parentf7da99aef7044592d957df750dcf6e4185c51694 (diff)
Support Golang subpackage fetching
Closes #13805
Diffstat (limited to 'lib/gitlab/middleware')
-rw-r--r--lib/gitlab/middleware/go.rb51
1 files changed, 51 insertions, 0 deletions
diff --git a/lib/gitlab/middleware/go.rb b/lib/gitlab/middleware/go.rb
new file mode 100644
index 00000000000..bc9bee7cbb6
--- /dev/null
+++ b/lib/gitlab/middleware/go.rb
@@ -0,0 +1,51 @@
+# A dumb middleware that returns a Go HTML document if the go-get=1 query string
+# is used irrespective if the namespace/project exists
+module Gitlab
+ module Middleware
+ class Go
+ def initialize(app)
+ @app = app
+ end
+
+ def call(env)
+ request = Rack::Request.new(env)
+
+ if go_request?(request)
+ render_go_doc(request)
+ else
+ @app.call(env)
+ end
+ end
+
+ private
+
+ def render_go_doc(request)
+ body = go_body(request)
+ response = Rack::Response.new(body, 200, { 'Content-Type' => 'text/html' })
+ response.finish
+ end
+
+ def go_request?(request)
+ return request["go-get"].to_i == 1
+ end
+
+ def go_body(request)
+ base_url = Settings.gitlab['url']
+ # Go subpackages may be in the form of namespace/project/path1/path2/../pathN
+ # We can just ignore the paths and leave the namespace/project
+ path_info = request.env["PATH_INFO"]
+ path_info.sub!(/^\//, '')
+ project_path = path_info.split('/').first(2).join('/')
+ request_url = URI.join(base_url, project_path)
+ domain_path = strip_url(request_url.to_s)
+
+ "<!DOCTYPE html><html><head><meta content='#{domain_path} git #{request_url}.git' name='go-import'></head></html>\n";
+ end
+
+ def strip_url(url)
+ url.gsub('http://', '').
+ gsub('https://', '')
+ end
+ end
+ end
+end