@@ -14,10 +14,10 @@ import (
1414 "text/template"
1515 "time"
1616
17- "github.com/gorilla/mux"
1817 "github.com/k3s-io/k3s/pkg/daemons/config"
1918 "github.com/k3s-io/k3s/pkg/etcd/snapshot"
2019 "github.com/k3s-io/k3s/pkg/util"
20+ "github.com/k3s-io/k3s/pkg/util/mux"
2121 "github.com/k3s-io/k3s/tests/mock"
2222 "github.com/rancher/dynamiclistener/cert"
2323 "github.com/rancher/wrangler/v3/pkg/generated/controllers/core"
@@ -1554,65 +1554,72 @@ func s3Router(t *testing.T) http.Handler {
15541554 // badbucket returns 404 for all requests
15551555 // authbucket returns 200 for HeadBucket, 403 for all others
15561556 // others return 200 for objects with name prefix snapshot, 404 for all others
1557- router := mux .NewRouter (). SkipClean ( true )
1557+ router := mux .NewRouter ()
15581558 // HeadBucket
1559- router .Path ("/{bucket}/" ).Methods (http .MethodHead ).HandlerFunc (func (rw http.ResponseWriter , r * http.Request ) {
1560- vars := mux .Vars (r )
1561- if vars ["bucket" ] == "badbucket" {
1562- rw .WriteHeader (http .StatusNotFound )
1563- }
1564- })
15651559 // ListObjectsV2
1566- router .Path ("/{bucket}/" ).Methods (http .MethodGet ).HandlerFunc (func (rw http.ResponseWriter , r * http.Request ) {
1567- vars := mux .Vars (r )
1568- switch vars ["bucket" ] {
1569- case "badbucket" :
1570- rw .WriteHeader (http .StatusNotFound )
1571- case "authbucket" :
1572- rw .WriteHeader (http .StatusForbidden )
1573- default :
1574- prefix := r .URL .Query ().Get ("prefix" )
1575- filtered := []object {}
1576- for _ , object := range objects {
1577- if strings .HasPrefix (object .Key , prefix ) {
1578- filtered = append (filtered , object )
1579- }
1560+ router .HandleFunc ("GET /{bucket}/{$}" , func (rw http.ResponseWriter , r * http.Request ) {
1561+ switch r .Method {
1562+ case http .MethodHead :
1563+ if r .PathValue ("bucket" ) == "badbucket" {
1564+ rw .WriteHeader (http .StatusNotFound )
15801565 }
1581- if err := listResponse .Execute (rw , bucket {Name : vars ["bucket" ], Prefix : prefix , Objects : filtered }); err != nil {
1582- t .Errorf ("Failed to generate ListObjectsV2 response, error = %v" , err )
1583- rw .WriteHeader (http .StatusInternalServerError )
1566+ case http .MethodGet :
1567+ switch r .PathValue ("bucket" ) {
1568+ case "badbucket" :
1569+ rw .WriteHeader (http .StatusNotFound )
1570+ case "authbucket" :
1571+ rw .WriteHeader (http .StatusForbidden )
1572+ default :
1573+ prefix := r .URL .Query ().Get ("prefix" )
1574+ filtered := []object {}
1575+ for _ , object := range objects {
1576+ if strings .HasPrefix (object .Key , prefix ) {
1577+ filtered = append (filtered , object )
1578+ }
1579+ }
1580+ if err := listResponse .Execute (rw , bucket {Name : r .PathValue ("bucket" ), Prefix : prefix , Objects : filtered }); err != nil {
1581+ t .Errorf ("Failed to generate ListObjectsV2 response, error = %v" , err )
1582+ rw .WriteHeader (http .StatusInternalServerError )
1583+ }
15841584 }
15851585 }
15861586 })
1587- // HeadObject - snapshot
1588- router .Path ("/{bucket}/{prefix:.*}snapshot-{snapshot}" ).Methods (http .MethodHead ).HandlerFunc (func (rw http.ResponseWriter , r * http.Request ) {
1589- vars := mux .Vars (r )
1590- switch vars ["bucket" ] {
1591- case "badbucket" :
1592- rw .WriteHeader (http .StatusNotFound )
1593- case "authbucket" :
1594- rw .WriteHeader (http .StatusForbidden )
1595- default :
1596- rw .Header ().Add ("last-modified" , time .Now ().In (gmt ).Format (time .RFC1123 ))
1597- }
1598- })
1599- // GetObject - snapshot
1600- router .Path ("/{bucket}/{prefix:.*}snapshot-{snapshot}" ).Methods (http .MethodGet ).HandlerFunc (func (rw http.ResponseWriter , r * http.Request ) {
1601- vars := mux .Vars (r )
1602- switch vars ["bucket" ] {
1603- case "badbucket" :
1604- rw .WriteHeader (http .StatusNotFound )
1605- case "authbucket" :
1606- rw .WriteHeader (http .StatusForbidden )
1607- default :
1608- rw .Header ().Add ("last-modified" , time .Now ().In (gmt ).Format (time .RFC1123 ))
1609- rw .Write ([]byte ("test snapshot file\n " ))
1587+ // HeadObject
1588+ // GetObject
1589+ router .HandleFunc ("GET /{bucket}/{object...}" , func (rw http.ResponseWriter , r * http.Request ) {
1590+ switch r .Method {
1591+ case http .MethodHead :
1592+ switch r .PathValue ("bucket" ) {
1593+ case "badbucket" :
1594+ rw .WriteHeader (http .StatusNotFound )
1595+ case "authbucket" :
1596+ rw .WriteHeader (http .StatusForbidden )
1597+ default :
1598+ if strings .Contains (r .PathValue ("object" ), "bad" ) {
1599+ rw .WriteHeader (http .StatusNotFound )
1600+ } else {
1601+ rw .Header ().Add ("last-modified" , time .Now ().In (gmt ).Format (time .RFC1123 ))
1602+ }
1603+ }
1604+ case http .MethodGet :
1605+ switch r .PathValue ("bucket" ) {
1606+ case "badbucket" :
1607+ rw .WriteHeader (http .StatusNotFound )
1608+ case "authbucket" :
1609+ rw .WriteHeader (http .StatusForbidden )
1610+ default :
1611+ if strings .Contains (r .PathValue ("object" ), "bad" ) {
1612+ rw .WriteHeader (http .StatusNotFound )
1613+ } else {
1614+ rw .Header ().Add ("last-modified" , time .Now ().In (gmt ).Format (time .RFC1123 ))
1615+ rw .Write ([]byte ("test snapshot file\n " ))
1616+ }
1617+ }
16101618 }
16111619 })
1612- // PutObject/DeleteObject - snapshot
1613- router .Path ("/{bucket}/{prefix:.*}snapshot-{snapshot}" ).Methods (http .MethodPut , http .MethodDelete ).HandlerFunc (func (rw http.ResponseWriter , r * http.Request ) {
1614- vars := mux .Vars (r )
1615- switch vars ["bucket" ] {
1620+ // PutObject
1621+ router .HandleFunc ("PUT /{bucket}/{object...}" , func (rw http.ResponseWriter , r * http.Request ) {
1622+ switch r .PathValue ("bucket" ) {
16161623 case "badbucket" :
16171624 rw .WriteHeader (http .StatusNotFound )
16181625 case "authbucket" :
@@ -1623,45 +1630,27 @@ func s3Router(t *testing.T) http.Handler {
16231630 }
16241631 }
16251632 })
1626- // HeadObject - snapshot metadata
1627- router .Path ("/{bucket}/{prefix:.*}.metadata/snapshot-{snapshot}" ).Methods (http .MethodHead ).HandlerFunc (func (rw http.ResponseWriter , r * http.Request ) {
1628- vars := mux .Vars (r )
1629- switch vars ["bucket" ] {
1630- case "badbucket" :
1631- rw .WriteHeader (http .StatusNotFound )
1632- case "authbucket" :
1633- rw .WriteHeader (http .StatusForbidden )
1634- default :
1635- rw .Header ().Add ("last-modified" , time .Now ().In (gmt ).Format (time .RFC1123 ))
1636- }
1637- })
1638- // GetObject - snapshot metadata
1639- router .Path ("/{bucket}/{prefix:.*}.metadata/snapshot-{snapshot}" ).Methods (http .MethodGet ).HandlerFunc (func (rw http.ResponseWriter , r * http.Request ) {
1640- vars := mux .Vars (r )
1641- switch vars ["bucket" ] {
1642- case "badbucket" :
1643- rw .WriteHeader (http .StatusNotFound )
1644- case "authbucket" :
1645- rw .WriteHeader (http .StatusForbidden )
1646- default :
1647- rw .Header ().Add ("last-modified" , time .Now ().In (gmt ).Format (time .RFC1123 ))
1648- rw .Write ([]byte ("test snapshot metadata\n " ))
1649- }
1650- })
1651- // PutObject/DeleteObject - snapshot metadata
1652- router .Path ("/{bucket}/{prefix:.*}.metadata/snapshot-{snapshot}" ).Methods (http .MethodPut , http .MethodDelete ).HandlerFunc (func (rw http.ResponseWriter , r * http.Request ) {
1653- vars := mux .Vars (r )
1654- switch vars ["bucket" ] {
1633+ // DeleteObject
1634+ router .HandleFunc ("DELETE /{bucket}/{object...}" , func (rw http.ResponseWriter , r * http.Request ) {
1635+ switch r .PathValue ("bucket" ) {
16551636 case "badbucket" :
16561637 rw .WriteHeader (http .StatusNotFound )
16571638 case "authbucket" :
16581639 rw .WriteHeader (http .StatusForbidden )
16591640 default :
16601641 if r .Method == http .MethodDelete {
1661- rw .WriteHeader (http .StatusNoContent )
1642+ if strings .Contains (r .PathValue ("object" ), "bad" ) {
1643+ rw .WriteHeader (http .StatusNotFound )
1644+ } else {
1645+ rw .WriteHeader (http .StatusNoContent )
1646+ }
16621647 }
16631648 }
16641649 })
1650+ router .NotFoundHandler = http .HandlerFunc (func (rw http.ResponseWriter , r * http.Request ) {
1651+ logrus .Errorf ("Failed to match %q" , r .URL )
1652+ rw .WriteHeader (http .StatusInternalServerError )
1653+ })
16651654 return http .HandlerFunc (func (rw http.ResponseWriter , r * http.Request ) {
16661655 scheme := "http"
16671656 if r .TLS != nil {
0 commit comments