diff options
Diffstat (limited to 'api4')
-rw-r--r-- | api4/image_test.go | 5 | ||||
-rw-r--r-- | api4/webhook.go | 56 |
2 files changed, 41 insertions, 20 deletions
diff --git a/api4/image_test.go b/api4/image_test.go index 236d5785d..aa3619cdd 100644 --- a/api4/image_test.go +++ b/api4/image_test.go @@ -37,7 +37,8 @@ func TestGetImage(t *testing.T) { assert.Equal(t, http.StatusNotFound, resp.StatusCode) th.App.UpdateConfig(func(cfg *model.Config) { - cfg.ServiceSettings.ImageProxyType = model.NewString("willnorris/imageproxy") + cfg.ServiceSettings.ImageProxyType = model.NewString("atmos/camo") + cfg.ServiceSettings.ImageProxyOptions = model.NewString("foo") cfg.ServiceSettings.ImageProxyURL = model.NewString("https://proxy.foo.bar") }) @@ -48,5 +49,5 @@ func TestGetImage(t *testing.T) { resp, err = th.Client.HttpClient.Do(r) require.NoError(t, err) assert.Equal(t, http.StatusFound, resp.StatusCode) - assert.Equal(t, "https://proxy.foo.bar//"+originURL, resp.Header.Get("Location")) + assert.Equal(t, "https://proxy.foo.bar/004afe2ef382eb5f30c4490f793f8a8c5b33d8a2/687474703a2f2f666f6f2e6261722f62617a2e676966", resp.Header.Get("Location")) } diff --git a/api4/webhook.go b/api4/webhook.go index 90e32a891..e19f14704 100644 --- a/api4/webhook.go +++ b/api4/webhook.go @@ -8,7 +8,10 @@ import ( "net/http" "strings" + l4g "github.com/alecthomas/log4go" + "github.com/gorilla/mux" + "github.com/gorilla/schema" "github.com/mattermost/mattermost-server/model" "github.com/mattermost/mattermost-server/utils" ) @@ -447,34 +450,40 @@ func incomingWebhook(c *Context, w http.ResponseWriter, r *http.Request) { r.ParseForm() - var payload io.Reader + var err *model.AppError + incomingWebhookPayload := &model.IncomingWebhookRequest{} contentType := r.Header.Get("Content-Type") if strings.Split(contentType, "; ")[0] == "application/x-www-form-urlencoded" { - payload = strings.NewReader(r.FormValue("payload")) - } else { - payload = r.Body - } + payload := strings.NewReader(r.FormValue("payload")) - if c.App.Config().LogSettings.EnableWebhookDebugging { - var err error - payload, err = utils.InfoReader( - payload, - utils.T("api.webhook.incoming.debug"), - ) + incomingWebhookPayload, err = decodePayload(payload) if err != nil { - c.Err = model.NewAppError("incomingWebhook", "api.webhook.incoming.debug.error", nil, err.Error(), http.StatusInternalServerError) + c.Err = err return } - } + } else if strings.HasPrefix(contentType, "multipart/form-data") { + r.ParseMultipartForm(0) - parsedRequest, decodeError := model.IncomingWebhookRequestFromJson(payload) + decoder := schema.NewDecoder() + err := decoder.Decode(incomingWebhookPayload, r.PostForm) - if decodeError != nil { - c.Err = decodeError - return + if err != nil { + c.Err = model.NewAppError("incomingWebhook", "api.webhook.incoming.error", nil, err.Error(), http.StatusBadRequest) + return + } + } else { + incomingWebhookPayload, err = decodePayload(r.Body) + if err != nil { + c.Err = err + return + } + } + + if c.App.Config().LogSettings.EnableWebhookDebugging { + l4g.Debug(utils.T("api.webhook.incoming.debug"), incomingWebhookPayload.ToJson()) } - err := c.App.HandleIncomingWebhook(id, parsedRequest) + err = c.App.HandleIncomingWebhook(id, incomingWebhookPayload) if err != nil { c.Err = err return @@ -499,3 +508,14 @@ func commandWebhook(c *Context, w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/plain") w.Write([]byte("ok")) } + +func decodePayload(payload io.Reader) (*model.IncomingWebhookRequest, *model.AppError) { + decodeError := &model.AppError{} + incomingWebhookPayload, decodeError := model.IncomingWebhookRequestFromJson(payload) + + if decodeError != nil { + return nil, decodeError + } + + return incomingWebhookPayload, nil +} |