From 4c1185492766f9b112809575271a609f7b246619 Mon Sep 17 00:00:00 2001 From: jordi collell Date: Sat, 9 May 2015 08:11:02 +0200 Subject: [PATCH] added header match and a new failing test --- middleware/basicauth/basicauth.go | 1 - middleware/basicauth/basicauth_test.go | 64 ++++++++++++++++++++++++-- 2 files changed, 59 insertions(+), 6 deletions(-) diff --git a/middleware/basicauth/basicauth.go b/middleware/basicauth/basicauth.go index 0ab92437..de29b8d9 100644 --- a/middleware/basicauth/basicauth.go +++ b/middleware/basicauth/basicauth.go @@ -31,7 +31,6 @@ func (a BasicAuth) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error // Check credentials if !ok || username != rule.Username || password != rule.Password { w.Header().Set("WWW-Authenticate", "Basic") - w.WriteHeader(http.StatusUnauthorized) return http.StatusUnauthorized, nil } diff --git a/middleware/basicauth/basicauth_test.go b/middleware/basicauth/basicauth_test.go index 6ba34b65..04d9fc83 100644 --- a/middleware/basicauth/basicauth_test.go +++ b/middleware/basicauth/basicauth_test.go @@ -26,7 +26,6 @@ func TestBasicAuth(t *testing.T) { }{ {"/testing", http.StatusUnauthorized, "ttest:test"}, {"/testing", http.StatusOK, "test:ttest"}, - {"/testing", http.StatusUnauthorized, ""}, } @@ -51,16 +50,71 @@ func TestBasicAuth(t *testing.T) { t.Errorf("Test %d: Expected Header '%d' but was '%d'", i, test.result, result) } - - if rec.Code != test.result { - t.Errorf("Test %d: Expected Header '%d' but was '%d'", - i, test.result, rec.Code) + if result == http.StatusUnauthorized { + headers := rec.Header() + if val, ok := headers["Www-Authenticate"]; ok { + if val[0] != "Basic" { + t.Errorf("Test %d, Www-Authenticate should be %s provided %s", i, "Basic", val[0]) + } + } else { + t.Errorf("Test %d, should provide a header Www-Authenticate", i) + } } + } } + +func TestMultipleOverlappingRules(t *testing.T) { + rw := BasicAuth{ + Next: middleware.HandlerFunc(contentHandler), + Rules: []Rule{ + {Username: "t", Password: "p1", Resources: []string{"/t"}}, + {Username: "t1", Password: "p2", Resources: []string{"/t/t"}}, + }, + } + + tests := []struct { + from string + result int + cred string + }{ + {"/t", http.StatusOK, "t:p1"}, + {"/t/t", http.StatusOK, "t:p1"}, + {"/t/t", http.StatusOK, "t1:p2"}, + + } + + + for i, test := range tests { + + + req, err := http.NewRequest("GET", test.from, nil) + if err != nil { + t.Fatalf("Test %d: Could not create HTTP request %v", i, err) + } + auth := "Basic " + base64.StdEncoding.EncodeToString([]byte(test.cred)) + req.Header.Set("Authorization", auth) + + rec := httptest.NewRecorder() + result, err := rw.ServeHTTP(rec, req) + if err != nil { + t.Fatalf("Test %d: Could not ServeHTTP %v", i, err) + } + if result != test.result { + t.Errorf("Test %d: Expected Header '%d' but was '%d'", + i, test.result, result) + } + + + } + +} + + + func contentHandler(w http.ResponseWriter, r *http.Request) (int, error) { fmt.Fprintf(w, r.URL.String()) return http.StatusOK, nil