我想支持表格的要求:
go get acme.com/component
其中component
是存储在Bitbucket Server中的git项目,可通过以下方式检索:
git clone http://acme.dev:7600/scm/project/component
go 1.8客户端不知道如何根据go get
参数获取组件,因此它会执行HTTPS获取(根据https://golang.org/cmd/go/#hdr-Remote_import_paths):
https://acme.com/component?go-get=1
作为回应,它需要一个包含以下内容的HTTP 200:
<head>
<meta name="go-import" content="acme.com/component git http://acme.dev:7600/scm/project/component">
</head>
HAProxy很有吸引力,因为Bitbucket Server SSL终止程序使用它。它有一个monitor-uri hack,如果它检测到后端正在响应特定的URI,则返回HTTP响应,但我认为它不够灵活,无法处理不同的组件名称。
有没有人知道使用HAProxy处理此问题的方法,或者可能是NGinx等其他工具?
答案 0 :(得分:1)
根据您需要自定义响应的方式,只能使用通过Lua支持编译的HAProxy。在这里,使用HAProxy 1.6.12与Lua 5.3.4,我将获取请求路径并将其放入响应中,进行自定义 - 基本上任何路径都被复制。你可以如果您需要修改它,也可以使用string.gsub()
。
一个小的Lua脚本:
-- /etc/haproxy/lua/custom-response.lua
core.register_service("magic-endpoint", "http", function(applet)
local response =
"<head>\r\n" ..
" <meta name=\"go-import\" content=\"example.com" .. applet.path ..
" git http://example.dev:7600/scm/project" .. applet.path ..
"\">\r\n</head>\r\n";
applet:set_status(200);
applet:add_header("Content-Length", string.len(response));
applet:add_header("Content-Type", "text/whatevs");
applet:start_response();
applet:send(response);
end)
来自config的相关行。我只是使用主机名将请求路由到后端,但您当然可以使用您需要的任何逻辑来触发它。
-- /etc/haproxy.cfg
global
lua-load /etc/haproxy/lua/custom-response.lua
frontend main-frontend
mode http
bind :80
use_backend example if { hdr(host) -i example.com }
backend example
mode http
http-request use-service lua.magic-endpoint
并且,测试:
$ curl -v http://example.com/project1
* Hostname was NOT found in DNS cache
* Trying 127.0.0.1...
* Connected to example.com (127.0.0.1) port 80 (#0)
> GET /project1 HTTP/1.1
> User-Agent: curl/7.35.0
> Host: example.com
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: text/whatevs
< Content-Length: 124
<
<head>
<meta name="go-import" content="example.com/project1 git http://example.dev:7600/scm/project/project1">
</head>
似乎合法。
答案 1 :(得分:0)
出于对话的目的,并且因为灵活生成HTTP响应很有用,我尝试使用nginx - 切换到ssh。配置文件的非标准部分有一个规则,用于将go客户端指向Bitbucket服务器:
location ~ "^(/[^/]+)(/[^/]+)?" {
if ($arg_go-get = "1") {
return 200 '<html><head><meta name="go-import" content="acme.com$1$2 git ssh://acme.dev:7999$1$2"></head></html>';
}
}