diff --git a/handlers/meta/handlers.go b/handlers/meta/handlers.go index baa9bc88..be3b69d7 100644 --- a/handlers/meta/handlers.go +++ b/handlers/meta/handlers.go @@ -11,6 +11,7 @@ import ( "fmt" "net/http" "net/url" + "slices" "strconv" "strings" "time" @@ -51,6 +52,8 @@ var ( "account": "ACCOUNT_UPDATE", "agent": "HUMAN_AGENT", } + + wacThrottlingErrorCodes = []int{4, 80007, 130429, 131048, 131056, 133016} ) // keys for extra in channel events @@ -1090,6 +1093,10 @@ func (h *handler) requestWAC(payload whatsapp.SendRequest, accessToken string, r return courier.ErrResponseUnparseable } + if slices.Contains(wacThrottlingErrorCodes, respPayload.Error.Code) { + return courier.ErrConnectionThrottled + } + if respPayload.Error.Code != 0 { return courier.ErrFailedWithReason(strconv.Itoa(respPayload.Error.Code), respPayload.Error.Message) } diff --git a/handlers/meta/whataspp_test.go b/handlers/meta/whataspp_test.go index 6484e0f4..81005489 100644 --- a/handlers/meta/whataspp_test.go +++ b/handlers/meta/whataspp_test.go @@ -679,7 +679,18 @@ var whatsappOutgoingTests = []OutgoingTestCase{ ExpectedError: courier.ErrResponseUnparseable, }, { - Label: "Error", + Label: "Error Channel Contact Pair limit hit", + MsgText: "Pair limit", + MsgURN: "whatsapp:250788123123", + MockResponses: map[string][]*httpx.MockResponse{ + "*/12345_ID/messages": { + httpx.NewMockResponse(403, nil, []byte(`{ "error": {"message": "(#131056) (Business Account, Consumer Account) pair rate limit hit","code": 131056 }}`)), + }, + }, + ExpectedError: courier.ErrConnectionThrottled, + }, + { + Label: "Error Throttled", MsgText: "Error", MsgURN: "whatsapp:250788123123", MockResponses: map[string][]*httpx.MockResponse{ @@ -687,7 +698,18 @@ var whatsappOutgoingTests = []OutgoingTestCase{ httpx.NewMockResponse(403, nil, []byte(`{ "error": {"message": "(#130429) Rate limit hit","code": 130429 }}`)), }, }, - ExpectedError: courier.ErrFailedWithReason("130429", "(#130429) Rate limit hit"), + ExpectedError: courier.ErrConnectionThrottled, + }, + { + Label: "Error", + MsgText: "Error", + MsgURN: "whatsapp:250788123123", + MockResponses: map[string][]*httpx.MockResponse{ + "*/12345_ID/messages": { + httpx.NewMockResponse(403, nil, []byte(`{ "error": {"message": "(#368) Temporarily blocked for policies violations","code": 368 }}`)), + }, + }, + ExpectedError: courier.ErrFailedWithReason("368", "(#368) Temporarily blocked for policies violations"), }, { Label: "Error Connection",