我目前正在尝试在没有现有 Web 服务器的情况下用 C 创建一个简单的 Git HTTP 服务器。目前我唯一要做的就是创建一个服务器套接字并使用来自客户端请求的环境变量执行 git-http-backend CGI 脚本。拉取请求已经有效,但仅适用于空存储库。当我尝试使用内容克隆存储库时,我在客户端收到此错误:
fatal: protocol error: bad line length character:
这是客户端和服务器之间的通信日志:
C: GET /test.git/info/refs?service=git-upload-pack HTTP/1.1
C: Host: localhost:9000
C: User-Agent: git/2.20.1
C: Accept: */*
C: Accept-Encoding: deflate, gzip
C: Accept-Language: en-US, *;q=0.9
C: Pragma: no-cache
C:
S: HTTP/1.1 200 OK
S: Expires: Fri, 01 Jan 1980 00:00:00 GMT
S: Pragma: no-cache
S: Cache-Control: no-cache, max-age=0, must-revalidate
S: Content-Type: application/x-git-upload-pack-advertisement
S:
S: 001e# service=git-upload-pack
S: 000000fadd3fba560f4afe000e70464ac3a7a9991ad13eb0
S: HEAD003fdd3fba560f4afe000e70464ac3a7a9991ad13eb0 refs/heads/master
S: 0000
只是一点点说明:HTTP/1.1 200 OK 是手动添加的,其余的来自 CGI 脚本。你也可以在这里找到我的代码。首先我有这样的理论,服务器响应的内容有新行的错误放置(例如 HEAD 应该是更高的一行),但事实并非如此。所以我的问题是:有什么我能做的吗?在 C 中将这个响应编辑成一个好的格式是相当复杂的,尤其是对于较长的响应。