api utils: join url paths in a more robust way

This commit is contained in:
Nicola Murino 2019-08-05 15:17:43 +02:00
parent eb14026f6e
commit 20c7e2772a

View file

@ -8,7 +8,9 @@ import (
"io/ioutil"
"net/http"
"net/url"
"path"
"strconv"
"strings"
"time"
"github.com/drakkan/sftpgo/dataprovider"
@ -33,6 +35,13 @@ func getHTTPClient() *http.Client {
}
}
func buildURLRelativeToBase(paths ...string) string {
// we need to use path.Join and not filepath.Join
// since filepath.Join will use backslash separator on Windows
p := path.Join(paths...)
return fmt.Sprintf("%s/%s", strings.TrimRight(httpBaseURL, "/"), strings.TrimLeft(p, "/"))
}
// AddUser adds a new user and checks the received HTTP Status code against expectedStatusCode.
func AddUser(user dataprovider.User, expectedStatusCode int) (dataprovider.User, []byte, error) {
var newUser dataprovider.User
@ -41,7 +50,7 @@ func AddUser(user dataprovider.User, expectedStatusCode int) (dataprovider.User,
if err != nil {
return newUser, body, err
}
resp, err := getHTTPClient().Post(httpBaseURL+userPath, "application/json", bytes.NewBuffer(userAsJSON))
resp, err := getHTTPClient().Post(buildURLRelativeToBase(userPath), "application/json", bytes.NewBuffer(userAsJSON))
if err != nil {
return newUser, body, err
}
@ -70,7 +79,8 @@ func UpdateUser(user dataprovider.User, expectedStatusCode int) (dataprovider.Us
if err != nil {
return user, body, err
}
req, err := http.NewRequest(http.MethodPut, httpBaseURL+userPath+"/"+strconv.FormatInt(user.ID, 10), bytes.NewBuffer(userAsJSON))
req, err := http.NewRequest(http.MethodPut, buildURLRelativeToBase(userPath, strconv.FormatInt(user.ID, 10)),
bytes.NewBuffer(userAsJSON))
if err != nil {
return user, body, err
}
@ -96,7 +106,7 @@ func UpdateUser(user dataprovider.User, expectedStatusCode int) (dataprovider.Us
// RemoveUser removes an existing user and checks the received HTTP Status code against expectedStatusCode.
func RemoveUser(user dataprovider.User, expectedStatusCode int) ([]byte, error) {
var body []byte
req, err := http.NewRequest(http.MethodDelete, httpBaseURL+userPath+"/"+strconv.FormatInt(user.ID, 10), nil)
req, err := http.NewRequest(http.MethodDelete, buildURLRelativeToBase(userPath, strconv.FormatInt(user.ID, 10)), nil)
if err != nil {
return body, err
}
@ -113,7 +123,7 @@ func RemoveUser(user dataprovider.User, expectedStatusCode int) ([]byte, error)
func GetUserByID(userID int64, expectedStatusCode int) (dataprovider.User, []byte, error) {
var user dataprovider.User
var body []byte
resp, err := getHTTPClient().Get(httpBaseURL + userPath + "/" + strconv.FormatInt(userID, 10))
resp, err := getHTTPClient().Get(buildURLRelativeToBase(userPath, strconv.FormatInt(userID, 10)))
if err != nil {
return user, body, err
}
@ -134,7 +144,7 @@ func GetUserByID(userID int64, expectedStatusCode int) (dataprovider.User, []byt
func GetUsers(limit int64, offset int64, username string, expectedStatusCode int) ([]dataprovider.User, []byte, error) {
var users []dataprovider.User
var body []byte
url, err := url.Parse(httpBaseURL + userPath)
url, err := url.Parse(buildURLRelativeToBase(userPath))
if err != nil {
return users, body, err
}
@ -167,7 +177,7 @@ func GetUsers(limit int64, offset int64, username string, expectedStatusCode int
func GetQuotaScans(expectedStatusCode int) ([]sftpd.ActiveQuotaScan, []byte, error) {
var quotaScans []sftpd.ActiveQuotaScan
var body []byte
resp, err := getHTTPClient().Get(httpBaseURL + quotaScanPath)
resp, err := getHTTPClient().Get(buildURLRelativeToBase(quotaScanPath))
if err != nil {
return quotaScans, body, err
}
@ -188,7 +198,7 @@ func StartQuotaScan(user dataprovider.User, expectedStatusCode int) ([]byte, err
if err != nil {
return body, err
}
resp, err := getHTTPClient().Post(httpBaseURL+quotaScanPath, "application/json", bytes.NewBuffer(userAsJSON))
resp, err := getHTTPClient().Post(buildURLRelativeToBase(quotaScanPath), "application/json", bytes.NewBuffer(userAsJSON))
if err != nil {
return body, err
}
@ -201,7 +211,7 @@ func StartQuotaScan(user dataprovider.User, expectedStatusCode int) ([]byte, err
func GetSFTPConnections(expectedStatusCode int) ([]sftpd.ConnectionStatus, []byte, error) {
var connections []sftpd.ConnectionStatus
var body []byte
resp, err := getHTTPClient().Get(httpBaseURL + activeConnectionsPath)
resp, err := getHTTPClient().Get(buildURLRelativeToBase(activeConnectionsPath))
if err != nil {
return connections, body, err
}
@ -218,7 +228,7 @@ func GetSFTPConnections(expectedStatusCode int) ([]sftpd.ConnectionStatus, []byt
// CloseSFTPConnection closes an active SFTP connection identified by connectionID
func CloseSFTPConnection(connectionID string, expectedStatusCode int) ([]byte, error) {
var body []byte
req, err := http.NewRequest(http.MethodDelete, httpBaseURL+activeConnectionsPath+"/"+connectionID, nil)
req, err := http.NewRequest(http.MethodDelete, buildURLRelativeToBase(activeConnectionsPath, connectionID), nil)
if err != nil {
return body, err
}