diff options
-rw-r--r-- | api/webhook_test.go | 100 | ||||
-rw-r--r-- | app/webhook.go | 37 |
2 files changed, 79 insertions, 58 deletions
diff --git a/api/webhook_test.go b/api/webhook_test.go index 5a0e44630..93d596bb1 100644 --- a/api/webhook_test.go +++ b/api/webhook_test.go @@ -1005,37 +1005,37 @@ func TestIncomingWebhooks(t *testing.T) { } attachmentPayload := `{ - "text": "this is a test", - "attachments": [ - { - "fallback": "Required plain-text summary of the attachment.", + "text": "this is a test", + "attachments": [ + { + "fallback": "Required plain-text summary of the attachment.", - "color": "#36a64f", + "color": "#36a64f", - "pretext": "Optional text that appears above the attachment block", + "pretext": "Optional text that appears above the attachment block", - "author_name": "Bobby Tables", - "author_link": "http://flickr.com/bobby/", - "author_icon": "http://flickr.com/icons/bobby.jpg", + "author_name": "Bobby Tables", + "author_link": "http://flickr.com/bobby/", + "author_icon": "http://flickr.com/icons/bobby.jpg", - "title": "Slack API Documentation", - "title_link": "https://api.slack.com/", + "title": "Slack API Documentation", + "title_link": "https://api.slack.com/", - "text": "Optional text that appears within the attachment", + "text": "Optional text that appears within the attachment", - "fields": [ - { - "title": "Priority", - "value": "High", - "short": false - } - ], + "fields": [ + { + "title": "Priority", + "value": "High", + "short": false + } + ], - "image_url": "http://my-website.com/path/to/image.jpg", - "thumb_url": "http://example.com/path/to/thumb.png" - } - ] - }` + "image_url": "http://my-website.com/path/to/image.jpg", + "thumb_url": "http://example.com/path/to/thumb.png" + } + ] + }` if _, err := Client.DoPost(url, attachmentPayload, "application/json"); err != nil { t.Fatal(err) @@ -1050,42 +1050,42 @@ func TestIncomingWebhooks(t *testing.T) { tooLongText += "a" } - if _, err := Client.DoPost(url, "{\"text\":\""+tooLongText+"\"}", "application/json"); err == nil || err.StatusCode != http.StatusBadRequest { - t.Fatal("should have failed - text too long") + if _, err := Client.DoPost(url, "{\"text\":\""+tooLongText+"\"}", "application/json"); err != nil { + t.Fatal(err) } attachmentPayload = `{ - "text": "this is a test", - "attachments": [ - { - "fallback": "Required plain-text summary of the attachment.", + "text": "this is a test", + "attachments": [ + { + "fallback": "Required plain-text summary of the attachment.", - "color": "#36a64f", + "color": "#36a64f", - "pretext": "Optional text that appears above the attachment block", + "pretext": "Optional text that appears above the attachment block", - "author_name": "Bobby Tables", - "author_link": "http://flickr.com/bobby/", - "author_icon": "http://flickr.com/icons/bobby.jpg", + "author_name": "Bobby Tables", + "author_link": "http://flickr.com/bobby/", + "author_icon": "http://flickr.com/icons/bobby.jpg", - "title": "Slack API Documentation", - "title_link": "https://api.slack.com/", + "title": "Slack API Documentation", + "title_link": "https://api.slack.com/", - "text": "` + tooLongText + `", + "text": "` + tooLongText + `", - "fields": [ - { - "title": "Priority", - "value": "High", - "short": false - } - ], + "fields": [ + { + "title": "Priority", + "value": "High", + "short": false + } + ], - "image_url": "http://my-website.com/path/to/image.jpg", - "thumb_url": "http://example.com/path/to/thumb.png" - } - ] - }` + "image_url": "http://my-website.com/path/to/image.jpg", + "thumb_url": "http://example.com/path/to/thumb.png" + } + ] + }` if _, err := Client.DoPost(url, attachmentPayload, "application/json"); err == nil || err.StatusCode != http.StatusBadRequest { t.Fatal("should have failed with bad request - attachment too long") diff --git a/app/webhook.go b/app/webhook.go index 1ec96a32e..6a7bb16e1 100644 --- a/app/webhook.go +++ b/app/webhook.go @@ -150,11 +150,37 @@ func CreateWebhookPost(userId, teamId, channelId, text, overrideUsername, overri } } - if _, err := CreatePost(post, teamId, false); err != nil { - return nil, model.NewLocAppError("CreateWebhookPost", "api.post.create_webhook_post.creating.app_error", nil, "err="+err.Message) + splits := make([]string, 0) + remainingText := post.Message + + for len(remainingText) > model.POST_MESSAGE_MAX_RUNES { + splits = append(splits, remainingText[:model.POST_MESSAGE_MAX_RUNES]) + remainingText = remainingText[model.POST_MESSAGE_MAX_RUNES:] + } + + splits = append(splits, remainingText) + + var firstPost *model.Post = nil + + for _, txt := range splits { + post.Id = "" + post.UpdateAt = 0 + post.CreateAt = 0 + post.Message = txt + if _, err := CreatePost(post, teamId, false); err != nil { + return nil, model.NewLocAppError("CreateWebhookPost", "api.post.create_webhook_post.creating.app_error", nil, "err="+err.Message) + } + + if firstPost == nil { + if len(splits) > 1 { + firstPost = model.PostFromJson(strings.NewReader(post.ToJson())) + } else { + firstPost = post + } + } } - return post, nil + return firstPost, nil } func CreateIncomingWebhookForChannel(creatorId string, channel *model.Channel, hook *model.IncomingWebhook) (*model.IncomingWebhook, *model.AppError) { @@ -430,11 +456,6 @@ func HandleIncomingWebhook(hookId string, req *model.IncomingWebhookRequest) *mo return model.NewAppError("HandleIncomingWebhook", "web.incoming_webhook.text.app_error", nil, "", http.StatusBadRequest) } - textSize := utf8.RuneCountInString(text) - if textSize > model.POST_MESSAGE_MAX_RUNES { - return model.NewAppError("HandleIncomingWebhook", "web.incoming_webhook.text.length.app_error", map[string]interface{}{"Max": model.POST_MESSAGE_MAX_RUNES, "Actual": textSize}, "", http.StatusBadRequest) - } - channelName := req.ChannelName webhookType := req.Type |