PLT-6581 breakup webhooks greater than 4K into multiple posts (#6530)

This commit is contained in:
Corey Hulen
2017-06-02 09:08:04 -07:00
committed by Christopher Speller
parent 1c9ec861fd
commit 6a54f3c489
2 changed files with 79 additions and 58 deletions

View File

@@ -1050,8 +1050,8 @@ 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 = `{

View File

@@ -150,11 +150,37 @@ func CreateWebhookPost(userId, teamId, channelId, text, overrideUsername, overri
}
}
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)
}
return post, nil
if firstPost == nil {
if len(splits) > 1 {
firstPost = model.PostFromJson(strings.NewReader(post.ToJson()))
} else {
firstPost = post
}
}
}
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