Skip to content

Commit ac1705d

Browse files
authored
Merge 8557c5a into 81098b9
2 parents 81098b9 + 8557c5a commit ac1705d

File tree

4 files changed

+65
-10
lines changed

4 files changed

+65
-10
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
4.0.4 / 2020-09-02
2+
==================
3+
* Allow message size to be overridden for dedicate cluster customers (PR [#63](https://github.com/pusher/pusher-http-go/pull/71))
4+
15
4.0.3 / 2020-07-28
26
==================
37
* Added library name and version in HTTP Header (PR [#62](https://github.com/pusher/pusher-http-go/pull/62))

client.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ var pusherPathRegex = regexp.MustCompile("^/apps/([0-9]+)$")
1717
var maxTriggerableChannels = 100
1818

1919
const (
20-
libraryVersion = "4.0.3"
20+
libraryVersion = "4.0.4"
2121
libraryName = "pusher-http-go"
2222
)
2323

@@ -58,6 +58,7 @@ type Client struct {
5858
HTTPClient *http.Client
5959
EncryptionMasterKey string // deprecated
6060
EncryptionMasterKeyBase64 string // for E2E
61+
OverrideMaxMessagePayloadKB int // set the agreed Pusher message limit increase
6162
validatedEncryptionMasterKey *[]byte // parsed key for use
6263
}
6364

@@ -200,7 +201,7 @@ func (c *Client) trigger(channels []string, eventName string, data interface{},
200201
return err
201202
}
202203

203-
payload, err := encodeTriggerBody(channels, eventName, data, socketID, masterKey)
204+
payload, err := encodeTriggerBody(channels, eventName, data, socketID, masterKey, c.OverrideMaxMessagePayloadKB)
204205
if err != nil {
205206
return err
206207
}
@@ -250,7 +251,7 @@ func (c *Client) TriggerBatch(batch []Event) error {
250251
return keyErr
251252
}
252253

253-
payload, err := encodeTriggerBatchBody(batch, masterKey)
254+
payload, err := encodeTriggerBatchBody(batch, masterKey, c.OverrideMaxMessagePayloadKB)
254255
if err != nil {
255256
return err
256257
}

client_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,31 @@ func TestDataSizeValidation(t *testing.T) {
519519
err := client.Trigger("channel", "event", data)
520520

521521
assert.EqualError(t, err, "Event payload exceeded maximum size (20481 bytes is too much)")
522+
523+
err = client.TriggerBatch([]Event{
524+
{"channel", "event", data, nil},
525+
})
526+
assert.EqualError(t, err, "Data of the event #0 in batch, exceeded maximum size (20481 bytes is too much)")
527+
}
528+
529+
func TestDataSizeOverridenValidation(t *testing.T) {
530+
client := Client{AppID: "id", Key: "key", Secret: "secret", OverrideMaxMessagePayloadKB: 80}
531+
data := strings.Repeat("a", 81920)
532+
err := client.Trigger("channel", "event", data)
533+
assert.NotContains(t, err.Error(), "\"Event payload exceeded maximum size (81920 bytes is too much)")
534+
err = client.TriggerBatch([]Event{
535+
{"channel", "event", data, nil},
536+
})
537+
assert.NotContains(t, err.Error(), "Data of the event #0 in batch, exceeded maximum size (81920 bytes is too much)")
538+
539+
data = strings.Repeat("a", 81921)
540+
err = client.Trigger("channel", "event", data)
541+
assert.EqualError(t, err, "Event payload exceeded maximum size (81921 bytes is too much)")
542+
543+
err = client.TriggerBatch([]Event{
544+
{"channel", "event", data, nil},
545+
})
546+
assert.EqualError(t, err, "Data of the event #0 in batch, exceeded maximum size (81921 bytes is too much)")
522547
}
523548

524549
func TestInitialisationFromURL(t *testing.T) {

encoder.go

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ import (
66
"fmt"
77
)
88

9-
// maxEventPayloadSize indicates the max size allowed for the data content (payload) of each event
10-
const maxEventPayloadSize = 20480 // on dedicated clusters we may allow 2x the usual limit
9+
// defaultMaxEventPayloadSizeKB indicates the max size allowed for the data content
10+
// (payload) of each event, unless an override is present in the client
11+
const defaultMaxEventPayloadSizeKB = 10
1112

1213
type batchEvent struct {
1314
Channel string `json:"channel"`
@@ -26,7 +27,14 @@ type eventPayload struct {
2627
SocketID *string `json:"socket_id,omitempty"`
2728
}
2829

29-
func encodeTriggerBody(channels []string, event string, data interface{}, socketID *string, encryptionKey []byte) ([]byte, error) {
30+
func encodeTriggerBody(
31+
channels []string,
32+
event string,
33+
data interface{},
34+
socketID *string,
35+
encryptionKey []byte,
36+
overrideMaxMessagePayloadKB int,
37+
) ([]byte, error) {
3038
dataBytes, err := encodeEventData(data)
3139
if err != nil {
3240
return nil, err
@@ -37,7 +45,14 @@ func encodeTriggerBody(channels []string, event string, data interface{}, socket
3745
} else {
3846
payloadData = string(dataBytes)
3947
}
40-
if len(payloadData) > maxEventPayloadSize {
48+
49+
eventExceedsMaximumSize := false
50+
if overrideMaxMessagePayloadKB == 0 {
51+
eventExceedsMaximumSize = len(payloadData) > defaultMaxEventPayloadSizeKB*1024
52+
} else {
53+
eventExceedsMaximumSize = len(payloadData) > overrideMaxMessagePayloadKB*1024
54+
}
55+
if eventExceedsMaximumSize {
4156
return nil, errors.New(fmt.Sprintf("Event payload exceeded maximum size (%d bytes is too much)", len(payloadData)))
4257
}
4358
return json.Marshal(&eventPayload{
@@ -48,7 +63,11 @@ func encodeTriggerBody(channels []string, event string, data interface{}, socket
4863
})
4964
}
5065

51-
func encodeTriggerBatchBody(batch []Event, encryptionKey []byte) ([]byte, error) {
66+
func encodeTriggerBatchBody(
67+
batch []Event,
68+
encryptionKey []byte,
69+
overrideMaxMessagePayloadKB int,
70+
) ([]byte, error) {
5271
batchEvents := make([]batchEvent, len(batch))
5372
for idx, e := range batch {
5473
var stringifyedDataBytes string
@@ -61,8 +80,14 @@ func encodeTriggerBatchBody(batch []Event, encryptionKey []byte) ([]byte, error)
6180
} else {
6281
stringifyedDataBytes = string(dataBytes)
6382
}
64-
if len(stringifyedDataBytes) > maxEventPayloadSize {
65-
return nil, fmt.Errorf("Data of the event #%d in batch, must be smaller than 10kb", idx)
83+
eventExceedsMaximumSize := false
84+
if overrideMaxMessagePayloadKB == 0 {
85+
eventExceedsMaximumSize = len(stringifyedDataBytes) > defaultMaxEventPayloadSizeKB*1024
86+
} else {
87+
eventExceedsMaximumSize = len(stringifyedDataBytes) > overrideMaxMessagePayloadKB*1024
88+
}
89+
if eventExceedsMaximumSize {
90+
return nil, fmt.Errorf("Data of the event #%d in batch, exceeded maximum size (%d bytes is too much)", idx, len(stringifyedDataBytes))
6691
}
6792
newBatchEvent := batchEvent{
6893
Channel: e.Channel,

0 commit comments

Comments
 (0)