Skip to content

Commit

Permalink
Merge pull request #65 from bugsnag/plat-8731
Browse files Browse the repository at this point in the history
explicitly mark failed payloads >1MB as not retryable
  • Loading branch information
djskinner committed Oct 19, 2023
2 parents ba8d579 + 67fda16 commit dc25073
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 1 deletion.
9 changes: 8 additions & 1 deletion packages/delivery-expo/delivery.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,14 @@ module.exports = (client, fetch = global.fetch) => {
}
client._logger.info(`Sending event ${event.events[0].errors[0].errorClass}: ${event.events[0].errors[0].errorMessage}`)
send(url, opts, err => {
if (err) return onerror(err, { url, opts }, 'event', cb)
if (err) {
// do not retry oversized payloads regardless of status code
if (body.length > 10e5) {
client._logger.warn(`Discarding over-sized event (${body.length / 10e5} MB) after failed delivery`)
err.isRetryable = false
}
return onerror(err, { url, opts }, 'event', cb)
}
cb(null)
})
} catch (e) {
Expand Down
37 changes: 37 additions & 0 deletions packages/delivery-expo/test/delivery.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,43 @@ describe('delivery: expo', () => {
})
})

it('does not attempt to re-send oversized payloads', done => {
// A 401 is considered retryable but this will be overridden by the payload size check
const { requests, server } = mockServer(401)
server.listen(err => {
expect(err).toBeUndefined()

const lotsOfEvents = []
while (JSON.stringify(lotsOfEvents).length < 10e5) {
lotsOfEvents.push({ errors: [{ errorClass: 'Error', errorMessage: 'long repetitive string'.repeat(1000) }] })
}
const payload = {
events: lotsOfEvents
}

const config = {
apiKey: 'aaaaaaaa',
endpoints: { notify: `http://0.0.0.0:${server.address().port}/notify/` },
redactedKeys: []
}

const logger = {
info: jest.fn(),
warn: jest.fn(),
error: jest.fn()
}

delivery({ _config: config, _logger: logger }, fetch).sendEvent(payload, (err) => {
expect(logger.warn).toHaveBeenCalledWith('Discarding over-sized event (1.014603 MB) after failed delivery')
expect(enqueueSpy).not.toHaveBeenCalled()
expect(err).toBeTruthy()
expect(requests.length).toBe(0)
server.close()
done()
})
})
})

it('handles errors gracefully for sessions (ECONNREFUSED)', done => {
const payload = {
events: [{ errors: [{ errorClass: 'Error', errorMessage: 'foo is not a function' }] }]
Expand Down

0 comments on commit dc25073

Please sign in to comment.