Parcourir la source

simplify some httpd related code

and update chi, cobra and viper
Nicola Murino il y a 5 ans
Parent
commit
4f668bf558
4 fichiers modifiés avec 37 ajouts et 80 suppressions
  1. 3 3
      go.mod
  2. 7 6
      go.sum
  3. 22 67
      httpd/router.go
  4. 5 4
      httpd/web.go

+ 3 - 3
go.mod

@@ -9,7 +9,7 @@ require (
 	github.com/aws/aws-sdk-go v1.30.3
 	github.com/eikenb/pipeat v0.0.0-20190316224601-fb1f3a9aa29f
 	github.com/fsnotify/fsnotify v1.4.9 // indirect
-	github.com/go-chi/chi v4.1.0+incompatible
+	github.com/go-chi/chi v4.1.1+incompatible
 	github.com/go-chi/render v1.0.1
 	github.com/go-sql-driver/mysql v1.5.0
 	github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510
@@ -28,10 +28,10 @@ require (
 	github.com/rs/zerolog v1.18.0
 	github.com/spf13/afero v1.2.2 // indirect
 	github.com/spf13/cast v1.3.1 // indirect
-	github.com/spf13/cobra v0.0.7
+	github.com/spf13/cobra v1.0.0
 	github.com/spf13/jwalterweatherman v1.1.0 // indirect
 	github.com/spf13/pflag v1.0.5 // indirect
-	github.com/spf13/viper v1.6.2
+	github.com/spf13/viper v1.6.3
 	go.etcd.io/bbolt v1.3.4
 	golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59
 	golang.org/x/sys v0.0.0-20200331124033-c3d80250170d

+ 7 - 6
go.sum

@@ -53,6 +53,7 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk
 github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
 github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
 github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
+github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
 github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
 github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
@@ -75,8 +76,8 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo
 github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/go-chi/chi v4.1.0+incompatible h1:ETj3cggsVIY2Xao5ExCu6YhEh5MD6JTfcBzS37R260w=
-github.com/go-chi/chi v4.1.0+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
+github.com/go-chi/chi v4.1.1+incompatible h1:MmTgB0R8Bt/jccxp+t6S/1VGIKdJw5J74CK/c9tTfA4=
+github.com/go-chi/chi v4.1.1+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
 github.com/go-chi/render v1.0.1 h1:4/5tis2cKaNdnv9zFLfXzcquC9HbeZgCnxGnKrltBS8=
 github.com/go-chi/render v1.0.1/go.mod h1:pq4Rr7HbnsdaeHagklXub+p6Wd16Af5l9koip1OvJns=
 github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
@@ -236,8 +237,8 @@ github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTd
 github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng=
 github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
-github.com/spf13/cobra v0.0.7 h1:FfTH+vuMXOas8jmfb5/M7dzEYx7LpcLb7a0LPe34uOU=
-github.com/spf13/cobra v0.0.7/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
+github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8=
+github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
 github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
 github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
 github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
@@ -245,8 +246,8 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn
 github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
 github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
-github.com/spf13/viper v1.6.2 h1:7aKfF+e8/k68gda3LOjo5RxiUqddoFxVq4BKBPrxk5E=
-github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k=
+github.com/spf13/viper v1.6.3 h1:pDDu1OyEDTKzpJwdq4TiuLyMsUgRa/BT5cn5O62NoHs=
+github.com/spf13/viper v1.6.3/go.mod h1:jUMtyi0/lB5yZH/FjyGAoH7IMNrIhlBf6pXZmbMDvzw=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=

+ 22 - 67
httpd/router.go

@@ -2,6 +2,7 @@ package httpd
 
 import (
 	"net/http"
+	"strings"
 
 	"github.com/drakkan/sftpgo/dataprovider"
 	"github.com/drakkan/sftpgo/logger"
@@ -69,69 +70,22 @@ func initializeRouter(staticFilesPath string, profiler bool) {
 			render.JSON(w, r, sftpd.GetConnectionsStats())
 		})
 
-		router.Delete(activeConnectionsPath+"/{connectionID}", func(w http.ResponseWriter, r *http.Request) {
-			handleCloseConnection(w, r)
-		})
-
-		router.Get(quotaScanPath, func(w http.ResponseWriter, r *http.Request) {
-			getQuotaScans(w, r)
-		})
-
-		router.Post(quotaScanPath, func(w http.ResponseWriter, r *http.Request) {
-			startQuotaScan(w, r)
-		})
-
-		router.Get(userPath, func(w http.ResponseWriter, r *http.Request) {
-			getUsers(w, r)
-		})
-
-		router.Post(userPath, func(w http.ResponseWriter, r *http.Request) {
-			addUser(w, r)
-		})
-
-		router.Get(userPath+"/{userID}", func(w http.ResponseWriter, r *http.Request) {
-			getUserByID(w, r)
-		})
-
-		router.Put(userPath+"/{userID}", func(w http.ResponseWriter, r *http.Request) {
-			updateUser(w, r)
-		})
-
-		router.Delete(userPath+"/{userID}", func(w http.ResponseWriter, r *http.Request) {
-			deleteUser(w, r)
-		})
-
-		router.Get(dumpDataPath, func(w http.ResponseWriter, r *http.Request) {
-			dumpData(w, r)
-		})
-
-		router.Get(loadDataPath, func(w http.ResponseWriter, r *http.Request) {
-			loadData(w, r)
-		})
-
-		router.Get(webUsersPath, func(w http.ResponseWriter, r *http.Request) {
-			handleGetWebUsers(w, r)
-		})
-
-		router.Get(webUserPath, func(w http.ResponseWriter, r *http.Request) {
-			handleWebAddUserGet(w, r)
-		})
-
-		router.Get(webUserPath+"/{userID}", func(w http.ResponseWriter, r *http.Request) {
-			handleWebUpdateUserGet(chi.URLParam(r, "userID"), w, r)
-		})
-
-		router.Post(webUserPath, func(w http.ResponseWriter, r *http.Request) {
-			handleWebAddUserPost(w, r)
-		})
-
-		router.Post(webUserPath+"/{userID}", func(w http.ResponseWriter, r *http.Request) {
-			handleWebUpdateUserPost(chi.URLParam(r, "userID"), w, r)
-		})
-
-		router.Get(webConnectionsPath, func(w http.ResponseWriter, r *http.Request) {
-			handleWebGetConnections(w, r)
-		})
+		router.Delete(activeConnectionsPath+"/{connectionID}", handleCloseConnection)
+		router.Get(quotaScanPath, getQuotaScans)
+		router.Post(quotaScanPath, startQuotaScan)
+		router.Get(userPath, getUsers)
+		router.Post(userPath, addUser)
+		router.Get(userPath+"/{userID}", getUserByID)
+		router.Put(userPath+"/{userID}", updateUser)
+		router.Delete(userPath+"/{userID}", deleteUser)
+		router.Get(dumpDataPath, dumpData)
+		router.Get(loadDataPath, loadData)
+		router.Get(webUsersPath, handleGetWebUsers)
+		router.Get(webUserPath, handleWebAddUserGet)
+		router.Get(webUserPath+"/{userID}", handleWebUpdateUserGet)
+		router.Post(webUserPath, handleWebAddUserPost)
+		router.Post(webUserPath+"/{userID}", handleWebUpdateUserPost)
+		router.Get(webConnectionsPath, handleWebGetConnections)
 	})
 
 	router.Group(func(router chi.Router) {
@@ -155,15 +109,16 @@ func handleCloseConnection(w http.ResponseWriter, r *http.Request) {
 }
 
 func fileServer(r chi.Router, path string, root http.FileSystem) {
-	fs := http.StripPrefix(path, http.FileServer(root))
-
 	if path != "/" && path[len(path)-1] != '/' {
 		r.Get(path, http.RedirectHandler(path+"/", http.StatusMovedPermanently).ServeHTTP)
 		path += "/"
 	}
 	path += "*"
 
-	r.Get(path, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+	r.Get(path, func(w http.ResponseWriter, r *http.Request) {
+		rctx := chi.RouteContext(r.Context())
+		pathPrefix := strings.TrimSuffix(rctx.RoutePattern(), "/*")
+		fs := http.StripPrefix(pathPrefix, http.FileServer(root))
 		fs.ServeHTTP(w, r)
-	}))
+	})
 }

