internal/git/gittest/http_server.go (42 lines of code) (raw):
package gittest
import (
"context"
"net"
"net/http"
"net/http/cgi"
"os"
"path/filepath"
"testing"
"github.com/stretchr/testify/require"
"gitlab.com/gitlab-org/gitaly/v16/internal/git/gitcmd"
"gitlab.com/gitlab-org/gitaly/v16/internal/gitaly/storage/mode"
"gitlab.com/gitlab-org/gitaly/v16/internal/testhelper"
)
// HTTPServer starts an HTTP server with git-http-backend(1) as CGI handler. The repository is
// prepared such that git-http-backend(1) will serve it by creating the "git-daemon-export-ok" magic
// file.
func HTTPServer(tb testing.TB, ctx context.Context, gitCmdFactory gitcmd.CommandFactory, repoPath string, middleware func(http.ResponseWriter, *http.Request, http.Handler)) int {
require.NoError(tb, os.WriteFile(filepath.Join(repoPath, "git-daemon-export-ok"), nil, mode.File))
listener, err := net.Listen("tcp", "127.0.0.1:0")
require.NoError(tb, err)
gitExecEnv := gitCmdFactory.GetExecutionEnvironment(ctx)
gitHTTPBackend := &cgi.Handler{
Path: gitExecEnv.BinaryPath,
Dir: "/",
Args: []string{"http-backend"},
Env: append([]string{
"GIT_PROJECT_ROOT=" + filepath.Dir(repoPath),
"GIT_CONFIG_COUNT=1",
"GIT_CONFIG_KEY_0=http.receivepack",
"GIT_CONFIG_VALUE_0=true",
}, gitExecEnv.EnvironmentVariables...),
}
s := &http.Server{Handler: gitHTTPBackend}
tb.Cleanup(func() {
testhelper.MustClose(tb, s)
})
if middleware != nil {
s.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
middleware(w, r, gitHTTPBackend)
})
}
go testhelper.MustServe(tb, s, listener)
return listener.Addr().(*net.TCPAddr).Port
}