Skip to content

Commit 7f31b56

Browse files
committed
Fix DeleteMessageBatch form parsing
1 parent f58f9b0 commit 7f31b56

File tree

4 files changed

+91
-19
lines changed

4 files changed

+91
-19
lines changed

app/gosqs/delete_message_batch.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,8 @@ import (
1212
)
1313

1414
func DeleteMessageBatchV1(req *http.Request) (int, interfaces.AbstractResponseBody) {
15-
1615
requestBody := models.NewDeleteMessageBatchRequest()
1716
ok := utils.REQUEST_TRANSFORMER(requestBody, req, false)
18-
1917
if !ok {
2018
log.Error("Invalid Request - DeleteMessageBatchV1")
2119
return utils.CreateErrorResponseV1("InvalidParameterValue", true)
@@ -44,12 +42,12 @@ func DeleteMessageBatchV1(req *http.Request) (int, interfaces.AbstractResponseBo
4442
return utils.CreateErrorResponseV1("TooManyEntriesInBatchRequest", true)
4543
}
4644

47-
ids := map[string]struct{}{}
45+
ids := map[string]bool{}
4846
for _, v := range requestBody.Entries {
49-
if _, ok := ids[v.Id]; ok {
47+
if _, found := ids[v.Id]; found {
5048
return utils.CreateErrorResponseV1("BatchEntryIdsNotDistinct", true)
5149
}
52-
ids[v.Id] = struct{}{}
50+
ids[v.Id] = true
5351
}
5452

5553
models.SyncQueues.Lock()

app/models/requests.go

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -525,15 +525,34 @@ type DeleteMessageBatchRequestEntry struct {
525525
}
526526

527527
type DeleteMessageBatchRequest struct {
528-
Entries []DeleteMessageBatchRequestEntry `json:"Entries" schema:"Entries"`
528+
Entries []DeleteMessageBatchRequestEntry `json:"Entries"`
529529
QueueUrl string `json:"QueueUrl" schema:"QueueUrl"`
530530
}
531531

532532
func NewDeleteMessageBatchRequest() *DeleteMessageBatchRequest {
533533
return &DeleteMessageBatchRequest{}
534534
}
535535

536-
func (r *DeleteMessageBatchRequest) SetAttributesFromForm(values url.Values) {}
536+
func (r *DeleteMessageBatchRequest) SetAttributesFromForm(values url.Values) {
537+
entries := []DeleteMessageBatchRequestEntry{}
538+
for i := 1; true; i++ {
539+
msgIdKey := fmt.Sprintf("DeleteMessageBatchRequestEntry.%d.Id", i)
540+
receiptHandleKey := fmt.Sprintf("DeleteMessageBatchRequestEntry.%d.ReceiptHandle", i)
541+
542+
msgId := values.Get(msgIdKey)
543+
receiptHandle := values.Get(receiptHandleKey)
544+
if msgId == "" || receiptHandle == "" {
545+
break
546+
}
547+
entries = append(entries, DeleteMessageBatchRequestEntry{
548+
Id: msgId,
549+
ReceiptHandle: receiptHandle,
550+
})
551+
}
552+
if len(entries) > 0 {
553+
r.Entries = entries
554+
}
555+
}
537556

538557
// ---- SNS ----
539558
func NewCreateTopicRequest() *CreateTopicRequest {

app/models/requests_test.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,3 +566,58 @@ func TestSubscribeRequest_SetAttributesFromForm_stops_if_attributes_not_numbered
566566
assert.False(t, cqr.Attributes.RawMessageDelivery)
567567
assert.Equal(t, FilterPolicy(nil), cqr.Attributes.FilterPolicy)
568568
}
569+
570+
func Test_DeleteMessageBatchRequest_SetAttributesFromForm_success(t *testing.T) {
571+
form := url.Values{}
572+
form.Add("DeleteMessageBatchRequestEntry.1.Id", "message-id-1")
573+
form.Add("DeleteMessageBatchRequestEntry.1.ReceiptHandle", "receipt-handle-1")
574+
form.Add("DeleteMessageBatchRequestEntry.2.Id", "message-id-2")
575+
form.Add("DeleteMessageBatchRequestEntry.2.ReceiptHandle", "receipt-handle-2")
576+
form.Add("DeleteMessageBatchRequestEntry.3.Id", "message-id-3")
577+
form.Add("DeleteMessageBatchRequestEntry.3.ReceiptHandle", "receipt-handle-3")
578+
579+
dmbr := &DeleteMessageBatchRequest{}
580+
dmbr.SetAttributesFromForm(form)
581+
582+
assert.Len(t, dmbr.Entries, 3)
583+
assert.Equal(t, "message-id-1", dmbr.Entries[0].Id)
584+
assert.Equal(t, "receipt-handle-1", dmbr.Entries[0].ReceiptHandle)
585+
assert.Equal(t, "message-id-2", dmbr.Entries[1].Id)
586+
assert.Equal(t, "receipt-handle-2", dmbr.Entries[1].ReceiptHandle)
587+
assert.Equal(t, "message-id-3", dmbr.Entries[2].Id)
588+
assert.Equal(t, "receipt-handle-3", dmbr.Entries[2].ReceiptHandle)
589+
}
590+
591+
func Test_DeleteMessageBatchRequest_SetAttributesFromForm_stops_at_non_sequential_keys(t *testing.T) {
592+
form := url.Values{}
593+
form.Add("DeleteMessageBatchRequestEntry.1.Id", "message-id-1")
594+
form.Add("DeleteMessageBatchRequestEntry.1.ReceiptHandle", "receipt-handle-1")
595+
form.Add("DeleteMessageBatchRequestEntry.4.Id", "message-id-2")
596+
form.Add("DeleteMessageBatchRequestEntry.4.ReceiptHandle", "receipt-handle-2")
597+
form.Add("DeleteMessageBatchRequestEntry.3.Id", "message-id-3")
598+
form.Add("DeleteMessageBatchRequestEntry.3.ReceiptHandle", "receipt-handle-3")
599+
600+
dmbr := &DeleteMessageBatchRequest{}
601+
dmbr.SetAttributesFromForm(form)
602+
603+
assert.Len(t, dmbr.Entries, 1)
604+
assert.Equal(t, "message-id-1", dmbr.Entries[0].Id)
605+
assert.Equal(t, "receipt-handle-1", dmbr.Entries[0].ReceiptHandle)
606+
}
607+
608+
func Test_DeleteMessageBatchRequest_SetAttributesFromForm_stops_at_invalid_keys(t *testing.T) {
609+
form := url.Values{}
610+
form.Add("DeleteMessageBatchRequestEntry.1.Id", "message-id-1")
611+
form.Add("DeleteMessageBatchRequestEntry.1.ReceiptHandle", "receipt-handle-1")
612+
form.Add("INVALID_DeleteMessageBatchRequestEntry.2.Id", "message-id-2")
613+
form.Add("DeleteMessageBatchRequestEntry.2.ReceiptHandle", "receipt-handle-2")
614+
form.Add("DeleteMessageBatchRequestEntry.3.Id", "message-id-3")
615+
form.Add("DeleteMessageBatchRequestEntry.3.ReceiptHandle", "receipt-handle-3")
616+
617+
dmbr := &DeleteMessageBatchRequest{}
618+
dmbr.SetAttributesFromForm(form)
619+
620+
assert.Len(t, dmbr.Entries, 1)
621+
assert.Equal(t, "message-id-1", dmbr.Entries[0].Id)
622+
assert.Equal(t, "receipt-handle-1", dmbr.Entries[0].ReceiptHandle)
623+
}

smoke_tests/sqs_delete_message_batch_test.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -468,12 +468,12 @@ func Test_DeleteMessageBatchV1_xml_success_not_found_message(t *testing.T) {
468468
// delete messages
469469
deletedMessages := e.POST("/").
470470
WithForm(deleteMessageBatchRequestBodyXML).
471-
WithFormField("Entries.0.Id", testId1).
472-
WithFormField("Entries.0.ReceiptHandle", *receivedMessageResponse1.Messages[0].ReceiptHandle).
473-
WithFormField("Entries.1.Id", testId2).
474-
WithFormField("Entries.1.ReceiptHandle", *receivedMessageResponse2.Messages[0].ReceiptHandle).
475-
WithFormField("Entries.2.Id", testId3).
476-
WithFormField("Entries.2.ReceiptHandle", *receivedMessageResponse1.Messages[1].ReceiptHandle).
471+
WithFormField("DeleteMessageBatchRequestEntry.1.Id", testId1).
472+
WithFormField("DeleteMessageBatchRequestEntry.1.ReceiptHandle", *receivedMessageResponse1.Messages[0].ReceiptHandle).
473+
WithFormField("DeleteMessageBatchRequestEntry.2.Id", testId2).
474+
WithFormField("DeleteMessageBatchRequestEntry.2.ReceiptHandle", *receivedMessageResponse2.Messages[0].ReceiptHandle).
475+
WithFormField("DeleteMessageBatchRequestEntry.3.Id", testId3).
476+
WithFormField("DeleteMessageBatchRequestEntry.3.ReceiptHandle", *receivedMessageResponse1.Messages[1].ReceiptHandle).
477477
Expect().
478478
Status(http.StatusOK).
479479
Body().Raw()
@@ -563,12 +563,12 @@ func Test_DeleteMessageBatchV1_xml_success_all_deletes(t *testing.T) {
563563
// delete messages
564564
deletedMessages := e.POST("/").
565565
WithForm(deleteMessageBatchRequestBodyXML).
566-
WithFormField("Entries.0.Id", testId1).
567-
WithFormField("Entries.0.ReceiptHandle", *receivedMessageResponse.Messages[0].ReceiptHandle).
568-
WithFormField("Entries.1.Id", testId2).
569-
WithFormField("Entries.1.ReceiptHandle", *receivedMessageResponse.Messages[1].ReceiptHandle).
570-
WithFormField("Entries.2.Id", testId3).
571-
WithFormField("Entries.2.ReceiptHandle", *receivedMessageResponse.Messages[2].ReceiptHandle).
566+
WithFormField("DeleteMessageBatchRequestEntry.1.Id", testId1).
567+
WithFormField("DeleteMessageBatchRequestEntry.1.ReceiptHandle", *receivedMessageResponse.Messages[0].ReceiptHandle).
568+
WithFormField("DeleteMessageBatchRequestEntry.2.Id", testId2).
569+
WithFormField("DeleteMessageBatchRequestEntry.2.ReceiptHandle", *receivedMessageResponse.Messages[1].ReceiptHandle).
570+
WithFormField("DeleteMessageBatchRequestEntry.3.Id", testId3).
571+
WithFormField("DeleteMessageBatchRequestEntry.3.ReceiptHandle", *receivedMessageResponse.Messages[2].ReceiptHandle).
572572
Expect().
573573
Status(http.StatusOK).
574574
Body().Raw()

0 commit comments

Comments
 (0)