diff options
author | Stan Hu <stanhu@gmail.com> | 2016-03-12 21:05:23 +0000 |
---|---|---|
committer | Stan Hu <stanhu@gmail.com> | 2016-03-12 21:05:23 +0000 |
commit | 74d7de81960e6d7037c5ae7d4ecd953ac6ea5deb (patch) | |
tree | f1fb527c31109bf1370c3f1e560e2ded7d87920c /lib | |
parent | 30ab290b2829b84f4abb9d18f9b907bb9212f445 (diff) | |
download | gitlab-ce-74d7de81960e6d7037c5ae7d4ecd953ac6ea5deb.tar.gz |
Revert "Revert "Merge branch 'support-go-subpackages' into 'master'
""
This reverts commit 5a586f364c5d2b866d6a074eff7996f05585b7d5
Diffstat (limited to 'lib')
-rw-r--r-- | lib/gitlab/middleware/go.rb | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/lib/gitlab/middleware/go.rb b/lib/gitlab/middleware/go.rb new file mode 100644 index 00000000000..50b0dd32380 --- /dev/null +++ b/lib/gitlab/middleware/go.rb @@ -0,0 +1,50 @@ +# 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) + request["go-get"].to_i == 1 && request.env["PATH_INFO"].present? + end + + def go_body(request) + base_url = Gitlab.config.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(/\Ahttps?:\/\//, '') + end + end + end +end |