forked from tangled.org/core
this repo has no description

knotserver: git: improve protocol handling

- Disable caching of responses as suggested by documentation.
<https://git-scm.com/docs/http-protocol#_smart_server_response>
- Return plain-text errors so the git client will display them.
- Check Content-Type of upload-pack request.

Changed files
+12 -3
knotserver
+12 -3
knotserver/git.go
···
serviceName := r.URL.Query().Get("service")
switch serviceName {
case "git-upload-pack":
-
w.Header().Set("content-type", "application/x-git-upload-pack-advertisement")
+
w.Header().Set("Content-Type", "application/x-git-upload-pack-advertisement")
+
w.Header().Set("Connection", "Keep-Alive")
+
w.Header().Set("Cache-Control", "no-cache, max-age=0, must-revalidate")
w.WriteHeader(http.StatusOK)
if err := cmd.InfoRefs(); err != nil {
···
name := chi.URLParam(r, "name")
repo, err := securejoin.SecureJoin(d.c.Repo.ScanPath, filepath.Join(did, name))
if err != nil {
-
writeError(w, err.Error(), 500)
+
gitError(w, err.Error(), http.StatusInternalServerError)
d.l.Error("git: failed to secure join repo path", "handler", "UploadPack", "error", err)
return
}
+
const expectedContentType = "application/x-git-upload-pack-request"
+
contentType := r.Header.Get("Content-Type")
+
if contentType != expectedContentType {
+
gitError(w, fmt.Sprintf("Expected Content-Type: '%s', but received '%s'.", expectedContentType, contentType), http.StatusUnsupportedMediaType)
+
}
+
var bodyReader io.ReadCloser = r.Body
if r.Header.Get("Content-Encoding") == "gzip" {
gzipReader, err := gzip.NewReader(r.Body)
if err != nil {
-
writeError(w, err.Error(), 500)
+
gitError(w, err.Error(), http.StatusInternalServerError)
d.l.Error("git: failed to create gzip reader", "handler", "UploadPack", "error", err)
return
}
···
w.Header().Set("Content-Type", "application/x-git-upload-pack-result")
w.Header().Set("Connection", "Keep-Alive")
+
w.Header().Set("Cache-Control", "no-cache, max-age=0, must-revalidate")
d.l.Info("git: executing git-upload-pack", "handler", "UploadPack", "repo", repo)