~bigbes/core-go

b98647b61819bf73fa43f92f5727fd58d492f13c — Drew DeVault 5 years ago 70c7fe3
Deduplicate webhook headers on subsequent attempts

This also updates the database with the final payload headers, including
the signature and nonce, which are generated afresh for each attempt.
1 files changed, 8 insertions(+), 4 deletions(-)

M webhooks/legacy.go
M webhooks/legacy.go => webhooks/legacy.go +8 -4
@@ 209,7 209,7 @@ func deliverPayload(ctx context.Context, name, url string,
			err, work.ErrDoNotReattempt)
	}

	req.Header = headers
	req.Header = make(http.Header)
	for key, values := range headers {
		for _, value := range values {
			req.Header.Add(key, value)


@@ 219,6 219,9 @@ func deliverPayload(ctx context.Context, name, url string,
	req.Header.Add("X-Payload-Nonce", nonce)
	req.Header.Add("X-Payload-Signature", sig)

	var ours strings.Builder
	req.Header.Write(&ours)

	resp, err := client.Do(req)
	if err != nil {
		return err


@@ 233,13 236,14 @@ func deliverPayload(ctx context.Context, name, url string,
	}

	if err = database.WithTx(ctx, nil, func(tx *sql.Tx) error {
		var sb strings.Builder
		resp.Header.Write(&sb)
		var theirs strings.Builder
		resp.Header.Write(&theirs)
		_, err := sq.
			Update(name+"_webhook_delivery").
			Set("response", string(body)).
			Set("response_status", resp.StatusCode).
			Set("response_headers", sb.String()).
			Set("response_headers", theirs.String()).
			Set("payload_headers", ours.String()).
			Where("id = ?", deliveryID).
			PlaceholderFormat(sq.Dollar).
			RunWith(tx).