diff options
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/git-lfs-server/main.go | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/cmd/git-lfs-server/main.go b/cmd/git-lfs-server/main.go index f264aa0..0e2ea80 100644 --- a/cmd/git-lfs-server/main.go +++ b/cmd/git-lfs-server/main.go | |||
@@ -5,6 +5,7 @@ import ( | |||
5 | "encoding/json" | 5 | "encoding/json" |
6 | "errors" | 6 | "errors" |
7 | "fmt" | 7 | "fmt" |
8 | "mime" | ||
8 | "net/http" | 9 | "net/http" |
9 | "net/http/cgi" | 10 | "net/http/cgi" |
10 | "net/url" | 11 | "net/url" |
@@ -124,7 +125,7 @@ type lfsError struct { | |||
124 | } | 125 | } |
125 | 126 | ||
126 | func makeRespError(w http.ResponseWriter, message string, code int) { | 127 | func makeRespError(w http.ResponseWriter, message string, code int) { |
127 | w.Header().Set("Content-Type", lfsMIME) | 128 | w.Header().Set("Content-Type", lfsMIME+"; charset=utf-8") |
128 | w.WriteHeader(code) | 129 | w.WriteHeader(code) |
129 | json.NewEncoder(w).Encode(lfsError{Message: message}) | 130 | json.NewEncoder(w).Encode(lfsError{Message: message}) |
130 | } | 131 | } |
@@ -190,6 +191,17 @@ type parsedBatchObject struct { | |||
190 | size uint64 | 191 | size uint64 |
191 | } | 192 | } |
192 | 193 | ||
194 | func isLFSMediaType(t string) bool { | ||
195 | if mediaType, params, err := mime.ParseMediaType(t); err == nil { | ||
196 | if mediaType == lfsMIME { | ||
197 | if params["charset"] == "" || strings.ToLower(params["charset"]) == "utf-8" { | ||
198 | return true | ||
199 | } | ||
200 | } | ||
201 | } | ||
202 | return false | ||
203 | } | ||
204 | |||
193 | func (h *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { | 205 | func (h *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { |
194 | submatches := re.FindStringSubmatch(r.URL.Path) | 206 | submatches := re.FindStringSubmatch(r.URL.Path) |
195 | if len(submatches) != 1 { | 207 | if len(submatches) != 1 { |
@@ -198,12 +210,12 @@ func (h *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { | |||
198 | } | 210 | } |
199 | repo := strings.TrimPrefix("/", path.Clean(submatches[0])) | 211 | repo := strings.TrimPrefix("/", path.Clean(submatches[0])) |
200 | 212 | ||
201 | if !slices.Contains(r.Header.Values("Accept"), lfsMIME) { | 213 | if !slices.ContainsFunc(r.Header.Values("Accept"), isLFSMediaType) { |
202 | makeRespError(w, "Expected "+lfsMIME+" in list of acceptable response media types", http.StatusNotAcceptable) | 214 | makeRespError(w, "Expected "+lfsMIME+" (with UTF-8 charset) in list of acceptable response media types", http.StatusNotAcceptable) |
203 | return | 215 | return |
204 | } | 216 | } |
205 | if r.Header.Get("Content-Type") != lfsMIME { | 217 | if !isLFSMediaType(r.Header.Get("Content-Type")) { |
206 | makeRespError(w, "Expected request Content-Type to be "+lfsMIME, http.StatusUnsupportedMediaType) | 218 | makeRespError(w, "Expected request Content-Type to be "+lfsMIME+" (with UTF-8 charset)", http.StatusUnsupportedMediaType) |
207 | return | 219 | return |
208 | } | 220 | } |
209 | 221 | ||