* test ServicePluginRequest with subpath

* handle subpath when routing to plugin.ServeHTTP
Этот коммит содержится в:
Jesse Hallam
2018-07-26 08:33:56 -04:00
коммит произвёл Joram Wilander
родитель b3c2ecd9b9
Коммит f8f80d80df
2 изменённых файлов: 54 добавлений и 2 удалений

Просмотреть файл

@@ -5,12 +5,14 @@ package app
import ( import (
"net/http" "net/http"
"path"
"strings" "strings"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/mattermost/mattermost-server/mlog" "github.com/mattermost/mattermost-server/mlog"
"github.com/mattermost/mattermost-server/model" "github.com/mattermost/mattermost-server/model"
"github.com/mattermost/mattermost-server/plugin" "github.com/mattermost/mattermost-server/plugin"
"github.com/mattermost/mattermost-server/utils"
) )
func (a *App) ServePluginRequest(w http.ResponseWriter, r *http.Request) { func (a *App) ServePluginRequest(w http.ResponseWriter, r *http.Request) {
@@ -26,7 +28,7 @@ func (a *App) ServePluginRequest(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r) params := mux.Vars(r)
hooks, err := a.Plugins.HooksForPlugin(params["plugin_id"]) hooks, err := a.Plugins.HooksForPlugin(params["plugin_id"])
if err != nil { if err != nil {
a.Log.Error("Access to route for non-existant plugin", mlog.String("missing_plugin_id", params["plugin_id"]), mlog.Err(err)) a.Log.Error("Access to route for non-existent plugin", mlog.String("missing_plugin_id", params["plugin_id"]), mlog.Err(err))
http.NotFound(w, r) http.NotFound(w, r)
return return
} }
@@ -67,10 +69,12 @@ func (a *App) servePluginRequest(w http.ResponseWriter, r *http.Request, handler
params := mux.Vars(r) params := mux.Vars(r)
subpath, _ := utils.GetSubpathFromConfig(a.Config())
newQuery := r.URL.Query() newQuery := r.URL.Query()
newQuery.Del("access_token") newQuery.Del("access_token")
r.URL.RawQuery = newQuery.Encode() r.URL.RawQuery = newQuery.Encode()
r.URL.Path = strings.TrimPrefix(r.URL.Path, "/plugins/"+params["plugin_id"]) r.URL.Path = strings.TrimPrefix(r.URL.Path, path.Join(subpath, "plugins", params["plugin_id"]))
handler(&plugin.Context{}, w, r) handler(&plugin.Context{}, w, r)
} }

Просмотреть файл

@@ -4,6 +4,8 @@
package app package app
import ( import (
"bytes"
"io/ioutil"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"testing" "testing"
@@ -52,6 +54,52 @@ func TestServePluginRequest(t *testing.T) {
assert.Equal(t, http.StatusNotImplemented, w.Result().StatusCode) assert.Equal(t, http.StatusNotImplemented, w.Result().StatusCode)
} }
func TestPrivateServePluginRequest(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
testCases := []struct {
Description string
ConfigFunc func(cfg *model.Config)
URL string
ExpectedURL string
}{
{
"no subpath",
func(cfg *model.Config) {},
"/plugins/id/endpoint",
"/endpoint",
},
{
"subpath",
func(cfg *model.Config) { *cfg.ServiceSettings.SiteURL += "/subpath" },
"/subpath/plugins/id/endpoint",
"/endpoint",
},
}
for _, testCase := range testCases {
t.Run(testCase.Description, func(t *testing.T) {
th.App.UpdateConfig(testCase.ConfigFunc)
expectedBody := []byte("body")
request := httptest.NewRequest(http.MethodGet, testCase.URL, bytes.NewReader(expectedBody))
recorder := httptest.NewRecorder()
handler := func(context *plugin.Context, w http.ResponseWriter, r *http.Request) {
assert.Equal(t, testCase.ExpectedURL, r.URL.Path)
body, _ := ioutil.ReadAll(r.Body)
assert.Equal(t, expectedBody, body)
}
request = mux.SetURLVars(request, map[string]string{"plugin_id": "id"})
th.App.servePluginRequest(recorder, request, handler)
})
}
}
func TestHandlePluginRequest(t *testing.T) { func TestHandlePluginRequest(t *testing.T) {
th := Setup().InitBasic() th := Setup().InitBasic()
defer th.TearDown() defer th.TearDown()