Skip to content

Commit

Permalink
Fix DeleteMessageBatch form parsing
Browse files Browse the repository at this point in the history
  • Loading branch information
dhumphreys01 authored and Admiral-Piett committed Nov 8, 2024
1 parent 913294f commit 885f4dd
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 19 deletions.
8 changes: 3 additions & 5 deletions app/gosqs/delete_message_batch.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,8 @@ import (
)

func DeleteMessageBatchV1(req *http.Request) (int, interfaces.AbstractResponseBody) {

requestBody := models.NewDeleteMessageBatchRequest()
ok := utils.REQUEST_TRANSFORMER(requestBody, req, false)

if !ok {
log.Error("Invalid Request - DeleteMessageBatchV1")
return utils.CreateErrorResponseV1("InvalidParameterValue", true)
Expand Down Expand Up @@ -44,12 +42,12 @@ func DeleteMessageBatchV1(req *http.Request) (int, interfaces.AbstractResponseBo
return utils.CreateErrorResponseV1("TooManyEntriesInBatchRequest", true)
}

ids := map[string]struct{}{}
ids := map[string]bool{}
for _, v := range requestBody.Entries {
if _, ok := ids[v.Id]; ok {
if _, found := ids[v.Id]; found {
return utils.CreateErrorResponseV1("BatchEntryIdsNotDistinct", true)
}
ids[v.Id] = struct{}{}
ids[v.Id] = true
}

models.SyncQueues.Lock()
Expand Down
23 changes: 21 additions & 2 deletions app/models/requests.go
Original file line number Diff line number Diff line change
Expand Up @@ -525,15 +525,34 @@ type DeleteMessageBatchRequestEntry struct {
}

type DeleteMessageBatchRequest struct {
Entries []DeleteMessageBatchRequestEntry `json:"Entries" schema:"Entries"`
Entries []DeleteMessageBatchRequestEntry `json:"Entries"`
QueueUrl string `json:"QueueUrl" schema:"QueueUrl"`
}

func NewDeleteMessageBatchRequest() *DeleteMessageBatchRequest {
return &DeleteMessageBatchRequest{}
}

func (r *DeleteMessageBatchRequest) SetAttributesFromForm(values url.Values) {}
func (r *DeleteMessageBatchRequest) SetAttributesFromForm(values url.Values) {
entries := []DeleteMessageBatchRequestEntry{}
for i := 1; true; i++ {
msgIdKey := fmt.Sprintf("DeleteMessageBatchRequestEntry.%d.Id", i)
receiptHandleKey := fmt.Sprintf("DeleteMessageBatchRequestEntry.%d.ReceiptHandle", i)

msgId := values.Get(msgIdKey)
receiptHandle := values.Get(receiptHandleKey)
if msgId == "" || receiptHandle == "" {
break
}
entries = append(entries, DeleteMessageBatchRequestEntry{
Id: msgId,
ReceiptHandle: receiptHandle,
})
}
if len(entries) > 0 {
r.Entries = entries
}
}

// ---- SNS ----
func NewCreateTopicRequest() *CreateTopicRequest {
Expand Down
55 changes: 55 additions & 0 deletions app/models/requests_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -566,3 +566,58 @@ func TestSubscribeRequest_SetAttributesFromForm_stops_if_attributes_not_numbered
assert.False(t, cqr.Attributes.RawMessageDelivery)
assert.Equal(t, FilterPolicy(nil), cqr.Attributes.FilterPolicy)
}

func Test_DeleteMessageBatchRequest_SetAttributesFromForm_success(t *testing.T) {
form := url.Values{}
form.Add("DeleteMessageBatchRequestEntry.1.Id", "message-id-1")
form.Add("DeleteMessageBatchRequestEntry.1.ReceiptHandle", "receipt-handle-1")
form.Add("DeleteMessageBatchRequestEntry.2.Id", "message-id-2")
form.Add("DeleteMessageBatchRequestEntry.2.ReceiptHandle", "receipt-handle-2")
form.Add("DeleteMessageBatchRequestEntry.3.Id", "message-id-3")
form.Add("DeleteMessageBatchRequestEntry.3.ReceiptHandle", "receipt-handle-3")

dmbr := &DeleteMessageBatchRequest{}
dmbr.SetAttributesFromForm(form)

assert.Len(t, dmbr.Entries, 3)
assert.Equal(t, "message-id-1", dmbr.Entries[0].Id)
assert.Equal(t, "receipt-handle-1", dmbr.Entries[0].ReceiptHandle)
assert.Equal(t, "message-id-2", dmbr.Entries[1].Id)
assert.Equal(t, "receipt-handle-2", dmbr.Entries[1].ReceiptHandle)
assert.Equal(t, "message-id-3", dmbr.Entries[2].Id)
assert.Equal(t, "receipt-handle-3", dmbr.Entries[2].ReceiptHandle)
}

func Test_DeleteMessageBatchRequest_SetAttributesFromForm_stops_at_non_sequential_keys(t *testing.T) {
form := url.Values{}
form.Add("DeleteMessageBatchRequestEntry.1.Id", "message-id-1")
form.Add("DeleteMessageBatchRequestEntry.1.ReceiptHandle", "receipt-handle-1")
form.Add("DeleteMessageBatchRequestEntry.4.Id", "message-id-2")
form.Add("DeleteMessageBatchRequestEntry.4.ReceiptHandle", "receipt-handle-2")
form.Add("DeleteMessageBatchRequestEntry.3.Id", "message-id-3")
form.Add("DeleteMessageBatchRequestEntry.3.ReceiptHandle", "receipt-handle-3")

dmbr := &DeleteMessageBatchRequest{}
dmbr.SetAttributesFromForm(form)

assert.Len(t, dmbr.Entries, 1)
assert.Equal(t, "message-id-1", dmbr.Entries[0].Id)
assert.Equal(t, "receipt-handle-1", dmbr.Entries[0].ReceiptHandle)
}

func Test_DeleteMessageBatchRequest_SetAttributesFromForm_stops_at_invalid_keys(t *testing.T) {
form := url.Values{}
form.Add("DeleteMessageBatchRequestEntry.1.Id", "message-id-1")
form.Add("DeleteMessageBatchRequestEntry.1.ReceiptHandle", "receipt-handle-1")
form.Add("INVALID_DeleteMessageBatchRequestEntry.2.Id", "message-id-2")
form.Add("DeleteMessageBatchRequestEntry.2.ReceiptHandle", "receipt-handle-2")
form.Add("DeleteMessageBatchRequestEntry.3.Id", "message-id-3")
form.Add("DeleteMessageBatchRequestEntry.3.ReceiptHandle", "receipt-handle-3")

dmbr := &DeleteMessageBatchRequest{}
dmbr.SetAttributesFromForm(form)

assert.Len(t, dmbr.Entries, 1)
assert.Equal(t, "message-id-1", dmbr.Entries[0].Id)
assert.Equal(t, "receipt-handle-1", dmbr.Entries[0].ReceiptHandle)
}
24 changes: 12 additions & 12 deletions smoke_tests/sqs_delete_message_batch_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -468,12 +468,12 @@ func Test_DeleteMessageBatchV1_xml_success_not_found_message(t *testing.T) {
// delete messages
deletedMessages := e.POST("/").
WithForm(deleteMessageBatchRequestBodyXML).
WithFormField("Entries.0.Id", testId1).
WithFormField("Entries.0.ReceiptHandle", *receivedMessageResponse1.Messages[0].ReceiptHandle).
WithFormField("Entries.1.Id", testId2).
WithFormField("Entries.1.ReceiptHandle", *receivedMessageResponse2.Messages[0].ReceiptHandle).
WithFormField("Entries.2.Id", testId3).
WithFormField("Entries.2.ReceiptHandle", *receivedMessageResponse1.Messages[1].ReceiptHandle).
WithFormField("DeleteMessageBatchRequestEntry.1.Id", testId1).
WithFormField("DeleteMessageBatchRequestEntry.1.ReceiptHandle", *receivedMessageResponse1.Messages[0].ReceiptHandle).
WithFormField("DeleteMessageBatchRequestEntry.2.Id", testId2).
WithFormField("DeleteMessageBatchRequestEntry.2.ReceiptHandle", *receivedMessageResponse2.Messages[0].ReceiptHandle).
WithFormField("DeleteMessageBatchRequestEntry.3.Id", testId3).
WithFormField("DeleteMessageBatchRequestEntry.3.ReceiptHandle", *receivedMessageResponse1.Messages[1].ReceiptHandle).
Expect().
Status(http.StatusOK).
Body().Raw()
Expand Down Expand Up @@ -563,12 +563,12 @@ func Test_DeleteMessageBatchV1_xml_success_all_deletes(t *testing.T) {
// delete messages
deletedMessages := e.POST("/").
WithForm(deleteMessageBatchRequestBodyXML).
WithFormField("Entries.0.Id", testId1).
WithFormField("Entries.0.ReceiptHandle", *receivedMessageResponse.Messages[0].ReceiptHandle).
WithFormField("Entries.1.Id", testId2).
WithFormField("Entries.1.ReceiptHandle", *receivedMessageResponse.Messages[1].ReceiptHandle).
WithFormField("Entries.2.Id", testId3).
WithFormField("Entries.2.ReceiptHandle", *receivedMessageResponse.Messages[2].ReceiptHandle).
WithFormField("DeleteMessageBatchRequestEntry.1.Id", testId1).
WithFormField("DeleteMessageBatchRequestEntry.1.ReceiptHandle", *receivedMessageResponse.Messages[0].ReceiptHandle).
WithFormField("DeleteMessageBatchRequestEntry.2.Id", testId2).
WithFormField("DeleteMessageBatchRequestEntry.2.ReceiptHandle", *receivedMessageResponse.Messages[1].ReceiptHandle).
WithFormField("DeleteMessageBatchRequestEntry.3.Id", testId3).
WithFormField("DeleteMessageBatchRequestEntry.3.ReceiptHandle", *receivedMessageResponse.Messages[2].ReceiptHandle).
Expect().
Status(http.StatusOK).
Body().Raw()
Expand Down

0 comments on commit 885f4dd

Please sign in to comment.