|
|
|
@ -277,11 +277,56 @@ func HTTP(ctx *context.Context) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
HTTPBackend(ctx, &serviceConfig{ |
|
|
|
|
w := ctx.Resp |
|
|
|
|
r := ctx.Req.Request |
|
|
|
|
cfg := &serviceConfig{ |
|
|
|
|
UploadPack: true, |
|
|
|
|
ReceivePack: true, |
|
|
|
|
Env: environ, |
|
|
|
|
})(ctx.Resp, ctx.Req.Request) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for _, route := range routes { |
|
|
|
|
r.URL.Path = strings.ToLower(r.URL.Path) // blue: In case some repo name has upper case name
|
|
|
|
|
if m := route.reg.FindStringSubmatch(r.URL.Path); m != nil { |
|
|
|
|
if setting.Repository.DisableHTTPGit { |
|
|
|
|
w.WriteHeader(http.StatusForbidden) |
|
|
|
|
_, err := w.Write([]byte("Interacting with repositories by HTTP protocol is not allowed")) |
|
|
|
|
if err != nil { |
|
|
|
|
log.Error(err.Error()) |
|
|
|
|
} |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
if route.method != r.Method { |
|
|
|
|
if r.Proto == "HTTP/1.1" { |
|
|
|
|
w.WriteHeader(http.StatusMethodNotAllowed) |
|
|
|
|
_, err := w.Write([]byte("Method Not Allowed")) |
|
|
|
|
if err != nil { |
|
|
|
|
log.Error(err.Error()) |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
w.WriteHeader(http.StatusBadRequest) |
|
|
|
|
_, err := w.Write([]byte("Bad Request")) |
|
|
|
|
if err != nil { |
|
|
|
|
log.Error(err.Error()) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
file := strings.Replace(r.URL.Path, m[1]+"/", "", 1) |
|
|
|
|
dir, err := getGitRepoPath(m[1]) |
|
|
|
|
if err != nil { |
|
|
|
|
log.Error(err.Error()) |
|
|
|
|
ctx.NotFound("Smart Git HTTP", err) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
route.handler(serviceHandler{cfg, w, r, dir, file, cfg.Env}) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ctx.NotFound("Smart Git HTTP", nil) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type serviceConfig struct { |
|
|
|
@ -522,51 +567,3 @@ func getGitRepoPath(subdir string) (string, error) { |
|
|
|
|
|
|
|
|
|
return fpath, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// HTTPBackend middleware for git smart HTTP protocol
|
|
|
|
|
func HTTPBackend(ctx *context.Context, cfg *serviceConfig) http.HandlerFunc { |
|
|
|
|
return func(w http.ResponseWriter, r *http.Request) { |
|
|
|
|
for _, route := range routes { |
|
|
|
|
r.URL.Path = strings.ToLower(r.URL.Path) // blue: In case some repo name has upper case name
|
|
|
|
|
if m := route.reg.FindStringSubmatch(r.URL.Path); m != nil { |
|
|
|
|
if setting.Repository.DisableHTTPGit { |
|
|
|
|
w.WriteHeader(http.StatusForbidden) |
|
|
|
|
_, err := w.Write([]byte("Interacting with repositories by HTTP protocol is not allowed")) |
|
|
|
|
if err != nil { |
|
|
|
|
log.Error(err.Error()) |
|
|
|
|
} |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
if route.method != r.Method { |
|
|
|
|
if r.Proto == "HTTP/1.1" { |
|
|
|
|
w.WriteHeader(http.StatusMethodNotAllowed) |
|
|
|
|
_, err := w.Write([]byte("Method Not Allowed")) |
|
|
|
|
if err != nil { |
|
|
|
|
log.Error(err.Error()) |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
w.WriteHeader(http.StatusBadRequest) |
|
|
|
|
_, err := w.Write([]byte("Bad Request")) |
|
|
|
|
if err != nil { |
|
|
|
|
log.Error(err.Error()) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
file := strings.Replace(r.URL.Path, m[1]+"/", "", 1) |
|
|
|
|
dir, err := getGitRepoPath(m[1]) |
|
|
|
|
if err != nil { |
|
|
|
|
log.Error(err.Error()) |
|
|
|
|
ctx.NotFound("HTTPBackend", err) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
route.handler(serviceHandler{cfg, w, r, dir, file, cfg.Env}) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ctx.NotFound("HTTPBackend", nil) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|