Fix several content type negotiation issues.

* No `Accept:` header should be the same as `Accept: */*`.
  * For unresolved reference error, `text/plain` should take priority.
This commit is contained in:
Catherine
2025-12-05 18:56:20 +00:00
parent bd44f65b51
commit 7313ab7d13
2 changed files with 5 additions and 2 deletions

View File

@@ -55,6 +55,9 @@ type HTTPContentTypes struct {
}
func ParseAcceptHeader(headerValue string) (result HTTPContentTypes) {
if headerValue == "" {
headerValue = "*/*"
}
result = HTTPContentTypes{parseGenericAcceptHeader(headerValue)}
return
}
@@ -65,7 +68,7 @@ func (e *HTTPContentTypes) Negotiate(offers ...string) string {
prefs[code] = 0
}
for _, ctyp := range e.contentTypes {
if ctyp.code == "*" || ctyp.code == "*/*" {
if ctyp.code == "*/*" {
for code := range prefs {
prefs[code] = ctyp.qval
}

View File

@@ -575,7 +575,7 @@ func patchPage(w http.ResponseWriter, r *http.Request) error {
func reportUpdateResult(w http.ResponseWriter, r *http.Request, result UpdateResult) error {
var unresolvedRefErr UnresolvedRefError
if result.outcome == UpdateError && errors.As(result.err, &unresolvedRefErr) {
offeredContentTypes := []string{"application/vnd.git-pages.unresolved", "text/plain"}
offeredContentTypes := []string{"text/plain", "application/vnd.git-pages.unresolved"}
acceptedContentTypes := ParseAcceptHeader(r.Header.Get("Accept"))
switch acceptedContentTypes.Negotiate(offeredContentTypes...) {
default: