diff --git a/views.go b/views.go index 17f4a60..1aa3306 100644 --- a/views.go +++ b/views.go @@ -219,7 +219,7 @@ func resolveResponseContentType(r *http.Request, types []string) (string, error) if len(types) == 0 { return "", nil } - acceptHeader := r.Header.Get("Accept") + acceptHeader := strings.TrimSpace(r.Header.Get("Accept")) if acceptHeader == "" { return types[0], nil } @@ -237,7 +237,7 @@ func resolveResponseContentType(r *http.Request, types []string) (string, error) choiceParts := strings.Split(avString, ";") mediaRange := acceptHeaderMediaRangeRegex.FindStringSubmatch(choiceParts[0]) if mediaRange == nil { - return "", fmt.Errorf("bad media-range (\"%v\")", choiceParts[0]) + return "", fmt.Errorf("bad media-range ('%v')", choiceParts[0]) } av.Type = mediaRange[1] av.Subtype = mediaRange[2] @@ -262,7 +262,7 @@ func resolveResponseContentType(r *http.Request, types []string) (string, error) // Check if this parameter is still invalid in any case acceptParams := acceptHeaderAcceptParamsRegex.FindStringSubmatchIndex(choiceParts[0]) if acceptParams == nil { - return "", fmt.Errorf("bad accept-params (\"%v\")", choiceParts[0]) + return "", fmt.Errorf("bad accept-params ('%v')", choiceParts[0]) } } avs[i] = av diff --git a/views_test.go b/views_test.go index 030ff83..3d756c2 100644 --- a/views_test.go +++ b/views_test.go @@ -20,6 +20,24 @@ func resolveResponseContentTypeSuccess(t *testing.T, expected string, types []st } } +func resolveResponseContentTypeError(t *testing.T, expected string, types []string, acceptVal string) { + r, err := http.NewRequest("HEAD", "", nil) + if err != nil { + panic(err) + } + r.Header.Set("Accept", acceptVal) + got, err := resolveResponseContentType(r, types) + if err == nil { + t.Errorf("expected an error, but got a success: '%v'", got) + } + if got != "" { + t.Errorf("error: return value should be empty, not '%v'", got) + } + if err.Error() != expected { + t.Errorf("wrong error value error: got '%v', want '%v'\n", got, expected) + } +} + func TestResolveResponseContentType(t *testing.T) { resolveResponseContentTypeSuccess(t, "", []string{}, "text/html") resolveResponseContentTypeSuccess(t, "text/html", []string{"text/html"}, "") @@ -30,4 +48,7 @@ func TestResolveResponseContentType(t *testing.T) { // Issue #17 resolveResponseContentTypeSuccess(t, "*/*", []string{"*/*"}, "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3") + + // Issue #66 + resolveResponseContentTypeError(t, "bad media-range ('*')", []string{"text/plain"}, " *") }