51 lines
1.4 KiB
Ruby
51 lines
1.4 KiB
Ruby
|
# 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
|