java - 可以响应 git 命令的本地嵌入式 HTTP 服务器?

标签 java git http

我正在用 Java 构建一个 Git 客户端,并想编写自动化测试来验证在 HTTP(s) 服务器上运行的 Git 命令是否正确运行。我见过许多本地小型 Java HTTP 服务器,但我不清楚要使它们正确响应 Git 命令需要什么。我试图避免安装本地 HTTP 服务器,因为我希望这些自动化测试可以在任何地方运行。谁能指出我正确的方向?

仅供引用,对于 ssh 远程测试,我使用 sshd mina 系统并使用其内置的 GitPackCommandFactory 取得了巨大的成功。类似于 HTTP(s) 的东西会很棒。

最佳答案

git的智能HTTP协议(protocol)在git-http-backend中实现。这是一个 CGI 二进制文件,可以与一些网络服务器结合使用。不幸的是,它忽略了请求的内容长度并依赖服务器关闭其输入,这使得它与某些 CGI 服务器不兼容。

如果您有可用的 python,运行它的简单方法是使用 CGIHTTPServer。这个受上述不兼容性的影响。使用一个相当丑陋的解决方法,你仍然可以让它工作:

$ python -c 'import CGIHTTPServer; CGIHTTPServer.CGIHTTPRequestHandler.have_fork = False; CGIHTTPServer.test()' 8000

或者使用 python 3:

$ python3 -c 'import http.server; http.server.CGIHTTPRequestHandler.have_fork = False; http.server.test(HandlerClass=http.server.CGIHTTPRequestHandler, port=8000)'

这些将 CGIHTTPRequestHandler 的内部 have_fork 设置为 False,这导致实现使用子进程和管道而不是 fork 来运行 CGI 二进制文件.使用这种方法,传入的请求被缓冲并写入管道,然后管道被关闭。这符合 git-http-backend 的预期模型,因此可以正常工作。

如果您首先使用的是没有 fork 的系统(即 Windows),则不需要解决方法,可以直接使用:

$ python -m CGIHTTPServer 8000
$ python3 -m http.server --cgi 8000

这两种设置都要求 git-http-backendcgi-bin 目录下可用。最简单的设置是在裸 git 存储库中创建 cgi-bin 目录,符号链接(symbolic link)或将 git-http-backend 二进制文件复制到其中,然后从裸存储库启动服务器:

$ git clone --bare <repo> bare.git
$ cd bare.git
$ touch git-daemon-export-ok
$ mkdir cgi-bin
$ ln -s /usr/lib/git-core/git-http-backend cgi-bin/git
$ python -c 'import CGIHTTPServer; CGIHTTPServer.CGIHTTPRequestHandler.have_fork = False; CGIHTTPServer.test()' 8000

通过该设置,存储库位于 http://localhost:8000/cgi-bin/git 因为 git-http-backend 被符号链接(symbolic link)到 cgi-bin/git。所以下面应该工作:

$ git clone http://localhost:8000/cgi-bin/git clonedRepoName

允许 push 裸仓库使用:

$ git config http.receivepack true

可以使用适当的环境变量进行更高级的设置,提供多个存储库。由于环境由服务器继承并传递给 CGI 二进制文件,因此只需导出所需的环境变量即可。查看git-http-backend documentation所有可能的配置和环境变量。

关于java - 可以响应 git 命令的本地嵌入式 HTTP 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47758247/

相关文章:

java - 将 zip 文件转换为 war 文件

php - 在 PHP 中使用非阻塞流并行化 REST-Api 请求?

Angular Jasmine : Unit testing a method that is calling a service without doing actuall http call

java - 处理响应代码 : 403 for URL with clojure enlive

java - Eclipse插件开发: How to jump to Marker in the Source View from Problems View?

java - Chrome 和 Firefox 中的 httpServletResponse 行为

java - 是否可以在命令行中指定额外的 Maven 依赖项?

python - 从 python 克隆 git repo

git - 手工编辑的补丁文件归功于谁?

java - 使用同级 git 存储库进行 Heroku 部署