Skip to content

Commit 179f89d

Browse files
authored
Merge pull request #733 from nyaruka/twilio-whatsapp-retry
Support retrying failed messages for rate limit on Twilio WhatsApp
2 parents e066c10 + 5c4b60c commit 179f89d

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

Diff for: handlers/twiml/handlers.go

+4
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ var mediaSupport = map[handlers.MediaType]handlers.MediaTypeSupport{
5656

5757
// error code twilio returns when a contact has sent "stop"
5858
const errorStopped = 21610
59+
const errorThrottled = 63018
5960

6061
type handler struct {
6162
handlers.BaseHandler
@@ -207,6 +208,9 @@ func (h *handler) receiveStatus(ctx context.Context, channel courier.Channel, w
207208
}
208209
}
209210
clog.Error(twilioError(errorCode))
211+
if errorCode == errorThrottled {
212+
status = h.Backend().NewStatusUpdateByExternalID(channel, form.MessageSID, courier.MsgStatusErrored, clog)
213+
}
210214
}
211215

212216
return handlers.WriteMsgStatusAndResponse(ctx, h, channel, status, w, r)

Diff for: handlers/twiml/handlers_test.go

+16-3
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,10 @@ var (
6666

6767
statusStop = "ErrorCode=21610&MessageSid=SMe287d7109a5a925f182f0e07fe5b223b&MessageStatus=failed&To=%2B12028831111"
6868

69-
statusInvalid = "MessageSid=SMe287d7109a5a925f182f0e07fe5b223b&MessageStatus=huh"
70-
statusValid = "MessageSid=SMe287d7109a5a925f182f0e07fe5b223b&MessageStatus=delivered"
71-
statusRead = "MessageSid=SMe287d7109a5a925f182f0e07fe5b223b&MessageStatus=read"
69+
statusInvalid = "MessageSid=SMe287d7109a5a925f182f0e07fe5b223b&MessageStatus=huh"
70+
statusValid = "MessageSid=SMe287d7109a5a925f182f0e07fe5b223b&MessageStatus=delivered"
71+
statusRead = "MessageSid=SMe287d7109a5a925f182f0e07fe5b223b&MessageStatus=read"
72+
statusRateLimit = "MessageSid=SMe287d7109a5a925f182f0e07fe5b223b&MessageStatus=failed&ErrorCode=63018"
7273

7374
tmsStatusExtra = "SmsStatus=sent&MessageStatus=sent&To=2021&MessagingServiceSid=MGdb23ec0f89ee2632e46e91d8128f5e2b&MessageSid=SM0b6e2697aae04182a9f5b5c7a8994c7f&AccountSid=acctid&From=%2B14133881111&ApiVersion=2010-04-01"
7475
tmsReceiveExtra = "ToCountry=US&ToState=&SmsMessageSid=SMbbf29aeb9d380ce2a1c0ae4635ff9dab&NumMedia=0&ToCity=&FromZip=27609&SmsSid=SMbbf29aeb9d380ce2a1c0ae4635ff9dab&FromState=NC&SmsStatus=received&FromCity=RALEIGH&Body=John+Cruz&FromCountry=US&To=384387&ToZip=&NumSegments=1&MessageSid=SMbbf29aeb9d380ce2a1c0ae4635ff9dab&AccountSid=acctid&From=%2B14133881111&ApiVersion=2010-04-01"
@@ -481,6 +482,18 @@ var twaTestCases = []IncomingTestCase{
481482
},
482483
PrepRequest: addValidSignature,
483484
},
485+
{
486+
Label: "Status ID Rate limit",
487+
URL: twaStatusIDURL,
488+
Data: statusRateLimit,
489+
ExpectedRespStatus: 200,
490+
ExpectedBodyContains: `"status":"E"`,
491+
ExpectedStatuses: []ExpectedStatus{
492+
{ExternalID: "SMe287d7109a5a925f182f0e07fe5b223b", Status: courier.MsgStatusErrored},
493+
},
494+
PrepRequest: addValidSignature,
495+
ExpectedErrors: []*courier.ChannelError{courier.ErrorExternal("63018", "Rate limit exceeded for Channel")},
496+
},
484497
{
485498
Label: "Status ID Invalid",
486499
URL: twaStatusInvalidIDURL,

0 commit comments

Comments
 (0)