+ 5 - 4
httpd/web.go

@@ -17,6 +17,7 @@ import (
 	"github.com/drakkan/sftpgo/sftpd"
 	"github.com/drakkan/sftpgo/utils"
 	"github.com/drakkan/sftpgo/vfs"
+	"github.com/go-chi/chi"
 )
 
 const (
@@ -478,8 +479,8 @@ func handleWebAddUserGet(w http.ResponseWriter, r *http.Request) {
 	renderAddUserPage(w, dataprovider.User{Status: 1}, "")
 }
 
-func handleWebUpdateUserGet(userID string, w http.ResponseWriter, r *http.Request) {
-	id, err := strconv.ParseInt(userID, 10, 64)
+func handleWebUpdateUserGet(w http.ResponseWriter, r *http.Request) {
+	id, err := strconv.ParseInt(chi.URLParam(r, "userID"), 10, 64)
 	if err != nil {
 		renderBadRequestPage(w, err)
 		return
@@ -509,9 +510,9 @@ func handleWebAddUserPost(w http.ResponseWriter, r *http.Request) {
 	}
 }
 
-func handleWebUpdateUserPost(userID string, w http.ResponseWriter, r *http.Request) {
+func handleWebUpdateUserPost(w http.ResponseWriter, r *http.Request) {
 	r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize)
-	id, err := strconv.ParseInt(userID, 10, 64)
+	id, err := strconv.ParseInt(chi.URLParam(r, "userID"), 10, 64)
 	if err != nil {
 		renderBadRequestPage(w, err)
 		return