diff --git a/cmd/incusd/api.go b/cmd/incusd/api.go index 72d0990262f..4daf34462c4 100644 --- a/cmd/incusd/api.go +++ b/cmd/incusd/api.go @@ -12,8 +12,6 @@ import ( "strings" "time" - "github.com/gorilla/mux" - clusterConfig "github.com/lxc/incus/v6/internal/server/cluster/config" clusterRequest "github.com/lxc/incus/v6/internal/server/cluster/request" "github.com/lxc/incus/v6/internal/server/db" @@ -66,17 +64,14 @@ import ( // example: ["/1.0"] func restServer(d *Daemon) *http.Server { /* Setup the web server */ - router := mux.NewRouter() - router.StrictSlash(false) // Don't redirect to URL with trailing slash. - router.SkipClean(true) - router.UseEncodedPath() // Allow encoded values in path segments. + router := http.NewServeMux() // Serving the UI. uiPath := os.Getenv("INCUS_UI") uiEnabled := uiPath != "" && util.PathExists(fmt.Sprintf("%s/index.html", uiPath)) if uiEnabled { uiHttpDir := uiHttpDir{http.Dir(uiPath)} - router.PathPrefix("/ui/").Handler(http.StripPrefix("/ui/", http.FileServer(uiHttpDir))) + router.Handle("/ui/", http.FileServer(uiHttpDir)) router.HandleFunc("/ui", func(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, "/ui/", http.StatusMovedPermanently) }) @@ -87,7 +82,7 @@ func restServer(d *Daemon) *http.Server { docEnabled := documentationPath != "" && util.PathExists(documentationPath) if docEnabled { documentationHttpDir := documentationHttpDir{http.Dir(documentationPath)} - router.PathPrefix("/documentation/").Handler(http.StripPrefix("/documentation/", http.FileServer(documentationHttpDir))) + router.Handle("/documentation/", http.FileServer(documentationHttpDir)) router.HandleFunc("/documentation", func(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, "/documentation/", http.StatusMovedPermanently) }) @@ -166,14 +161,14 @@ func restServer(d *Daemon) *http.Server { d.createCmd(router, "", c) } - router.NotFoundHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + notFoundHandler := func(w http.ResponseWriter, r *http.Request) { logger.Info("Sending top level 404", logger.Ctx{"url": r.URL, "method": r.Method, "remote": r.RemoteAddr}) w.Header().Set("Content-Type", "application/json") _ = response.NotFound(nil).Render(w) - }) + } return &http.Server{ - Handler: &httpServer{r: router, d: d}, + Handler: &httpServer{r: router, d: d, n: notFoundHandler}, ConnContext: request.SaveConnectionInContext, IdleTimeout: 30 * time.Second, } @@ -203,9 +198,7 @@ func vSockServer(d *Daemon) *http.Server { func metricsServer(d *Daemon) *http.Server { /* Setup the web server */ - router := mux.NewRouter() - router.StrictSlash(false) - router.SkipClean(true) + router := http.NewServeMux() router.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") @@ -219,20 +212,18 @@ func metricsServer(d *Daemon) *http.Server { d.createCmd(router, "1.0", api10Cmd) d.createCmd(router, "1.0", metricsCmd) - router.NotFoundHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + notFoundHandler := func(w http.ResponseWriter, r *http.Request) { logger.Info("Sending top level 404", logger.Ctx{"url": r.URL, "method": r.Method, "remote": r.RemoteAddr}) w.Header().Set("Content-Type", "application/json") _ = response.NotFound(nil).Render(w) - }) + } - return &http.Server{Handler: &httpServer{r: router, d: d}} + return &http.Server{Handler: &httpServer{r: router, d: d, n: notFoundHandler}} } func storageBucketsServer(d *Daemon) *http.Server { /* Setup the web server */ - router := mux.NewRouter() - router.StrictSlash(false) - router.SkipClean(true) + router := http.NewServeMux() router.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { // Wait until daemon is fully started. @@ -294,7 +285,7 @@ func storageBucketsServer(d *Daemon) *http.Server { }) // We use the NotFoundHandler to reverse proxy requests to dynamically started local MinIO processes. - router.NotFoundHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + notFoundHandler := func(w http.ResponseWriter, r *http.Request) { // Wait until daemon is fully started. <-d.waitReady.Done() @@ -364,14 +355,15 @@ func storageBucketsServer(d *Daemon) *http.Server { rproxy := httputil.NewSingleHostReverseProxy(&u) rproxy.ServeHTTP(w, r) - }) + } - return &http.Server{Handler: &httpServer{r: router, d: d}} + return &http.Server{Handler: &httpServer{r: router, d: d, n: notFoundHandler}} } type httpServer struct { - r *mux.Router + r *http.ServeMux d *Daemon + n func(w http.ResponseWriter, r *http.Request) } func (s *httpServer) ServeHTTP(rw http.ResponseWriter, req *http.Request) { @@ -390,6 +382,16 @@ func (s *httpServer) ServeHTTP(rw http.ResponseWriter, req *http.Request) { return } + // Execute NotFound function if defined + if s.n != nil { + _, pattern := s.r.Handler(req) + // Empty pattern = no Handler for this request + if pattern == "" { + s.n(rw, req) + return + } + } + // Call the original server s.r.ServeHTTP(rw, req) } diff --git a/cmd/incusd/api_1.0.go b/cmd/incusd/api_1.0.go index aa9d2a1b764..028905953d5 100644 --- a/cmd/incusd/api_1.0.go +++ b/cmd/incusd/api_1.0.go @@ -76,10 +76,7 @@ var api10 = []APIEndpoint{ imageAliasCmd, imageAliasesCmd, imageCmd, - imageExportCmd, - imageRefreshCmd, imagesCmd, - imageSecretCmd, metadataConfigurationCmd, networkCmd, networkLeasesCmd, diff --git a/cmd/incusd/api_cluster.go b/cmd/incusd/api_cluster.go index 70c4cac1fa7..18a2c99a559 100644 --- a/cmd/incusd/api_cluster.go +++ b/cmd/incusd/api_cluster.go @@ -16,8 +16,6 @@ import ( "sync" "time" - "github.com/gorilla/mux" - incus "github.com/lxc/incus/v6/client" "github.com/lxc/incus/v6/internal/filter" internalInstance "github.com/lxc/incus/v6/internal/instance" @@ -1503,7 +1501,7 @@ func clusterNodesPost(d *Daemon, r *http.Request) response.Response { func clusterNodeGet(d *Daemon, r *http.Request) response.Response { s := d.State() - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -1639,7 +1637,7 @@ func clusterNodePut(d *Daemon, r *http.Request) response.Response { // updateClusterNode is shared between clusterNodePut and clusterNodePatch. func updateClusterNode(s *state.State, gateway *cluster.Gateway, r *http.Request, isPatch bool) response.Response { - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -1945,7 +1943,7 @@ func clusterValidateConfig(config map[string]string) error { func clusterNodePost(d *Daemon, r *http.Request) response.Response { s := d.State() - memberName, err := url.PathUnescape(mux.Vars(r)["name"]) + memberName, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -2022,7 +2020,7 @@ func clusterNodeDelete(d *Daemon, r *http.Request) response.Response { pending = 0 } - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -2801,7 +2799,7 @@ func clusterCheckNetworksMatch(ctx context.Context, clusterDB *db.Cluster, reqNe func internalClusterRaftNodeDelete(d *Daemon, r *http.Request) response.Response { s := d.State() - address, err := url.PathUnescape(mux.Vars(r)["address"]) + address, err := url.PathUnescape(r.PathValue("address")) if err != nil { return response.SmartError(err) } @@ -2854,7 +2852,7 @@ func internalClusterRaftNodeDelete(d *Daemon, r *http.Request) response.Response // "500": // $ref: "#/responses/InternalServerError" func clusterNodeStateGet(d *Daemon, r *http.Request) response.Response { - memberName, err := url.PathUnescape(mux.Vars(r)["name"]) + memberName, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -2903,7 +2901,7 @@ func clusterNodeStateGet(d *Daemon, r *http.Request) response.Response { // "500": // $ref: "#/responses/InternalServerError" func clusterNodeStatePost(d *Daemon, r *http.Request) response.Response { - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/api_cluster_evacuation.go b/cmd/incusd/api_cluster_evacuation.go index 6cbcf33c792..aa2fa47d5ea 100644 --- a/cmd/incusd/api_cluster_evacuation.go +++ b/cmd/incusd/api_cluster_evacuation.go @@ -13,8 +13,6 @@ import ( "strings" "time" - "github.com/gorilla/mux" - "golang.org/x/sync/errgroup" incus "github.com/lxc/incus/v6/client" @@ -261,7 +259,7 @@ func evacuateInstancesFunc(ctx context.Context, inst instance.Instance, opts eva func restoreClusterMember(d *Daemon, r *http.Request) response.Response { s := d.State() - originName, err := url.PathUnescape(mux.Vars(r)["name"]) + originName, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/api_cluster_group.go b/cmd/incusd/api_cluster_group.go index f09256c1507..08a57646349 100644 --- a/cmd/incusd/api_cluster_group.go +++ b/cmd/incusd/api_cluster_group.go @@ -10,8 +10,6 @@ import ( "slices" "strings" - "github.com/gorilla/mux" - "github.com/lxc/incus/v6/internal/server/auth" "github.com/lxc/incus/v6/internal/server/db" dbCluster "github.com/lxc/incus/v6/internal/server/db/cluster" @@ -317,7 +315,7 @@ func clusterGroupsGet(d *Daemon, r *http.Request) response.Response { func clusterGroupGet(d *Daemon, r *http.Request) response.Response { s := d.State() - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -393,7 +391,7 @@ func clusterGroupGet(d *Daemon, r *http.Request) response.Response { func clusterGroupPost(d *Daemon, r *http.Request) response.Response { s := d.State() - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -490,7 +488,7 @@ func clusterGroupPost(d *Daemon, r *http.Request) response.Response { func clusterGroupPut(d *Daemon, r *http.Request) response.Response { s := d.State() - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -661,7 +659,7 @@ func clusterGroupPut(d *Daemon, r *http.Request) response.Response { func clusterGroupPatch(d *Daemon, r *http.Request) response.Response { s := d.State() - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -861,7 +859,7 @@ func clusterGroupPatch(d *Daemon, r *http.Request) response.Response { func clusterGroupDelete(d *Daemon, r *http.Request) response.Response { s := d.State() - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/api_internal.go b/cmd/incusd/api_internal.go index 2dfcbd561b8..81f57ad79b0 100644 --- a/cmd/incusd/api_internal.go +++ b/cmd/incusd/api_internal.go @@ -18,7 +18,6 @@ import ( "strconv" "strings" - "github.com/gorilla/mux" "golang.org/x/sys/unix" internalInstance "github.com/lxc/incus/v6/internal/instance" @@ -338,7 +337,7 @@ func internalShutdown(d *Daemon, r *http.Request) response.Response { // It detects whether the instance reference is an instance ID or instance name and loads instance accordingly. func internalContainerHookLoadFromReference(s *state.State, r *http.Request) (instance.Instance, error) { var inst instance.Instance - instanceRef, err := url.PathUnescape(mux.Vars(r)["instanceRef"]) + instanceRef, err := url.PathUnescape(r.PathValue("instanceRef")) if err != nil { return nil, err } @@ -455,7 +454,7 @@ func internalVirtualMachineOnResize(d *Daemon, r *http.Request) response.Respons s := d.State() // Get the instance ID. - instanceID, err := strconv.Atoi(mux.Vars(r)["instanceRef"]) + instanceID, err := strconv.Atoi(r.PathValue("instanceRef")) if err != nil { return response.BadRequest(err) } diff --git a/cmd/incusd/api_os.go b/cmd/incusd/api_os.go index aeaeb1708f9..78103b512fb 100644 --- a/cmd/incusd/api_os.go +++ b/cmd/incusd/api_os.go @@ -12,7 +12,7 @@ import ( ) var apiOS = APIEndpoint{ - Path: "{name:.*}", + Path: "{name...}", Patch: APIEndpointAction{Handler: apiOSProxy, AccessHandler: allowPermission(auth.ObjectTypeServer, auth.EntitlementCanEdit)}, Put: APIEndpointAction{Handler: apiOSProxy, AccessHandler: allowPermission(auth.ObjectTypeServer, auth.EntitlementCanEdit)}, Get: APIEndpointAction{Handler: apiOSProxy, AccessHandler: allowPermission(auth.ObjectTypeServer, auth.EntitlementCanEdit)}, diff --git a/cmd/incusd/api_project.go b/cmd/incusd/api_project.go index 9a95012555d..7f5262ed6d4 100644 --- a/cmd/incusd/api_project.go +++ b/cmd/incusd/api_project.go @@ -13,8 +13,6 @@ import ( "slices" "strings" - "github.com/gorilla/mux" - incus "github.com/lxc/incus/v6/client" "github.com/lxc/incus/v6/internal/filter" "github.com/lxc/incus/v6/internal/jmap" @@ -476,7 +474,7 @@ func projectCreateDefaultProfile(ctx context.Context, tx *db.ClusterTx, project func projectGet(d *Daemon, r *http.Request) response.Response { s := d.State() - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -541,7 +539,7 @@ func projectGet(d *Daemon, r *http.Request) response.Response { func projectPut(d *Daemon, r *http.Request) response.Response { s := d.State() - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -627,7 +625,7 @@ func projectPut(d *Daemon, r *http.Request) response.Response { func projectPatch(d *Daemon, r *http.Request) response.Response { s := d.State() - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -843,7 +841,7 @@ func projectChange(ctx context.Context, s *state.State, project *api.Project, re func projectPost(d *Daemon, r *http.Request) response.Response { s := d.State() - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -954,7 +952,7 @@ func projectPost(d *Daemon, r *http.Request) response.Response { func projectDelete(d *Daemon, r *http.Request) response.Response { s := d.State() - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -1310,7 +1308,7 @@ func projectDelete(d *Daemon, r *http.Request) response.Response { func projectStateGet(d *Daemon, r *http.Request) response.Response { s := d.State() - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -1985,7 +1983,7 @@ func projectValidateRestrictedSubnets(s *state.State, value string) error { func projectAccess(d *Daemon, r *http.Request) response.Response { s := d.State() - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/certificates.go b/cmd/incusd/certificates.go index de2a94fd1f9..6009836771f 100644 --- a/cmd/incusd/certificates.go +++ b/cmd/incusd/certificates.go @@ -14,8 +14,6 @@ import ( "net/url" "time" - "github.com/gorilla/mux" - incus "github.com/lxc/incus/v6/client" "github.com/lxc/incus/v6/internal/filter" internalInstance "github.com/lxc/incus/v6/internal/instance" @@ -861,7 +859,7 @@ func certificatesPost(d *Daemon, r *http.Request) response.Response { // "500": // $ref: "#/responses/InternalServerError" func certificateGet(d *Daemon, r *http.Request) response.Response { - fingerprint, err := url.PathUnescape(mux.Vars(r)["fingerprint"]) + fingerprint, err := url.PathUnescape(r.PathValue("fingerprint")) if err != nil { return response.SmartError(err) } @@ -913,7 +911,7 @@ func certificateGet(d *Daemon, r *http.Request) response.Response { // "500": // $ref: "#/responses/InternalServerError" func certificatePut(d *Daemon, r *http.Request) response.Response { - fingerprint, err := url.PathUnescape(mux.Vars(r)["fingerprint"]) + fingerprint, err := url.PathUnescape(r.PathValue("fingerprint")) if err != nil { return response.SmartError(err) } @@ -982,7 +980,7 @@ func certificatePut(d *Daemon, r *http.Request) response.Response { // "500": // $ref: "#/responses/InternalServerError" func certificatePatch(d *Daemon, r *http.Request) response.Response { - fingerprint, err := url.PathUnescape(mux.Vars(r)["fingerprint"]) + fingerprint, err := url.PathUnescape(r.PathValue("fingerprint")) if err != nil { return response.SmartError(err) } @@ -1178,7 +1176,7 @@ func doCertificateUpdate(d *Daemon, dbInfo api.Certificate, req api.CertificateP func certificateDelete(d *Daemon, r *http.Request) response.Response { s := d.State() - fingerprint, err := url.PathUnescape(mux.Vars(r)["fingerprint"]) + fingerprint, err := url.PathUnescape(r.PathValue("fingerprint")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/daemon.go b/cmd/incusd/daemon.go index ca40ed1242c..3698af4fa21 100644 --- a/cmd/incusd/daemon.go +++ b/cmd/incusd/daemon.go @@ -22,7 +22,6 @@ import ( dqliteClient "github.com/cowsql/go-cowsql/client" "github.com/cowsql/go-cowsql/driver" - "github.com/gorilla/mux" liblxc "github.com/lxc/go-lxc" "golang.org/x/sys/unix" @@ -229,15 +228,27 @@ func defaultDaemon() *Daemon { // APIEndpoint represents a URL in our API. type APIEndpoint struct { - Name string // Name for this endpoint. - Path string // Path pattern for this endpoint. - Aliases []APIEndpointAlias // Any aliases for this endpoint. - Get APIEndpointAction - Head APIEndpointAction - Put APIEndpointAction - Post APIEndpointAction - Delete APIEndpointAction - Patch APIEndpointAction + Name string // Name for this endpoint. + Path string // Path pattern for this endpoint. + Aliases []APIEndpointAlias // Any aliases for this endpoint. + SuffixActions []APIEndpointSuffixAction + Get APIEndpointAction + Head APIEndpointAction + Put APIEndpointAction + Post APIEndpointAction + Delete APIEndpointAction + Patch APIEndpointAction +} + +// APIEndpointSuffixAction represents actions appended to the end of the path like `/1.0/endpoint/action` +type APIEndpointSuffixAction struct { + Name string + Get APIEndpointAction + Head APIEndpointAction + Put APIEndpointAction + Post APIEndpointAction + Delete APIEndpointAction + Patch APIEndpointAction } // APIEndpointAlias represents an alias URL of and APIEndpoint in our API. @@ -619,20 +630,32 @@ func (d *Daemon) State() *state.State { } } -func (d *Daemon) createCmd(restAPI *mux.Router, version string, c APIEndpoint) { +func (d *Daemon) createCmd(restAPI *http.ServeMux, apiVersion string, c APIEndpoint) { var uri string if c.Path == "" { - uri = fmt.Sprintf("/%s", version) - } else if version != "" { - uri = fmt.Sprintf("/%s/%s", version, c.Path) + uri = fmt.Sprintf("/%s", apiVersion) + } else if apiVersion != "" { + uri = fmt.Sprintf("/%s/%s", apiVersion, c.Path) } else { uri = fmt.Sprintf("/%s", c.Path) } - route := restAPI.HandleFunc(uri, func(w http.ResponseWriter, r *http.Request) { + restAPI.HandleFunc(uri, func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") - if !(r.RemoteAddr == "@" && version == "internal") { + for _, action := range c.SuffixActions { + if strings.HasSuffix(r.URL.Path, action.Name) { + c.Get = action.Get + c.Post = action.Post + c.Put = action.Put + c.Patch = action.Patch + c.Delete = action.Delete + c.Head = action.Head + break + } + } + + if !(r.RemoteAddr == "@" && apiVersion == "internal") { // Block public API requests until we're done with basic // initialization tasks, such setting up the cluster database. select { @@ -660,7 +683,7 @@ func (d *Daemon) createCmd(restAPI *mux.Router, version string, c APIEndpoint) { } // Reject internal queries to remote, non-cluster, clients - if version == "internal" && !slices.Contains([]string{"unix", "cluster"}, protocol) { + if apiVersion == "internal" && !slices.Contains([]string{"unix", "cluster"}, protocol) { // Except for the initial cluster accept request (done over trusted TLS) if !trusted || c.Path != "cluster/accept" || protocol != api.AuthenticationMethodTLS { logger.Warn("Rejecting remote internal API request", logger.Ctx{"ip": r.RemoteAddr}) @@ -731,7 +754,7 @@ func (d *Daemon) createCmd(restAPI *mux.Router, version string, c APIEndpoint) { // - /1.0/operations endpoints // - GET queries allowedDuringShutdown := func() bool { - if version == "internal" { + if apiVersion == "internal" { return true } @@ -814,12 +837,6 @@ func (d *Daemon) createCmd(restAPI *mux.Router, version string, c APIEndpoint) { } } }) - - // If the endpoint has a canonical name then record it so it can be used to build URLS - // and accessed in the context of the request by the handler function. - if c.Name != "" { - route.Name(c.Name) - } } // have we setup shared mounts? diff --git a/cmd/incusd/dev_incus.go b/cmd/incusd/dev_incus.go index dbc3b25217a..0827de84d8c 100644 --- a/cmd/incusd/dev_incus.go +++ b/cmd/incusd/dev_incus.go @@ -13,7 +13,6 @@ import ( "strings" "sync" - "github.com/gorilla/mux" "golang.org/x/sys/unix" "github.com/lxc/incus/v6/internal/linux" @@ -77,7 +76,7 @@ var devIncusConfigKeyGet = devIncusHandler{"/1.0/config/{key}", func(d *Daemon, return response.DevIncusErrorResponse(api.StatusErrorf(http.StatusForbidden, "not authorized"), c.Type() == instancetype.VM) } - key, err := url.PathUnescape(mux.Vars(r)["key"]) + key, err := url.PathUnescape(r.PathValue("key")) if err != nil { return response.DevIncusErrorResponse(api.StatusErrorf(http.StatusBadRequest, "bad request"), c.Type() == instancetype.VM) } @@ -310,8 +309,7 @@ func hoistReq(f func(*Daemon, instance.Instance, http.ResponseWriter, *http.Requ } func devIncusAPI(d *Daemon, f hoistFunc) http.Handler { - router := mux.NewRouter() - router.UseEncodedPath() // Allow encoded values in path segments. + router := http.NewServeMux() for _, handler := range handlers { router.HandleFunc(handler.path, f(handler.f, d)) diff --git a/cmd/incusd/images.go b/cmd/incusd/images.go index bde91d570e9..ad35cbd0b42 100644 --- a/cmd/incusd/images.go +++ b/cmd/incusd/images.go @@ -26,7 +26,6 @@ import ( "sync" "time" - "github.com/gorilla/mux" "github.com/kballard/go-shellquote" "gopkg.in/yaml.v2" @@ -70,34 +69,6 @@ var imagesCmd = APIEndpoint{ Post: APIEndpointAction{Handler: imagesPost, AllowUntrusted: true}, } -var imageCmd = APIEndpoint{ - Path: "images/{fingerprint}", - - Delete: APIEndpointAction{Handler: imageDelete, AccessHandler: allowPermission(auth.ObjectTypeImage, auth.EntitlementCanEdit, "fingerprint")}, - Get: APIEndpointAction{Handler: imageGet, AllowUntrusted: true}, - Patch: APIEndpointAction{Handler: imagePatch, AccessHandler: allowPermission(auth.ObjectTypeImage, auth.EntitlementCanEdit, "fingerprint")}, - Put: APIEndpointAction{Handler: imagePut, AccessHandler: allowPermission(auth.ObjectTypeImage, auth.EntitlementCanEdit, "fingerprint")}, -} - -var imageExportCmd = APIEndpoint{ - Path: "images/{fingerprint}/export", - - Get: APIEndpointAction{Handler: imageExport, AllowUntrusted: true}, - Post: APIEndpointAction{Handler: imageExportPost, AccessHandler: allowPermission(auth.ObjectTypeImage, auth.EntitlementCanEdit, "fingerprint")}, -} - -var imageSecretCmd = APIEndpoint{ - Path: "images/{fingerprint}/secret", - - Post: APIEndpointAction{Handler: imageSecret, AccessHandler: allowPermission(auth.ObjectTypeImage, auth.EntitlementCanEdit, "fingerprint")}, -} - -var imageRefreshCmd = APIEndpoint{ - Path: "images/{fingerprint}/refresh", - - Post: APIEndpointAction{Handler: imageRefresh, AccessHandler: allowPermission(auth.ObjectTypeImage, auth.EntitlementCanEdit, "fingerprint")}, -} - var imageAliasesCmd = APIEndpoint{ Path: "images/aliases", @@ -106,7 +77,7 @@ var imageAliasesCmd = APIEndpoint{ } var imageAliasCmd = APIEndpoint{ - Path: "images/aliases/{name:.*}", + Path: "images/aliases/{name...}", Delete: APIEndpointAction{Handler: imageAliasDelete, AccessHandler: allowPermission(auth.ObjectTypeImageAlias, auth.EntitlementCanEdit, "name")}, Get: APIEndpointAction{Handler: imageAliasGet, AllowUntrusted: true}, @@ -115,6 +86,31 @@ var imageAliasCmd = APIEndpoint{ Put: APIEndpointAction{Handler: imageAliasPut, AccessHandler: allowPermission(auth.ObjectTypeImageAlias, auth.EntitlementCanEdit, "name")}, } +var imageCmd = APIEndpoint{ + Path: "images/{fingerprint}/", + + Delete: APIEndpointAction{Handler: imageDelete, AccessHandler: allowPermission(auth.ObjectTypeImage, auth.EntitlementCanEdit, "fingerprint")}, + Get: APIEndpointAction{Handler: imageGet, AllowUntrusted: true}, + Patch: APIEndpointAction{Handler: imagePatch, AccessHandler: allowPermission(auth.ObjectTypeImage, auth.EntitlementCanEdit, "fingerprint")}, + Put: APIEndpointAction{Handler: imagePut, AccessHandler: allowPermission(auth.ObjectTypeImage, auth.EntitlementCanEdit, "fingerprint")}, + + SuffixActions: []APIEndpointSuffixAction{ + APIEndpointSuffixAction{ + Name: "/export", + Get: APIEndpointAction{Handler: imageExport, AllowUntrusted: true}, + Post: APIEndpointAction{Handler: imageExportPost, AccessHandler: allowPermission(auth.ObjectTypeImage, auth.EntitlementCanEdit, "fingerprint")}, + }, + APIEndpointSuffixAction{ + Name: "/secret", + Post: APIEndpointAction{Handler: imageSecret, AccessHandler: allowPermission(auth.ObjectTypeImage, auth.EntitlementCanEdit, "fingerprint")}, + }, + APIEndpointSuffixAction{ + Name: "/refresh", + Post: APIEndpointAction{Handler: imageRefresh, AccessHandler: allowPermission(auth.ObjectTypeImage, auth.EntitlementCanEdit, "fingerprint")}, + }, + }, +} + /* We only want a single publish running at any one time. @@ -2806,7 +2802,7 @@ func imageDelete(d *Daemon, r *http.Request) response.Response { projectName := request.ProjectParam(r) - fingerprint, err := url.PathUnescape(mux.Vars(r)["fingerprint"]) + fingerprint, err := url.PathUnescape(r.PathValue("fingerprint")) if err != nil { return response.SmartError(err) } @@ -3157,7 +3153,7 @@ func imageGet(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - fingerprint, err := url.PathUnescape(mux.Vars(r)["fingerprint"]) + fingerprint, err := url.PathUnescape(r.PathValue("fingerprint")) if err != nil { return response.SmartError(err) } @@ -3245,7 +3241,7 @@ func imagePut(d *Daemon, r *http.Request) response.Response { // Get current value projectName := request.ProjectParam(r) - fingerprint, err := url.PathUnescape(mux.Vars(r)["fingerprint"]) + fingerprint, err := url.PathUnescape(r.PathValue("fingerprint")) if err != nil { return response.SmartError(err) } @@ -3354,7 +3350,7 @@ func imagePatch(d *Daemon, r *http.Request) response.Response { // Get current value projectName := request.ProjectParam(r) - fingerprint, err := url.PathUnescape(mux.Vars(r)["fingerprint"]) + fingerprint, err := url.PathUnescape(r.PathValue("fingerprint")) if err != nil { return response.SmartError(err) } @@ -3758,7 +3754,7 @@ func imageAliasesGet(d *Daemon, r *http.Request) response.Response { // $ref: "#/responses/InternalServerError" func imageAliasGet(d *Daemon, r *http.Request) response.Response { projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -3816,7 +3812,7 @@ func imageAliasDelete(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -3889,7 +3885,7 @@ func imageAliasPut(d *Daemon, r *http.Request) response.Response { // Get current value projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -3980,7 +3976,7 @@ func imageAliasPatch(d *Daemon, r *http.Request) response.Response { // Get current value projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -4083,7 +4079,7 @@ func imageAliasPost(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -4193,7 +4189,7 @@ func imageExport(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - fingerprint, err := url.PathUnescape(mux.Vars(r)["fingerprint"]) + fingerprint, err := url.PathUnescape(r.PathValue("fingerprint")) if err != nil { return response.SmartError(err) } @@ -4359,7 +4355,7 @@ func imageExportPost(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - fingerprint, err := url.PathUnescape(mux.Vars(r)["fingerprint"]) + fingerprint, err := url.PathUnescape(r.PathValue("fingerprint")) if err != nil { return response.SmartError(err) } @@ -4507,7 +4503,7 @@ func imageSecret(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - fingerprint, err := url.PathUnescape(mux.Vars(r)["fingerprint"]) + fingerprint, err := url.PathUnescape(r.PathValue("fingerprint")) if err != nil { return response.SmartError(err) } @@ -4626,7 +4622,7 @@ func imageRefresh(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - fingerprint, err := url.PathUnescape(mux.Vars(r)["fingerprint"]) + fingerprint, err := url.PathUnescape(r.PathValue("fingerprint")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/instance_access.go b/cmd/incusd/instance_access.go index 00ced654101..ce3c384af44 100644 --- a/cmd/incusd/instance_access.go +++ b/cmd/incusd/instance_access.go @@ -6,8 +6,6 @@ import ( "net/http" "net/url" - "github.com/gorilla/mux" - internalInstance "github.com/lxc/incus/v6/internal/instance" "github.com/lxc/incus/v6/internal/server/request" "github.com/lxc/incus/v6/internal/server/response" @@ -58,7 +56,7 @@ func instanceAccess(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -77,7 +75,7 @@ func instanceAccess(d *Daemon, r *http.Request) response.Response { return resp } - access, err := s.Authorizer.GetInstanceAccess(context.TODO(), projectName, mux.Vars(r)["name"]) + access, err := s.Authorizer.GetInstanceAccess(context.TODO(), projectName, r.PathValue("name")) if err != nil { return response.InternalError(err) } diff --git a/cmd/incusd/instance_backup.go b/cmd/incusd/instance_backup.go index d50b3227869..7d54b6e62f0 100644 --- a/cmd/incusd/instance_backup.go +++ b/cmd/incusd/instance_backup.go @@ -10,8 +10,6 @@ import ( "strings" "time" - "github.com/gorilla/mux" - internalInstance "github.com/lxc/incus/v6/internal/instance" "github.com/lxc/incus/v6/internal/jmap" "github.com/lxc/incus/v6/internal/server/db" @@ -124,7 +122,7 @@ func instanceBackupsGet(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - cname, err := url.PathUnescape(mux.Vars(r)["name"]) + cname, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -212,7 +210,7 @@ func instanceBackupsPost(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -407,7 +405,7 @@ func instanceBackupGet(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -416,7 +414,7 @@ func instanceBackupGet(d *Daemon, r *http.Request) response.Response { return response.BadRequest(errors.New("Invalid instance name")) } - backupName, err := url.PathUnescape(mux.Vars(r)["backupName"]) + backupName, err := url.PathUnescape(r.PathValue("backupName")) if err != nil { return response.SmartError(err) } @@ -476,7 +474,7 @@ func instanceBackupPost(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -485,7 +483,7 @@ func instanceBackupPost(d *Daemon, r *http.Request) response.Response { return response.BadRequest(errors.New("Invalid instance name")) } - backupName, err := url.PathUnescape(mux.Vars(r)["backupName"]) + backupName, err := url.PathUnescape(r.PathValue("backupName")) if err != nil { return response.SmartError(err) } @@ -570,7 +568,7 @@ func instanceBackupDelete(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -579,7 +577,7 @@ func instanceBackupDelete(d *Daemon, r *http.Request) response.Response { return response.BadRequest(errors.New("Invalid instance name")) } - backupName, err := url.PathUnescape(mux.Vars(r)["backupName"]) + backupName, err := url.PathUnescape(r.PathValue("backupName")) if err != nil { return response.SmartError(err) } @@ -647,7 +645,7 @@ func instanceBackupExportGet(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -656,7 +654,7 @@ func instanceBackupExportGet(d *Daemon, r *http.Request) response.Response { return response.BadRequest(errors.New("Invalid instance name")) } - backupName, err := url.PathUnescape(mux.Vars(r)["backupName"]) + backupName, err := url.PathUnescape(r.PathValue("backupName")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/instance_console.go b/cmd/incusd/instance_console.go index 15ffd51bfdf..2392b7b4f1c 100644 --- a/cmd/incusd/instance_console.go +++ b/cmd/incusd/instance_console.go @@ -15,7 +15,6 @@ import ( "sync" "time" - "github.com/gorilla/mux" "github.com/gorilla/websocket" liblxc "github.com/lxc/go-lxc" "golang.org/x/sys/unix" @@ -453,7 +452,7 @@ func instanceConsolePost(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -634,7 +633,7 @@ func instanceConsoleLogGet(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -795,7 +794,7 @@ func instanceConsoleLogDelete(d *Daemon, r *http.Request) response.Response { return response.BadRequest(errors.New("Clearing the console buffer requires liblxc >= 3.0")) } - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/instance_debug.go b/cmd/incusd/instance_debug.go index d34a7f718f4..a86ab4d8974 100644 --- a/cmd/incusd/instance_debug.go +++ b/cmd/incusd/instance_debug.go @@ -7,8 +7,6 @@ import ( "net/url" "os" - "github.com/gorilla/mux" - internalInstance "github.com/lxc/incus/v6/internal/instance" "github.com/lxc/incus/v6/internal/server/instance" "github.com/lxc/incus/v6/internal/server/instance/instancetype" @@ -57,7 +55,7 @@ func instanceDebugMemoryGet(d *Daemon, r *http.Request) response.Response { format := request.QueryParam(r, "format") projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/instance_delete.go b/cmd/incusd/instance_delete.go index b22568d72be..d10a75ca6f9 100644 --- a/cmd/incusd/instance_delete.go +++ b/cmd/incusd/instance_delete.go @@ -5,8 +5,6 @@ import ( "net/http" "net/url" - "github.com/gorilla/mux" - internalInstance "github.com/lxc/incus/v6/internal/instance" "github.com/lxc/incus/v6/internal/server/db/operationtype" "github.com/lxc/incus/v6/internal/server/instance" @@ -50,7 +48,7 @@ func instanceDelete(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/instance_exec.go b/cmd/incusd/instance_exec.go index ca0bfab11df..3045e681ffa 100644 --- a/cmd/incusd/instance_exec.go +++ b/cmd/incusd/instance_exec.go @@ -16,7 +16,6 @@ import ( "sync" "time" - "github.com/gorilla/mux" "github.com/gorilla/websocket" "golang.org/x/sys/unix" @@ -554,7 +553,7 @@ func instanceExecPost(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/instance_file.go b/cmd/incusd/instance_file.go index 37209943641..308649ea39c 100644 --- a/cmd/incusd/instance_file.go +++ b/cmd/incusd/instance_file.go @@ -14,7 +14,6 @@ import ( "strings" "time" - "github.com/gorilla/mux" "github.com/pkg/sftp" internalInstance "github.com/lxc/incus/v6/internal/instance" @@ -32,7 +31,7 @@ func instanceFileHandler(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/instance_get.go b/cmd/incusd/instance_get.go index a189aa3cb13..238b1dfa137 100644 --- a/cmd/incusd/instance_get.go +++ b/cmd/incusd/instance_get.go @@ -7,8 +7,6 @@ import ( "net/url" "strconv" - "github.com/gorilla/mux" - internalInstance "github.com/lxc/incus/v6/internal/instance" "github.com/lxc/incus/v6/internal/server/instance" "github.com/lxc/incus/v6/internal/server/request" @@ -102,7 +100,7 @@ func instanceGet(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/instance_logs.go b/cmd/incusd/instance_logs.go index b49e8005b2b..e2595b83df6 100644 --- a/cmd/incusd/instance_logs.go +++ b/cmd/incusd/instance_logs.go @@ -10,8 +10,6 @@ import ( "slices" "strings" - "github.com/gorilla/mux" - internalInstance "github.com/lxc/incus/v6/internal/instance" "github.com/lxc/incus/v6/internal/server/auth" "github.com/lxc/incus/v6/internal/server/instance" @@ -114,7 +112,7 @@ func instanceLogsGet(d *Daemon, r *http.Request) response.Response { */ projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -193,7 +191,7 @@ func instanceLogGet(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -218,7 +216,7 @@ func instanceLogGet(d *Daemon, r *http.Request) response.Response { return resp } - file, err := url.PathUnescape(mux.Vars(r)["file"]) + file, err := url.PathUnescape(r.PathValue("file")) if err != nil { return response.SmartError(err) } @@ -272,7 +270,7 @@ func instanceLogDelete(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -297,7 +295,7 @@ func instanceLogDelete(d *Daemon, r *http.Request) response.Response { return resp } - file, err := url.PathUnescape(mux.Vars(r)["file"]) + file, err := url.PathUnescape(r.PathValue("file")) if err != nil { return response.SmartError(err) } @@ -379,7 +377,7 @@ func instanceExecOutputsGet(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -479,7 +477,7 @@ func instanceExecOutputGet(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -504,7 +502,7 @@ func instanceExecOutputGet(d *Daemon, r *http.Request) response.Response { return resp } - file, err := url.PathUnescape(mux.Vars(r)["file"]) + file, err := url.PathUnescape(r.PathValue("file")) if err != nil { return response.SmartError(err) } @@ -574,7 +572,7 @@ func instanceExecOutputDelete(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -599,7 +597,7 @@ func instanceExecOutputDelete(d *Daemon, r *http.Request) response.Response { return resp } - file, err := url.PathUnescape(mux.Vars(r)["file"]) + file, err := url.PathUnescape(r.PathValue("file")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/instance_metadata.go b/cmd/incusd/instance_metadata.go index df74824a0d0..ff2f746bdcf 100644 --- a/cmd/incusd/instance_metadata.go +++ b/cmd/incusd/instance_metadata.go @@ -11,7 +11,6 @@ import ( "path/filepath" "strings" - "github.com/gorilla/mux" "gopkg.in/yaml.v2" internalInstance "github.com/lxc/incus/v6/internal/instance" @@ -71,7 +70,7 @@ func instanceMetadataGet(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -178,7 +177,7 @@ func instanceMetadataPatch(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -293,7 +292,7 @@ func instanceMetadataPut(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -412,7 +411,7 @@ func instanceMetadataTemplatesGet(d *Daemon, r *http.Request) response.Response s := d.State() projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -559,7 +558,7 @@ func instanceMetadataTemplatesPost(d *Daemon, r *http.Request) response.Response s := d.State() projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -673,7 +672,7 @@ func instanceMetadataTemplatesDelete(d *Daemon, r *http.Request) response.Respon projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/instance_patch.go b/cmd/incusd/instance_patch.go index 15e126370e9..617f5ee3a32 100644 --- a/cmd/incusd/instance_patch.go +++ b/cmd/incusd/instance_patch.go @@ -9,8 +9,6 @@ import ( "net/http" "net/url" - "github.com/gorilla/mux" - internalInstance "github.com/lxc/incus/v6/internal/instance" "github.com/lxc/incus/v6/internal/jmap" "github.com/lxc/incus/v6/internal/server/db" @@ -65,7 +63,7 @@ func instancePatch(d *Daemon, r *http.Request) response.Response { projectName := request.ProjectParam(r) // Get the container - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/instance_post.go b/cmd/incusd/instance_post.go index ffd3508ef1e..4b9985f0585 100644 --- a/cmd/incusd/instance_post.go +++ b/cmd/incusd/instance_post.go @@ -11,8 +11,6 @@ import ( "slices" "strings" - "github.com/gorilla/mux" - incus "github.com/lxc/incus/v6/client" internalInstance "github.com/lxc/incus/v6/internal/instance" "github.com/lxc/incus/v6/internal/server/auth" @@ -84,7 +82,7 @@ func instancePost(d *Daemon, r *http.Request) response.Response { projectName := request.ProjectParam(r) target := request.QueryParam(r, "target") - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/instance_put.go b/cmd/incusd/instance_put.go index 52fe6077252..f3c5815cda2 100644 --- a/cmd/incusd/instance_put.go +++ b/cmd/incusd/instance_put.go @@ -9,7 +9,6 @@ import ( "net/url" "github.com/google/uuid" - "github.com/gorilla/mux" internalInstance "github.com/lxc/incus/v6/internal/instance" "github.com/lxc/incus/v6/internal/server/db" @@ -69,7 +68,7 @@ func instancePut(d *Daemon, r *http.Request) response.Response { projectName := request.ProjectParam(r) // Get the container - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/instance_rebuild.go b/cmd/incusd/instance_rebuild.go index fc122572035..33a0bd47f3c 100644 --- a/cmd/incusd/instance_rebuild.go +++ b/cmd/incusd/instance_rebuild.go @@ -8,8 +8,6 @@ import ( "net/http" "net/url" - "github.com/gorilla/mux" - internalInstance "github.com/lxc/incus/v6/internal/instance" "github.com/lxc/incus/v6/internal/server/db" dbCluster "github.com/lxc/incus/v6/internal/server/db/cluster" @@ -62,7 +60,7 @@ func instanceRebuildPost(d *Daemon, r *http.Request) response.Response { targetProjectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/instance_sftp.go b/cmd/incusd/instance_sftp.go index fcd660a5688..ad506ae1595 100644 --- a/cmd/incusd/instance_sftp.go +++ b/cmd/incusd/instance_sftp.go @@ -6,8 +6,6 @@ import ( "net/http" "net/url" - "github.com/gorilla/mux" - internalInstance "github.com/lxc/incus/v6/internal/instance" "github.com/lxc/incus/v6/internal/server/cluster" "github.com/lxc/incus/v6/internal/server/instance" @@ -41,7 +39,7 @@ func instanceSFTPHandler(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - instName, err := url.PathUnescape(mux.Vars(r)["name"]) + instName, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/instance_snapshot.go b/cmd/incusd/instance_snapshot.go index bc3b2ae63f5..a7ae4e81597 100644 --- a/cmd/incusd/instance_snapshot.go +++ b/cmd/incusd/instance_snapshot.go @@ -11,8 +11,6 @@ import ( "net/url" "time" - "github.com/gorilla/mux" - internalInstance "github.com/lxc/incus/v6/internal/instance" "github.com/lxc/incus/v6/internal/jmap" "github.com/lxc/incus/v6/internal/server/db" @@ -126,7 +124,7 @@ func instanceSnapshotsGet(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - cname, err := url.PathUnescape(mux.Vars(r)["name"]) + cname, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -237,7 +235,7 @@ func instanceSnapshotsPost(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -344,12 +342,12 @@ func instanceSnapshotHandler(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - instName, err := url.PathUnescape(mux.Vars(r)["name"]) + instName, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } - snapshotName, err := url.PathUnescape(mux.Vars(r)["snapshotName"]) + snapshotName, err := url.PathUnescape(r.PathValue("snapshotName")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/instance_state.go b/cmd/incusd/instance_state.go index 9b8ff6f7100..ef127bc43ff 100644 --- a/cmd/incusd/instance_state.go +++ b/cmd/incusd/instance_state.go @@ -9,8 +9,6 @@ import ( "net/url" "time" - "github.com/gorilla/mux" - internalInstance "github.com/lxc/incus/v6/internal/instance" "github.com/lxc/incus/v6/internal/server/db/operationtype" "github.com/lxc/incus/v6/internal/server/instance" @@ -70,7 +68,7 @@ func instanceState(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -139,7 +137,7 @@ func instanceStatePut(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/network_acls.go b/cmd/incusd/network_acls.go index 54263bf7ffd..51d7f2df788 100644 --- a/cmd/incusd/network_acls.go +++ b/cmd/incusd/network_acls.go @@ -10,8 +10,6 @@ import ( "net/url" "time" - "github.com/gorilla/mux" - "github.com/lxc/incus/v6/internal/filter" "github.com/lxc/incus/v6/internal/server/auth" clusterRequest "github.com/lxc/incus/v6/internal/server/cluster/request" @@ -372,7 +370,7 @@ func networkACLDelete(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - aclName, err := url.PathUnescape(mux.Vars(r)["name"]) + aclName, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -445,7 +443,7 @@ func networkACLGet(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - aclName, err := url.PathUnescape(mux.Vars(r)["name"]) + aclName, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -541,7 +539,7 @@ func networkACLPut(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - aclName, err := url.PathUnescape(mux.Vars(r)["name"]) + aclName, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -624,7 +622,7 @@ func networkACLPut(d *Daemon, r *http.Request) response.Response { func networkACLPost(d *Daemon, r *http.Request) response.Response { s := d.State() - aclName, err := url.PathUnescape(mux.Vars(r)["name"]) + aclName, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -699,7 +697,7 @@ func networkACLLogGet(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - aclName, err := url.PathUnescape(mux.Vars(r)["name"]) + aclName, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/network_address_sets.go b/cmd/incusd/network_address_sets.go index 4550b04fd15..ae92576d38d 100644 --- a/cmd/incusd/network_address_sets.go +++ b/cmd/incusd/network_address_sets.go @@ -8,8 +8,6 @@ import ( "net/http" "net/url" - "github.com/gorilla/mux" - "github.com/lxc/incus/v6/internal/filter" "github.com/lxc/incus/v6/internal/server/auth" clusterRequest "github.com/lxc/incus/v6/internal/server/cluster/request" @@ -356,7 +354,7 @@ func networkAddressSetDelete(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - addrSetName, err := url.PathUnescape(mux.Vars(r)["name"]) + addrSetName, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -430,7 +428,7 @@ func networkAddressSetGet(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - addrSetName, err := url.PathUnescape(mux.Vars(r)["name"]) + addrSetName, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -527,7 +525,7 @@ func networkAddressSetPut(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - addrSetName, err := url.PathUnescape(mux.Vars(r)["name"]) + addrSetName, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -614,7 +612,7 @@ func networkAddressSetPost(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - addrSetName, err := url.PathUnescape(mux.Vars(r)["name"]) + addrSetName, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/network_forwards.go b/cmd/incusd/network_forwards.go index f3fce7dd641..ac7d5797a8f 100644 --- a/cmd/incusd/network_forwards.go +++ b/cmd/incusd/network_forwards.go @@ -7,8 +7,6 @@ import ( "net/http" "net/url" - "github.com/gorilla/mux" - "github.com/lxc/incus/v6/internal/filter" "github.com/lxc/incus/v6/internal/server/auth" clusterRequest "github.com/lxc/incus/v6/internal/server/cluster/request" @@ -153,7 +151,7 @@ func networkForwardsGet(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - networkName, err := url.PathUnescape(mux.Vars(r)["networkName"]) + networkName, err := url.PathUnescape(r.PathValue("networkName")) if err != nil { return response.SmartError(err) } @@ -319,7 +317,7 @@ func networkForwardsPost(d *Daemon, r *http.Request) response.Response { req.Normalise() // So we handle the request in normalised/canonical form. - networkName, err := url.PathUnescape(mux.Vars(r)["networkName"]) + networkName, err := url.PathUnescape(r.PathValue("networkName")) if err != nil { return response.SmartError(err) } @@ -388,7 +386,7 @@ func networkForwardDelete(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - networkName, err := url.PathUnescape(mux.Vars(r)["networkName"]) + networkName, err := url.PathUnescape(r.PathValue("networkName")) if err != nil { return response.SmartError(err) } @@ -407,7 +405,7 @@ func networkForwardDelete(d *Daemon, r *http.Request) response.Response { return response.BadRequest(fmt.Errorf("Network driver %q does not support forwards", n.Type())) } - listenAddress, err := url.PathUnescape(mux.Vars(r)["listenAddress"]) + listenAddress, err := url.PathUnescape(r.PathValue("listenAddress")) if err != nil { return response.SmartError(err) } @@ -477,7 +475,7 @@ func networkForwardGet(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - networkName, err := url.PathUnescape(mux.Vars(r)["networkName"]) + networkName, err := url.PathUnescape(r.PathValue("networkName")) if err != nil { return response.SmartError(err) } @@ -496,7 +494,7 @@ func networkForwardGet(d *Daemon, r *http.Request) response.Response { return response.BadRequest(fmt.Errorf("Network driver %q does not support forwards", n.Type())) } - listenAddress, err := url.PathUnescape(mux.Vars(r)["listenAddress"]) + listenAddress, err := url.PathUnescape(r.PathValue("listenAddress")) if err != nil { return response.SmartError(err) } @@ -630,7 +628,7 @@ func networkForwardPut(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - networkName, err := url.PathUnescape(mux.Vars(r)["networkName"]) + networkName, err := url.PathUnescape(r.PathValue("networkName")) if err != nil { return response.SmartError(err) } @@ -649,7 +647,7 @@ func networkForwardPut(d *Daemon, r *http.Request) response.Response { return response.BadRequest(fmt.Errorf("Network driver %q does not support forwards", n.Type())) } - listenAddress, err := url.PathUnescape(mux.Vars(r)["listenAddress"]) + listenAddress, err := url.PathUnescape(r.PathValue("listenAddress")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/network_integrations.go b/cmd/incusd/network_integrations.go index 086ce9c6f12..827065ef823 100644 --- a/cmd/incusd/network_integrations.go +++ b/cmd/incusd/network_integrations.go @@ -9,8 +9,6 @@ import ( "net/url" "strings" - "github.com/gorilla/mux" - "github.com/lxc/incus/v6/internal/filter" "github.com/lxc/incus/v6/internal/server/auth" "github.com/lxc/incus/v6/internal/server/db" @@ -385,7 +383,7 @@ func networkIntegrationDelete(d *Daemon, r *http.Request) response.Response { s := d.State() // Get the integration name. - integrationName, err := url.PathUnescape(mux.Vars(r)["integration"]) + integrationName, err := url.PathUnescape(r.PathValue("integration")) if err != nil { return response.SmartError(err) } @@ -494,7 +492,7 @@ func networkIntegrationGet(d *Daemon, r *http.Request) response.Response { s := d.State() // Get the integration name. - integrationName, err := url.PathUnescape(mux.Vars(r)["integration"]) + integrationName, err := url.PathUnescape(r.PathValue("integration")) if err != nil { return response.SmartError(err) } @@ -649,7 +647,7 @@ func networkIntegrationGet(d *Daemon, r *http.Request) response.Response { func networkIntegrationPut(d *Daemon, r *http.Request) response.Response { s := d.State() - integrationName, err := url.PathUnescape(mux.Vars(r)["integration"]) + integrationName, err := url.PathUnescape(r.PathValue("integration")) if err != nil { return response.SmartError(err) } @@ -809,7 +807,7 @@ func networkIntegrationPost(d *Daemon, r *http.Request) response.Response { s := d.State() // Get the integration name. - integrationName, err := url.PathUnescape(mux.Vars(r)["integration"]) + integrationName, err := url.PathUnescape(r.PathValue("integration")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/network_load_balancers.go b/cmd/incusd/network_load_balancers.go index 7980bc386c7..4bf7b19f370 100644 --- a/cmd/incusd/network_load_balancers.go +++ b/cmd/incusd/network_load_balancers.go @@ -7,8 +7,6 @@ import ( "net/http" "net/url" - "github.com/gorilla/mux" - "github.com/lxc/incus/v6/internal/filter" "github.com/lxc/incus/v6/internal/server/auth" clusterRequest "github.com/lxc/incus/v6/internal/server/cluster/request" @@ -159,7 +157,7 @@ func networkLoadBalancersGet(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - networkName, err := url.PathUnescape(mux.Vars(r)["networkName"]) + networkName, err := url.PathUnescape(r.PathValue("networkName")) if err != nil { return response.SmartError(err) } @@ -329,7 +327,7 @@ func networkLoadBalancersPost(d *Daemon, r *http.Request) response.Response { req.Normalise() // So we handle the request in normalised/canonical form. - networkName, err := url.PathUnescape(mux.Vars(r)["networkName"]) + networkName, err := url.PathUnescape(r.PathValue("networkName")) if err != nil { return response.SmartError(err) } @@ -398,7 +396,7 @@ func networkLoadBalancerDelete(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - networkName, err := url.PathUnescape(mux.Vars(r)["networkName"]) + networkName, err := url.PathUnescape(r.PathValue("networkName")) if err != nil { return response.SmartError(err) } @@ -417,7 +415,7 @@ func networkLoadBalancerDelete(d *Daemon, r *http.Request) response.Response { return response.BadRequest(fmt.Errorf("Network driver %q does not support load balancers", n.Type())) } - listenAddress, err := url.PathUnescape(mux.Vars(r)["listenAddress"]) + listenAddress, err := url.PathUnescape(r.PathValue("listenAddress")) if err != nil { return response.SmartError(err) } @@ -487,7 +485,7 @@ func networkLoadBalancerGet(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - networkName, err := url.PathUnescape(mux.Vars(r)["networkName"]) + networkName, err := url.PathUnescape(r.PathValue("networkName")) if err != nil { return response.SmartError(err) } @@ -506,7 +504,7 @@ func networkLoadBalancerGet(d *Daemon, r *http.Request) response.Response { return response.BadRequest(fmt.Errorf("Network driver %q does not support load balancers", n.Type())) } - listenAddress, err := url.PathUnescape(mux.Vars(r)["listenAddress"]) + listenAddress, err := url.PathUnescape(r.PathValue("listenAddress")) if err != nil { return response.SmartError(err) } @@ -625,7 +623,7 @@ func networkLoadBalancerPut(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - networkName, err := url.PathUnescape(mux.Vars(r)["networkName"]) + networkName, err := url.PathUnescape(r.PathValue("networkName")) if err != nil { return response.SmartError(err) } @@ -644,7 +642,7 @@ func networkLoadBalancerPut(d *Daemon, r *http.Request) response.Response { return response.BadRequest(fmt.Errorf("Network driver %q does not support load balancers", n.Type())) } - listenAddress, err := url.PathUnescape(mux.Vars(r)["listenAddress"]) + listenAddress, err := url.PathUnescape(r.PathValue("listenAddress")) if err != nil { return response.SmartError(err) } @@ -776,7 +774,7 @@ func networkLoadBalancerStateGet(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - networkName, err := url.PathUnescape(mux.Vars(r)["networkName"]) + networkName, err := url.PathUnescape(r.PathValue("networkName")) if err != nil { return response.SmartError(err) } @@ -795,7 +793,7 @@ func networkLoadBalancerStateGet(d *Daemon, r *http.Request) response.Response { return response.BadRequest(fmt.Errorf("Network driver %q does not support load balancers", n.Type())) } - listenAddress, err := url.PathUnescape(mux.Vars(r)["listenAddress"]) + listenAddress, err := url.PathUnescape(r.PathValue("listenAddress")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/network_peers.go b/cmd/incusd/network_peers.go index a188cd9a77c..f6b48c07643 100644 --- a/cmd/incusd/network_peers.go +++ b/cmd/incusd/network_peers.go @@ -7,8 +7,6 @@ import ( "net/http" "net/url" - "github.com/gorilla/mux" - "github.com/lxc/incus/v6/internal/filter" "github.com/lxc/incus/v6/internal/server/auth" "github.com/lxc/incus/v6/internal/server/db" @@ -153,7 +151,7 @@ func networkPeersGet(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - networkName, err := url.PathUnescape(mux.Vars(r)["networkName"]) + networkName, err := url.PathUnescape(r.PathValue("networkName")) if err != nil { return response.SmartError(err) } @@ -328,7 +326,7 @@ func networkPeersPost(d *Daemon, r *http.Request) response.Response { return response.BadRequest(fmt.Errorf("Invalid network peer name: %w", err)) } - networkName, err := url.PathUnescape(mux.Vars(r)["networkName"]) + networkName, err := url.PathUnescape(r.PathValue("networkName")) if err != nil { return response.SmartError(err) } @@ -395,7 +393,7 @@ func networkPeerDelete(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - networkName, err := url.PathUnescape(mux.Vars(r)["networkName"]) + networkName, err := url.PathUnescape(r.PathValue("networkName")) if err != nil { return response.SmartError(err) } @@ -414,7 +412,7 @@ func networkPeerDelete(d *Daemon, r *http.Request) response.Response { return response.BadRequest(fmt.Errorf("Network driver %q does not support peering", n.Type())) } - peerName, err := url.PathUnescape(mux.Vars(r)["peerName"]) + peerName, err := url.PathUnescape(r.PathValue("peerName")) if err != nil { return response.SmartError(err) } @@ -482,7 +480,7 @@ func networkPeerGet(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - networkName, err := url.PathUnescape(mux.Vars(r)["networkName"]) + networkName, err := url.PathUnescape(r.PathValue("networkName")) if err != nil { return response.SmartError(err) } @@ -501,7 +499,7 @@ func networkPeerGet(d *Daemon, r *http.Request) response.Response { return response.BadRequest(fmt.Errorf("Network driver %q does not support peering", n.Type())) } - peerName, err := url.PathUnescape(mux.Vars(r)["peerName"]) + peerName, err := url.PathUnescape(r.PathValue("peerName")) if err != nil { return response.SmartError(err) } @@ -613,7 +611,7 @@ func networkPeerPut(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - networkName, err := url.PathUnescape(mux.Vars(r)["networkName"]) + networkName, err := url.PathUnescape(r.PathValue("networkName")) if err != nil { return response.SmartError(err) } @@ -632,7 +630,7 @@ func networkPeerPut(d *Daemon, r *http.Request) response.Response { return response.BadRequest(fmt.Errorf("Network driver %q does not support peering", n.Type())) } - peerName, err := url.PathUnescape(mux.Vars(r)["peerName"]) + peerName, err := url.PathUnescape(r.PathValue("peerName")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/network_zones.go b/cmd/incusd/network_zones.go index f48292dd02c..edee113c439 100644 --- a/cmd/incusd/network_zones.go +++ b/cmd/incusd/network_zones.go @@ -8,8 +8,6 @@ import ( "net/http" "net/url" - "github.com/gorilla/mux" - "github.com/lxc/incus/v6/internal/filter" "github.com/lxc/incus/v6/internal/server/auth" clusterRequest "github.com/lxc/incus/v6/internal/server/cluster/request" @@ -364,7 +362,7 @@ func networkZoneDelete(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - zoneName, err := url.PathUnescape(mux.Vars(r)["zone"]) + zoneName, err := url.PathUnescape(r.PathValue("zone")) if err != nil { return response.SmartError(err) } @@ -437,7 +435,7 @@ func networkZoneGet(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - zoneName, err := url.PathUnescape(mux.Vars(r)["zone"]) + zoneName, err := url.PathUnescape(r.PathValue("zone")) if err != nil { return response.SmartError(err) } @@ -533,7 +531,7 @@ func networkZonePut(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - zoneName, err := url.PathUnescape(mux.Vars(r)["zone"]) + zoneName, err := url.PathUnescape(r.PathValue("zone")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/network_zones_records.go b/cmd/incusd/network_zones_records.go index 46e87a5b2e4..d86ecf53a1d 100644 --- a/cmd/incusd/network_zones_records.go +++ b/cmd/incusd/network_zones_records.go @@ -6,8 +6,6 @@ import ( "net/http" "net/url" - "github.com/gorilla/mux" - "github.com/lxc/incus/v6/internal/filter" "github.com/lxc/incus/v6/internal/server/auth" clusterRequest "github.com/lxc/incus/v6/internal/server/cluster/request" @@ -161,7 +159,7 @@ func networkZoneRecordsGet(d *Daemon, r *http.Request) response.Response { mustLoadObjects := recursion || (clauses != nil && len(clauses.Clauses) > 0) - zoneName, err := url.PathUnescape(mux.Vars(r)["zone"]) + zoneName, err := url.PathUnescape(r.PathValue("zone")) if err != nil { return response.SmartError(err) } @@ -246,7 +244,7 @@ func networkZoneRecordsPost(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - zoneName, err := url.PathUnescape(mux.Vars(r)["zone"]) + zoneName, err := url.PathUnescape(r.PathValue("zone")) if err != nil { return response.SmartError(err) } @@ -308,12 +306,12 @@ func networkZoneRecordDelete(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - zoneName, err := url.PathUnescape(mux.Vars(r)["zone"]) + zoneName, err := url.PathUnescape(r.PathValue("zone")) if err != nil { return response.SmartError(err) } - recordName, err := url.PathUnescape(mux.Vars(r)["name"]) + recordName, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -383,12 +381,12 @@ func networkZoneRecordGet(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - zoneName, err := url.PathUnescape(mux.Vars(r)["zone"]) + zoneName, err := url.PathUnescape(r.PathValue("zone")) if err != nil { return response.SmartError(err) } - recordName, err := url.PathUnescape(mux.Vars(r)["name"]) + recordName, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -485,12 +483,12 @@ func networkZoneRecordPut(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - zoneName, err := url.PathUnescape(mux.Vars(r)["zone"]) + zoneName, err := url.PathUnescape(r.PathValue("zone")) if err != nil { return response.SmartError(err) } - recordName, err := url.PathUnescape(mux.Vars(r)["name"]) + recordName, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/networks.go b/cmd/incusd/networks.go index e5164a35a41..12e2e1344c5 100644 --- a/cmd/incusd/networks.go +++ b/cmd/incusd/networks.go @@ -15,8 +15,6 @@ import ( "sync" "time" - "github.com/gorilla/mux" - incus "github.com/lxc/incus/v6/client" "github.com/lxc/incus/v6/internal/filter" "github.com/lxc/incus/v6/internal/server/auth" @@ -942,7 +940,7 @@ func networkGet(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - networkName, err := url.PathUnescape(mux.Vars(r)["networkName"]) + networkName, err := url.PathUnescape(r.PathValue("networkName")) if err != nil { return response.SmartError(err) } @@ -1140,7 +1138,7 @@ func networkDelete(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - networkName, err := url.PathUnescape(mux.Vars(r)["networkName"]) + networkName, err := url.PathUnescape(r.PathValue("networkName")) if err != nil { return response.SmartError(err) } @@ -1271,7 +1269,7 @@ func networkPost(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - networkName, err := url.PathUnescape(mux.Vars(r)["networkName"]) + networkName, err := url.PathUnescape(r.PathValue("networkName")) if err != nil { return response.SmartError(err) } @@ -1413,7 +1411,7 @@ func networkPut(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - networkName, err := url.PathUnescape(mux.Vars(r)["networkName"]) + networkName, err := url.PathUnescape(r.PathValue("networkName")) if err != nil { return response.SmartError(err) } @@ -1642,7 +1640,7 @@ func networkLeasesGet(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - networkName, err := url.PathUnescape(mux.Vars(r)["networkName"]) + networkName, err := url.PathUnescape(r.PathValue("networkName")) if err != nil { return response.SmartError(err) } @@ -2034,7 +2032,7 @@ func networkStateGet(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - networkName, err := url.PathUnescape(mux.Vars(r)["networkName"]) + networkName, err := url.PathUnescape(r.PathValue("networkName")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/operations.go b/cmd/incusd/operations.go index cee9aeb7704..7981087e111 100644 --- a/cmd/incusd/operations.go +++ b/cmd/incusd/operations.go @@ -10,8 +10,6 @@ import ( "strings" "time" - "github.com/gorilla/mux" - "github.com/lxc/incus/v6/internal/jmap" "github.com/lxc/incus/v6/internal/server/auth" "github.com/lxc/incus/v6/internal/server/cluster" @@ -172,7 +170,7 @@ func waitForOperations(ctx context.Context, cluster *db.Cluster, consoleShutdown func operationGet(d *Daemon, r *http.Request) response.Response { s := d.State() - id, err := url.PathUnescape(mux.Vars(r)["id"]) + id, err := url.PathUnescape(r.PathValue("id")) if err != nil { return response.SmartError(err) } @@ -245,7 +243,7 @@ func operationGet(d *Daemon, r *http.Request) response.Response { func operationDelete(d *Daemon, r *http.Request) response.Response { s := d.State() - id, err := url.PathUnescape(mux.Vars(r)["id"]) + id, err := url.PathUnescape(r.PathValue("id")) if err != nil { return response.SmartError(err) } @@ -918,7 +916,7 @@ func operationsGetByType(s *state.State, r *http.Request, projectName string, op func operationWaitGet(d *Daemon, r *http.Request) response.Response { s := d.State() - id, err := url.PathUnescape(mux.Vars(r)["id"]) + id, err := url.PathUnescape(r.PathValue("id")) if err != nil { return response.SmartError(err) } @@ -1105,7 +1103,7 @@ func (r *operationWebSocket) Code() int { func operationWebsocketGet(d *Daemon, r *http.Request) response.Response { s := d.State() - id, err := url.PathUnescape(mux.Vars(r)["id"]) + id, err := url.PathUnescape(r.PathValue("id")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/profiles.go b/cmd/incusd/profiles.go index a29c6b952db..c4d0a6b2159 100644 --- a/cmd/incusd/profiles.go +++ b/cmd/incusd/profiles.go @@ -10,8 +10,6 @@ import ( "net/http" "net/url" - "github.com/gorilla/mux" - incus "github.com/lxc/incus/v6/client" "github.com/lxc/incus/v6/internal/filter" "github.com/lxc/incus/v6/internal/jmap" @@ -459,7 +457,7 @@ func profileGet(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -546,7 +544,7 @@ func profilePut(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -661,7 +659,7 @@ func profilePatch(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -788,7 +786,7 @@ func profilePost(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } @@ -876,7 +874,7 @@ func profileDelete(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - name, err := url.PathUnescape(mux.Vars(r)["name"]) + name, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/resources.go b/cmd/incusd/resources.go index fe01ec264f5..1430eff7524 100644 --- a/cmd/incusd/resources.go +++ b/cmd/incusd/resources.go @@ -4,8 +4,6 @@ import ( "net/http" "net/url" - "github.com/gorilla/mux" - "github.com/lxc/incus/v6/internal/server/auth" "github.com/lxc/incus/v6/internal/server/response" storagePools "github.com/lxc/incus/v6/internal/server/storage" @@ -133,7 +131,7 @@ func storagePoolResourcesGet(d *Daemon, r *http.Request) response.Response { } // Get the existing storage pool - poolName, err := url.PathUnescape(mux.Vars(r)["name"]) + poolName, err := url.PathUnescape(r.PathValue("name")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/storage_buckets.go b/cmd/incusd/storage_buckets.go index 17fdd6966b1..4b48b4cc70f 100644 --- a/cmd/incusd/storage_buckets.go +++ b/cmd/incusd/storage_buckets.go @@ -11,8 +11,6 @@ import ( "os" "sort" - "github.com/gorilla/mux" - "github.com/lxc/incus/v6/internal/filter" "github.com/lxc/incus/v6/internal/server/auth" "github.com/lxc/incus/v6/internal/server/backup" @@ -192,7 +190,7 @@ func storagePoolBucketsGet(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } @@ -354,7 +352,7 @@ func storagePoolBucketGet(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } @@ -368,7 +366,7 @@ func storagePoolBucketGet(d *Daemon, r *http.Request) response.Response { return response.BadRequest(errors.New("Storage pool does not support buckets")) } - bucketName, err := url.PathUnescape(mux.Vars(r)["bucketName"]) + bucketName, err := url.PathUnescape(r.PathValue("bucketName")) if err != nil { return response.SmartError(err) } @@ -438,7 +436,7 @@ func storagePoolBucketsPost(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } @@ -599,7 +597,7 @@ func storagePoolBucketPut(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } @@ -609,7 +607,7 @@ func storagePoolBucketPut(d *Daemon, r *http.Request) response.Response { return response.SmartError(fmt.Errorf("Failed loading storage pool: %w", err)) } - bucketName, err := url.PathUnescape(mux.Vars(r)["bucketName"]) + bucketName, err := url.PathUnescape(r.PathValue("bucketName")) if err != nil { return response.SmartError(err) } @@ -696,7 +694,7 @@ func storagePoolBucketDelete(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } @@ -706,7 +704,7 @@ func storagePoolBucketDelete(d *Daemon, r *http.Request) response.Response { return response.SmartError(fmt.Errorf("Failed loading storage pool: %w", err)) } - bucketName, err := url.PathUnescape(mux.Vars(r)["bucketName"]) + bucketName, err := url.PathUnescape(r.PathValue("bucketName")) if err != nil { return response.SmartError(err) } @@ -828,7 +826,7 @@ func storagePoolBucketKeysGet(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } @@ -843,7 +841,7 @@ func storagePoolBucketKeysGet(d *Daemon, r *http.Request) response.Response { return response.BadRequest(fmt.Errorf("Storage pool driver %q does not support buckets", driverInfo.Name)) } - bucketName, err := url.PathUnescape(mux.Vars(r)["bucketName"]) + bucketName, err := url.PathUnescape(r.PathValue("bucketName")) if err != nil { return response.SmartError(err) } @@ -933,12 +931,12 @@ func storagePoolBucketKeysPost(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } - bucketName, err := url.PathUnescape(mux.Vars(r)["bucketName"]) + bucketName, err := url.PathUnescape(r.PathValue("bucketName")) if err != nil { return response.SmartError(err) } @@ -1008,7 +1006,7 @@ func storagePoolBucketKeyDelete(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } @@ -1018,12 +1016,12 @@ func storagePoolBucketKeyDelete(d *Daemon, r *http.Request) response.Response { return response.SmartError(fmt.Errorf("Failed loading storage pool: %w", err)) } - bucketName, err := url.PathUnescape(mux.Vars(r)["bucketName"]) + bucketName, err := url.PathUnescape(r.PathValue("bucketName")) if err != nil { return response.SmartError(err) } - keyName, err := url.PathUnescape(mux.Vars(r)["keyName"]) + keyName, err := url.PathUnescape(r.PathValue("keyName")) if err != nil { return response.SmartError(err) } @@ -1091,7 +1089,7 @@ func storagePoolBucketKeyGet(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } @@ -1105,12 +1103,12 @@ func storagePoolBucketKeyGet(d *Daemon, r *http.Request) response.Response { return response.BadRequest(errors.New("Storage pool does not support buckets")) } - bucketName, err := url.PathUnescape(mux.Vars(r)["bucketName"]) + bucketName, err := url.PathUnescape(r.PathValue("bucketName")) if err != nil { return response.SmartError(err) } - keyName, err := url.PathUnescape(mux.Vars(r)["keyName"]) + keyName, err := url.PathUnescape(r.PathValue("keyName")) if err != nil { return response.SmartError(err) } @@ -1191,7 +1189,7 @@ func storagePoolBucketKeyPut(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } @@ -1201,12 +1199,12 @@ func storagePoolBucketKeyPut(d *Daemon, r *http.Request) response.Response { return response.SmartError(fmt.Errorf("Failed loading storage pool: %w", err)) } - bucketName, err := url.PathUnescape(mux.Vars(r)["bucketName"]) + bucketName, err := url.PathUnescape(r.PathValue("bucketName")) if err != nil { return response.SmartError(err) } - keyName, err := url.PathUnescape(mux.Vars(r)["keyName"]) + keyName, err := url.PathUnescape(r.PathValue("keyName")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/storage_buckets_backup.go b/cmd/incusd/storage_buckets_backup.go index 71eeee9bc32..0895be3f8c0 100644 --- a/cmd/incusd/storage_buckets_backup.go +++ b/cmd/incusd/storage_buckets_backup.go @@ -10,8 +10,6 @@ import ( "strings" "time" - "github.com/gorilla/mux" - internalInstance "github.com/lxc/incus/v6/internal/instance" "github.com/lxc/incus/v6/internal/jmap" "github.com/lxc/incus/v6/internal/server/auth" @@ -167,7 +165,7 @@ func storagePoolBucketBackupsGet(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } @@ -181,7 +179,7 @@ func storagePoolBucketBackupsGet(d *Daemon, r *http.Request) response.Response { return response.BadRequest(errors.New("Storage pool does not support buckets")) } - bucketName, err := url.PathUnescape(mux.Vars(r)["bucketName"]) + bucketName, err := url.PathUnescape(r.PathValue("bucketName")) if err != nil { return response.SmartError(err) } @@ -256,7 +254,7 @@ func storagePoolBucketBackupsPost(d *Daemon, r *http.Request) response.Response return response.SmartError(err) } - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } @@ -270,7 +268,7 @@ func storagePoolBucketBackupsPost(d *Daemon, r *http.Request) response.Response return response.BadRequest(errors.New("Storage pool does not support buckets")) } - bucketName, err := url.PathUnescape(mux.Vars(r)["bucketName"]) + bucketName, err := url.PathUnescape(r.PathValue("bucketName")) if err != nil { return response.SmartError(err) } @@ -457,7 +455,7 @@ func storagePoolBucketBackupGet(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } @@ -471,12 +469,12 @@ func storagePoolBucketBackupGet(d *Daemon, r *http.Request) response.Response { return response.BadRequest(errors.New("Storage pool does not support buckets")) } - bucketName, err := url.PathUnescape(mux.Vars(r)["bucketName"]) + bucketName, err := url.PathUnescape(r.PathValue("bucketName")) if err != nil { return response.SmartError(err) } - backupName, err := url.PathUnescape(mux.Vars(r)["backupName"]) + backupName, err := url.PathUnescape(r.PathValue("backupName")) if err != nil { return response.SmartError(err) } @@ -541,7 +539,7 @@ func storagePoolBucketBackupPost(d *Daemon, r *http.Request) response.Response { return response.SmartError(err) } - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } @@ -555,12 +553,12 @@ func storagePoolBucketBackupPost(d *Daemon, r *http.Request) response.Response { return response.BadRequest(errors.New("Storage pool does not support buckets")) } - bucketName, err := url.PathUnescape(mux.Vars(r)["bucketName"]) + bucketName, err := url.PathUnescape(r.PathValue("bucketName")) if err != nil { return response.SmartError(err) } - backupName, err := url.PathUnescape(mux.Vars(r)["backupName"]) + backupName, err := url.PathUnescape(r.PathValue("backupName")) if err != nil { return response.SmartError(err) } @@ -653,7 +651,7 @@ func storagePoolBucketBackupDelete(d *Daemon, r *http.Request) response.Response return response.SmartError(err) } - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } @@ -667,12 +665,12 @@ func storagePoolBucketBackupDelete(d *Daemon, r *http.Request) response.Response return response.BadRequest(errors.New("Storage pool does not support buckets")) } - bucketName, err := url.PathUnescape(mux.Vars(r)["bucketName"]) + bucketName, err := url.PathUnescape(r.PathValue("bucketName")) if err != nil { return response.SmartError(err) } - backupName, err := url.PathUnescape(mux.Vars(r)["backupName"]) + backupName, err := url.PathUnescape(r.PathValue("backupName")) if err != nil { return response.SmartError(err) } @@ -747,7 +745,7 @@ func storagePoolBucketBackupExportGet(d *Daemon, r *http.Request) response.Respo return response.SmartError(err) } - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } @@ -761,13 +759,13 @@ func storagePoolBucketBackupExportGet(d *Daemon, r *http.Request) response.Respo return response.BadRequest(errors.New("Storage pool does not support buckets")) } - bucketName, err := url.PathUnescape(mux.Vars(r)["bucketName"]) + bucketName, err := url.PathUnescape(r.PathValue("bucketName")) if err != nil { return response.SmartError(err) } // Get backup name. - backupName, err := url.PathUnescape(mux.Vars(r)["backupName"]) + backupName, err := url.PathUnescape(r.PathValue("backupName")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/storage_pools.go b/cmd/incusd/storage_pools.go index e44d1210121..6d412c7325e 100644 --- a/cmd/incusd/storage_pools.go +++ b/cmd/incusd/storage_pools.go @@ -11,8 +11,6 @@ import ( "slices" "sync" - "github.com/gorilla/mux" - incus "github.com/lxc/incus/v6/client" "github.com/lxc/incus/v6/internal/filter" "github.com/lxc/incus/v6/internal/server/auth" @@ -711,7 +709,7 @@ func storagePoolGet(d *Daemon, r *http.Request) response.Response { return resp } - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } @@ -828,7 +826,7 @@ func storagePoolPut(d *Daemon, r *http.Request) response.Response { return resp } - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } @@ -1049,7 +1047,7 @@ func doStoragePoolUpdate(s *state.State, pool storagePools.Pool, req api.Storage func storagePoolDelete(d *Daemon, r *http.Request) response.Response { s := d.State() - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/storage_volumes.go b/cmd/incusd/storage_volumes.go index 52b21775441..e0d6cf87a49 100644 --- a/cmd/incusd/storage_volumes.go +++ b/cmd/incusd/storage_volumes.go @@ -18,7 +18,6 @@ import ( "strings" "time" - "github.com/gorilla/mux" "github.com/gorilla/websocket" "github.com/lxc/incus/v6/internal/filter" @@ -316,13 +315,13 @@ func storagePoolVolumesGet(d *Daemon, r *http.Request) response.Response { targetMember := request.QueryParam(r, "target") memberSpecific := targetMember != "" - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } // Get the name of the volume type. - volumeTypeName, err := url.PathUnescape(mux.Vars(r)["type"]) + volumeTypeName, err := url.PathUnescape(r.PathValue("type")) if err != nil { return response.SmartError(err) } @@ -643,7 +642,7 @@ func filterVolumes(volumes []*db.StorageVolume, clauses *filter.ClauseSet, allPr func storagePoolVolumesPost(d *Daemon, r *http.Request) response.Response { s := d.State() - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } @@ -692,9 +691,8 @@ func storagePoolVolumesPost(d *Daemon, r *http.Request) response.Response { } // Handle being called through the typed URL. - _, ok := mux.Vars(r)["type"] - if ok { - req.Type, err = url.PathUnescape(mux.Vars(r)["type"]) + if r.PathValue("type") != "" { + req.Type, err = url.PathUnescape(r.PathValue("type")) if err != nil { return response.SmartError(err) } @@ -1048,12 +1046,12 @@ func storagePoolVolumePost(d *Daemon, r *http.Request) response.Response { s := d.State() // Get the name of the storage volume. - volumeName, err := url.PathUnescape(mux.Vars(r)["volumeName"]) + volumeName, err := url.PathUnescape(r.PathValue("volumeName")) if err != nil { return response.SmartError(err) } - volumeTypeName, err := url.PathUnescape(mux.Vars(r)["type"]) + volumeTypeName, err := url.PathUnescape(r.PathValue("type")) if err != nil { return response.SmartError(err) } @@ -1063,7 +1061,7 @@ func storagePoolVolumePost(d *Daemon, r *http.Request) response.Response { } // Get the name of the storage pool the volume is supposed to be attached to. - srcPoolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + srcPoolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } @@ -1706,19 +1704,19 @@ func storagePoolVolumeTypePostMove(s *state.State, r *http.Request, poolName str func storagePoolVolumeGet(d *Daemon, r *http.Request) response.Response { s := d.State() - volumeTypeName, err := url.PathUnescape(mux.Vars(r)["type"]) + volumeTypeName, err := url.PathUnescape(r.PathValue("type")) if err != nil { return response.SmartError(err) } // Get the name of the storage volume. - volumeName, err := url.PathUnescape(mux.Vars(r)["volumeName"]) + volumeName, err := url.PathUnescape(r.PathValue("volumeName")) if err != nil { return response.SmartError(err) } // Get the name of the storage pool the volume is supposed to be attached to. - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } @@ -1822,19 +1820,19 @@ func storagePoolVolumePut(d *Daemon, r *http.Request) response.Response { s := d.State() projectName := request.ProjectParam(r) - volumeTypeName, err := url.PathUnescape(mux.Vars(r)["type"]) + volumeTypeName, err := url.PathUnescape(r.PathValue("type")) if err != nil { return response.SmartError(err) } // Get the name of the storage volume. - volumeName, err := url.PathUnescape(mux.Vars(r)["volumeName"]) + volumeName, err := url.PathUnescape(r.PathValue("volumeName")) if err != nil { return response.SmartError(err) } // Get the name of the storage pool the volume is supposed to be attached to. - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } @@ -1993,12 +1991,12 @@ func storagePoolVolumePatch(d *Daemon, r *http.Request) response.Response { s := d.State() // Get the name of the storage volume. - volumeName, err := url.PathUnescape(mux.Vars(r)["volumeName"]) + volumeName, err := url.PathUnescape(r.PathValue("volumeName")) if err != nil { return response.SmartError(err) } - volumeTypeName, err := url.PathUnescape(mux.Vars(r)["type"]) + volumeTypeName, err := url.PathUnescape(r.PathValue("type")) if err != nil { return response.SmartError(err) } @@ -2008,7 +2006,7 @@ func storagePoolVolumePatch(d *Daemon, r *http.Request) response.Response { } // Get the name of the storage pool the volume is supposed to be attached to. - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } @@ -2125,12 +2123,12 @@ func storagePoolVolumeDelete(d *Daemon, r *http.Request) response.Response { s := d.State() // Get the name of the storage volume. - volumeName, err := url.PathUnescape(mux.Vars(r)["volumeName"]) + volumeName, err := url.PathUnescape(r.PathValue("volumeName")) if err != nil { return response.SmartError(err) } - volumeTypeName, err := url.PathUnescape(mux.Vars(r)["type"]) + volumeTypeName, err := url.PathUnescape(r.PathValue("type")) if err != nil { return response.SmartError(err) } @@ -2140,7 +2138,7 @@ func storagePoolVolumeDelete(d *Daemon, r *http.Request) response.Response { } // Get the name of the storage pool the volume is supposed to be attached to. - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/storage_volumes_backup.go b/cmd/incusd/storage_volumes_backup.go index ff96e2075bb..a5620324e94 100644 --- a/cmd/incusd/storage_volumes_backup.go +++ b/cmd/incusd/storage_volumes_backup.go @@ -9,8 +9,6 @@ import ( "strings" "time" - "github.com/gorilla/mux" - internalInstance "github.com/lxc/incus/v6/internal/instance" "github.com/lxc/incus/v6/internal/jmap" "github.com/lxc/incus/v6/internal/server/auth" @@ -163,19 +161,19 @@ func storagePoolVolumeTypeCustomBackupsGet(d *Daemon, r *http.Request) response. } // Get the name of the storage volume. - volumeName, err := url.PathUnescape(mux.Vars(r)["volumeName"]) + volumeName, err := url.PathUnescape(r.PathValue("volumeName")) if err != nil { return response.SmartError(err) } // Get the name of the storage pool the volume is supposed to be attached to. - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } // Get the volume type. - volumeTypeName, err := url.PathUnescape(mux.Vars(r)["type"]) + volumeTypeName, err := url.PathUnescape(r.PathValue("type")) if err != nil { return response.SmartError(err) } @@ -289,19 +287,19 @@ func storagePoolVolumeTypeCustomBackupsPost(d *Daemon, r *http.Request) response s := d.State() // Get the name of the storage volume. - volumeName, err := url.PathUnescape(mux.Vars(r)["volumeName"]) + volumeName, err := url.PathUnescape(r.PathValue("volumeName")) if err != nil { return response.SmartError(err) } // Get the name of the storage pool the volume is supposed to be attached to. - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } // Get the volume type. - volumeTypeName, err := url.PathUnescape(mux.Vars(r)["type"]) + volumeTypeName, err := url.PathUnescape(r.PathValue("type")) if err != nil { return response.SmartError(err) } @@ -537,25 +535,25 @@ func storagePoolVolumeTypeCustomBackupGet(d *Daemon, r *http.Request) response.R s := d.State() // Get the name of the storage volume. - volumeName, err := url.PathUnescape(mux.Vars(r)["volumeName"]) + volumeName, err := url.PathUnescape(r.PathValue("volumeName")) if err != nil { return response.SmartError(err) } // Get the name of the storage pool the volume is supposed to be attached to. - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } // Get the volume type. - volumeTypeName, err := url.PathUnescape(mux.Vars(r)["type"]) + volumeTypeName, err := url.PathUnescape(r.PathValue("type")) if err != nil { return response.SmartError(err) } // Get backup name. - backupName, err := url.PathUnescape(mux.Vars(r)["backupName"]) + backupName, err := url.PathUnescape(r.PathValue("backupName")) if err != nil { return response.SmartError(err) } @@ -637,25 +635,25 @@ func storagePoolVolumeTypeCustomBackupPost(d *Daemon, r *http.Request) response. s := d.State() // Get the name of the storage volume. - volumeName, err := url.PathUnescape(mux.Vars(r)["volumeName"]) + volumeName, err := url.PathUnescape(r.PathValue("volumeName")) if err != nil { return response.SmartError(err) } // Get the name of the storage pool the volume is supposed to be attached to. - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } // Get the volume type. - volumeTypeName, err := url.PathUnescape(mux.Vars(r)["type"]) + volumeTypeName, err := url.PathUnescape(r.PathValue("type")) if err != nil { return response.SmartError(err) } // Get backup name. - backupName, err := url.PathUnescape(mux.Vars(r)["backupName"]) + backupName, err := url.PathUnescape(r.PathValue("backupName")) if err != nil { return response.SmartError(err) } @@ -765,25 +763,25 @@ func storagePoolVolumeTypeCustomBackupDelete(d *Daemon, r *http.Request) respons s := d.State() // Get the name of the storage volume. - volumeName, err := url.PathUnescape(mux.Vars(r)["volumeName"]) + volumeName, err := url.PathUnescape(r.PathValue("volumeName")) if err != nil { return response.SmartError(err) } // Get the name of the storage pool the volume is supposed to be attached to. - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } // Get the volume type. - volumeTypeName, err := url.PathUnescape(mux.Vars(r)["type"]) + volumeTypeName, err := url.PathUnescape(r.PathValue("type")) if err != nil { return response.SmartError(err) } // Get backup name. - backupName, err := url.PathUnescape(mux.Vars(r)["backupName"]) + backupName, err := url.PathUnescape(r.PathValue("backupName")) if err != nil { return response.SmartError(err) } @@ -875,25 +873,25 @@ func storagePoolVolumeTypeCustomBackupExportGet(d *Daemon, r *http.Request) resp s := d.State() // Get the name of the storage volume. - volumeName, err := url.PathUnescape(mux.Vars(r)["volumeName"]) + volumeName, err := url.PathUnescape(r.PathValue("volumeName")) if err != nil { return response.SmartError(err) } // Get the name of the storage pool the volume is supposed to be attached to. - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } // Get the volume type. - volumeTypeName, err := url.PathUnescape(mux.Vars(r)["type"]) + volumeTypeName, err := url.PathUnescape(r.PathValue("type")) if err != nil { return response.SmartError(err) } // Get backup name. - backupName, err := url.PathUnescape(mux.Vars(r)["backupName"]) + backupName, err := url.PathUnescape(r.PathValue("backupName")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/storage_volumes_file.go b/cmd/incusd/storage_volumes_file.go index edd55bf6cc4..ccd629b417b 100644 --- a/cmd/incusd/storage_volumes_file.go +++ b/cmd/incusd/storage_volumes_file.go @@ -7,8 +7,6 @@ import ( "net/url" "slices" - "github.com/gorilla/mux" - "github.com/lxc/incus/v6/internal/server/lifecycle" "github.com/lxc/incus/v6/internal/server/project" "github.com/lxc/incus/v6/internal/server/request" @@ -23,19 +21,19 @@ import ( func storagePoolVolumeTypeFileHandler(d *Daemon, r *http.Request) response.Response { s := d.State() - volumeTypeName, err := url.PathUnescape(mux.Vars(r)["type"]) + volumeTypeName, err := url.PathUnescape(r.PathValue("type")) if err != nil { return response.SmartError(err) } // Get the name of the storage volume. - volumeName, err := url.PathUnescape(mux.Vars(r)["volumeName"]) + volumeName, err := url.PathUnescape(r.PathValue("volumeName")) if err != nil { return response.SmartError(err) } // Get the name of the storage pool the volume is supposed to be attached to. - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/storage_volumes_sftp.go b/cmd/incusd/storage_volumes_sftp.go index 53035dfae22..37e9f48a65d 100644 --- a/cmd/incusd/storage_volumes_sftp.go +++ b/cmd/incusd/storage_volumes_sftp.go @@ -7,8 +7,6 @@ import ( "net/url" "slices" - "github.com/gorilla/mux" - "github.com/lxc/incus/v6/internal/server/cluster" "github.com/lxc/incus/v6/internal/server/project" "github.com/lxc/incus/v6/internal/server/request" @@ -49,17 +47,17 @@ func storagePoolVolumeTypeSFTPHandler(d *Daemon, r *http.Request) response.Respo } // Get the volume details. - volumeTypeName, err := url.PathUnescape(mux.Vars(r)["type"]) + volumeTypeName, err := url.PathUnescape(r.PathValue("type")) if err != nil { return response.SmartError(err) } - volumeName, err := url.PathUnescape(mux.Vars(r)["volumeName"]) + volumeName, err := url.PathUnescape(r.PathValue("volumeName")) if err != nil { return response.SmartError(err) } - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/storage_volumes_snapshot.go b/cmd/incusd/storage_volumes_snapshot.go index 0325164d987..c86a6fd061b 100644 --- a/cmd/incusd/storage_volumes_snapshot.go +++ b/cmd/incusd/storage_volumes_snapshot.go @@ -14,7 +14,6 @@ import ( "time" "github.com/flosch/pongo2/v6" - "github.com/gorilla/mux" internalInstance "github.com/lxc/incus/v6/internal/instance" "github.com/lxc/incus/v6/internal/server/auth" @@ -95,19 +94,19 @@ func storagePoolVolumeSnapshotsTypePost(d *Daemon, r *http.Request) response.Res s := d.State() // Get the name of the pool. - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } // Get the name of the volume type. - volumeTypeName, err := url.PathUnescape(mux.Vars(r)["type"]) + volumeTypeName, err := url.PathUnescape(r.PathValue("type")) if err != nil { return response.SmartError(err) } // Get the name of the volume. - volumeName, err := url.PathUnescape(mux.Vars(r)["volumeName"]) + volumeName, err := url.PathUnescape(r.PathValue("volumeName")) if err != nil { return response.SmartError(err) } @@ -386,7 +385,7 @@ func storagePoolVolumeSnapshotsTypeGet(d *Daemon, r *http.Request) response.Resp s := d.State() // Get the name of the pool the storage volume is supposed to be attached to. - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } @@ -394,13 +393,13 @@ func storagePoolVolumeSnapshotsTypeGet(d *Daemon, r *http.Request) response.Resp recursion := localUtil.IsRecursionRequest(r) // Get the name of the volume type. - volumeTypeName, err := url.PathUnescape(mux.Vars(r)["type"]) + volumeTypeName, err := url.PathUnescape(r.PathValue("type")) if err != nil { return response.SmartError(err) } // Get the name of the volume type. - volumeName, err := url.PathUnescape(mux.Vars(r)["volumeName"]) + volumeName, err := url.PathUnescape(r.PathValue("volumeName")) if err != nil { return response.SmartError(err) } @@ -544,25 +543,25 @@ func storagePoolVolumeSnapshotTypePost(d *Daemon, r *http.Request) response.Resp s := d.State() // Get the name of the storage pool the volume is supposed to be attached to. - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } // Get the name of the volume type. - volumeTypeName, err := url.PathUnescape(mux.Vars(r)["type"]) + volumeTypeName, err := url.PathUnescape(r.PathValue("type")) if err != nil { return response.SmartError(err) } // Get the name of the storage volume. - volumeName, err := url.PathUnescape(mux.Vars(r)["volumeName"]) + volumeName, err := url.PathUnescape(r.PathValue("volumeName")) if err != nil { return response.SmartError(err) } // Get the name of the storage volume. - snapshotName, err := url.PathUnescape(mux.Vars(r)["snapshotName"]) + snapshotName, err := url.PathUnescape(r.PathValue("snapshotName")) if err != nil { return response.SmartError(err) } @@ -690,25 +689,25 @@ func storagePoolVolumeSnapshotTypeGet(d *Daemon, r *http.Request) response.Respo // Get the name of the storage pool the volume is supposed to be // attached to. - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } // Get the name of the volume type. - volumeTypeName, err := url.PathUnescape(mux.Vars(r)["type"]) + volumeTypeName, err := url.PathUnescape(r.PathValue("type")) if err != nil { return response.SmartError(err) } // Get the name of the storage volume. - volumeName, err := url.PathUnescape(mux.Vars(r)["volumeName"]) + volumeName, err := url.PathUnescape(r.PathValue("volumeName")) if err != nil { return response.SmartError(err) } // Get the name of the storage volume. - snapshotName, err := url.PathUnescape(mux.Vars(r)["snapshotName"]) + snapshotName, err := url.PathUnescape(r.PathValue("snapshotName")) if err != nil { return response.SmartError(err) } @@ -820,25 +819,25 @@ func storagePoolVolumeSnapshotTypePut(d *Daemon, r *http.Request) response.Respo // Get the name of the storage pool the volume is supposed to be // attached to. - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } // Get the name of the volume type. - volumeTypeName, err := url.PathUnescape(mux.Vars(r)["type"]) + volumeTypeName, err := url.PathUnescape(r.PathValue("type")) if err != nil { return response.SmartError(err) } // Get the name of the storage volume. - volumeName, err := url.PathUnescape(mux.Vars(r)["volumeName"]) + volumeName, err := url.PathUnescape(r.PathValue("volumeName")) if err != nil { return response.SmartError(err) } // Get the name of the storage volume. - snapshotName, err := url.PathUnescape(mux.Vars(r)["snapshotName"]) + snapshotName, err := url.PathUnescape(r.PathValue("snapshotName")) if err != nil { return response.SmartError(err) } @@ -955,25 +954,25 @@ func storagePoolVolumeSnapshotTypePatch(d *Daemon, r *http.Request) response.Res // Get the name of the storage pool the volume is supposed to be // attached to. - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } // Get the name of the volume type. - volumeTypeName, err := url.PathUnescape(mux.Vars(r)["type"]) + volumeTypeName, err := url.PathUnescape(r.PathValue("type")) if err != nil { return response.SmartError(err) } // Get the name of the storage volume. - volumeName, err := url.PathUnescape(mux.Vars(r)["volumeName"]) + volumeName, err := url.PathUnescape(r.PathValue("volumeName")) if err != nil { return response.SmartError(err) } // Get the name of the storage volume. - snapshotName, err := url.PathUnescape(mux.Vars(r)["snapshotName"]) + snapshotName, err := url.PathUnescape(r.PathValue("snapshotName")) if err != nil { return response.SmartError(err) } @@ -1120,25 +1119,25 @@ func storagePoolVolumeSnapshotTypeDelete(d *Daemon, r *http.Request) response.Re s := d.State() // Get the name of the storage pool the volume is supposed to be attached to. - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } // Get the name of the volume type. - volumeTypeName, err := url.PathUnescape(mux.Vars(r)["type"]) + volumeTypeName, err := url.PathUnescape(r.PathValue("type")) if err != nil { return response.SmartError(err) } // Get the name of the storage volume. - volumeName, err := url.PathUnescape(mux.Vars(r)["volumeName"]) + volumeName, err := url.PathUnescape(r.PathValue("volumeName")) if err != nil { return response.SmartError(err) } // Get the name of the storage volume. - snapshotName, err := url.PathUnescape(mux.Vars(r)["snapshotName"]) + snapshotName, err := url.PathUnescape(r.PathValue("snapshotName")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/storage_volumes_state.go b/cmd/incusd/storage_volumes_state.go index eaf0b704188..5b8bc98d843 100644 --- a/cmd/incusd/storage_volumes_state.go +++ b/cmd/incusd/storage_volumes_state.go @@ -7,8 +7,6 @@ import ( "net/url" "slices" - "github.com/gorilla/mux" - "github.com/lxc/incus/v6/internal/server/auth" "github.com/lxc/incus/v6/internal/server/db" "github.com/lxc/incus/v6/internal/server/instance" @@ -75,19 +73,19 @@ func storagePoolVolumeTypeStateGet(d *Daemon, r *http.Request) response.Response s := d.State() // Get the name of the pool the storage volume is supposed to be attached to. - poolName, err := url.PathUnescape(mux.Vars(r)["poolName"]) + poolName, err := url.PathUnescape(r.PathValue("poolName")) if err != nil { return response.SmartError(err) } // Get the name of the volume type. - volumeTypeName, err := url.PathUnescape(mux.Vars(r)["type"]) + volumeTypeName, err := url.PathUnescape(r.PathValue("type")) if err != nil { return response.SmartError(err) } // Get the name of the volume type. - volumeName, err := url.PathUnescape(mux.Vars(r)["volumeName"]) + volumeName, err := url.PathUnescape(r.PathValue("volumeName")) if err != nil { return response.SmartError(err) } diff --git a/cmd/incusd/warnings.go b/cmd/incusd/warnings.go index 5467da5b59c..c0918c580c0 100644 --- a/cmd/incusd/warnings.go +++ b/cmd/incusd/warnings.go @@ -11,8 +11,6 @@ import ( "strconv" "time" - "github.com/gorilla/mux" - "github.com/lxc/incus/v6/internal/filter" "github.com/lxc/incus/v6/internal/server/auth" "github.com/lxc/incus/v6/internal/server/db" @@ -264,7 +262,7 @@ func warningsGet(d *Daemon, r *http.Request) response.Response { // "500": // $ref: "#/responses/InternalServerError" func warningGet(d *Daemon, r *http.Request) response.Response { - id, err := url.PathUnescape(mux.Vars(r)["id"]) + id, err := url.PathUnescape(r.PathValue("id")) if err != nil { return response.SmartError(err) } @@ -353,7 +351,7 @@ func warningPatch(d *Daemon, r *http.Request) response.Response { func warningPut(d *Daemon, r *http.Request) response.Response { s := d.State() - id, err := url.PathUnescape(mux.Vars(r)["id"]) + id, err := url.PathUnescape(r.PathValue("id")) if err != nil { return response.SmartError(err) } @@ -414,7 +412,7 @@ func warningPut(d *Daemon, r *http.Request) response.Response { func warningDelete(d *Daemon, r *http.Request) response.Response { s := d.State() - id, err := url.PathUnescape(mux.Vars(r)["id"]) + id, err := url.PathUnescape(r.PathValue("id")) if err != nil { return response.SmartError(err) } diff --git a/go.mod b/go.mod index 98c304284a3..0d7bcf95235 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,6 @@ require ( github.com/golang-jwt/jwt/v5 v5.3.0 github.com/google/gopacket v1.1.19 github.com/google/uuid v1.6.0 - github.com/gorilla/mux v1.8.1 github.com/gorilla/websocket v1.5.3 github.com/gosexy/gettext v0.0.0-20160830220431-74466a0a0c4a github.com/insomniacslk/dhcp v0.0.0-20251007151141-da879a2c3546 diff --git a/go.sum b/go.sum index 3aa8fc9b1e5..52828143c2d 100644 --- a/go.sum +++ b/go.sum @@ -268,8 +268,6 @@ github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= -github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= diff --git a/internal/server/auth/authorization_objects.go b/internal/server/auth/authorization_objects.go index aade093806b..236dcb1e585 100644 --- a/internal/server/auth/authorization_objects.go +++ b/internal/server/auth/authorization_objects.go @@ -7,8 +7,6 @@ import ( "net/url" "strings" - "github.com/gorilla/mux" - "github.com/lxc/incus/v6/internal/version" ) @@ -191,7 +189,6 @@ func ObjectFromRequest(r *http.Request, objectType ObjectType, expandProject fun location := values.Get("target") muxValues := make([]string, 0, len(muxVars)) - vars := mux.Vars(r) for _, muxVar := range muxVars { var err error var muxValue string @@ -201,14 +198,14 @@ func ObjectFromRequest(r *http.Request, objectType ObjectType, expandProject fun if location != "" { muxValue = location } else if objectType == ObjectTypeStorageVolume { - muxValue = expandVolumeLocation(projectName, vars["poolName"], vars["type"], vars["volumeName"]) + muxValue = expandVolumeLocation(projectName, r.PathValue("poolName"), r.PathValue("type"), r.PathValue("volumeName")) } if muxValue == "" { continue } } else { - muxValue, err = url.PathUnescape(vars[muxVar]) + muxValue, err = url.PathUnescape(r.PathValue(muxVar)) if err != nil { return "", fmt.Errorf("Failed to unescape mux var %q for object type %q: %w", muxVar, objectType, err) }