From f3062f3bcb41fb5427caabf9850aec82b661831c Mon Sep 17 00:00:00 2001 From: kojisaikiAtSony Date: Thu, 14 Mar 2024 16:56:22 +0900 Subject: [PATCH] Migrate SQS SendMessage w/o smoke test --- app/gosqs/gosqs.go | 86 --------------------- app/gosqs/gosqs_test.go | 128 +++++++++++++------------------ app/gosqs/send_message.go | 103 +++++++++++++++++++++++++ app/models/send_message_model.go | 88 +++++++++++++++++++++ app/router/router.go | 2 +- app/router/router_test.go | 2 +- app/sqs_messages.go | 12 ++- 7 files changed, 258 insertions(+), 163 deletions(-) create mode 100644 app/gosqs/send_message.go create mode 100644 app/models/send_message_model.go diff --git a/app/gosqs/gosqs.go b/app/gosqs/gosqs.go index 4dc0f9c6..be858bcb 100644 --- a/app/gosqs/gosqs.go +++ b/app/gosqs/gosqs.go @@ -95,92 +95,6 @@ func PeriodicTasks(d time.Duration, quit <-chan struct{}) { } } -func SendMessage(w http.ResponseWriter, req *http.Request) { - w.Header().Set("Content-Type", "application/xml") - req.ParseForm() - messageBody := req.FormValue("MessageBody") - messageGroupID := req.FormValue("MessageGroupId") - messageDeduplicationID := req.FormValue("MessageDeduplicationId") - messageAttributes := extractMessageAttributes(req, "") - - queueUrl := getQueueFromPath(req.FormValue("QueueUrl"), req.URL.String()) - - queueName := "" - if queueUrl == "" { - vars := mux.Vars(req) - queueName = vars["queueName"] - } else { - uriSegments := strings.Split(queueUrl, "/") - queueName = uriSegments[len(uriSegments)-1] - } - - if _, ok := app.SyncQueues.Queues[queueName]; !ok { - // Queue does not exist - createErrorResponse(w, req, "QueueNotFound") - return - } - - if app.SyncQueues.Queues[queueName].MaximumMessageSize > 0 && - len(messageBody) > app.SyncQueues.Queues[queueName].MaximumMessageSize { - // Message size is too big - createErrorResponse(w, req, "MessageTooBig") - return - } - - delaySecs := app.SyncQueues.Queues[queueName].DelaySeconds - if mv := req.FormValue("DelaySeconds"); mv != "" { - delaySecs, _ = strconv.Atoi(mv) - } - - log.Println("Putting Message in Queue:", queueName) - msg := app.Message{MessageBody: []byte(messageBody)} - if len(messageAttributes) > 0 { - msg.MessageAttributes = messageAttributes - msg.MD5OfMessageAttributes = common.HashAttributes(messageAttributes) - } - msg.MD5OfMessageBody = common.GetMD5Hash(messageBody) - msg.Uuid, _ = common.NewUUID() - msg.GroupID = messageGroupID - msg.DeduplicationID = messageDeduplicationID - msg.SentTime = time.Now() - msg.DelaySecs = delaySecs - - app.SyncQueues.Lock() - fifoSeqNumber := "" - if app.SyncQueues.Queues[queueName].IsFIFO { - fifoSeqNumber = app.SyncQueues.Queues[queueName].NextSequenceNumber(messageGroupID) - } - - if !app.SyncQueues.Queues[queueName].IsDuplicate(messageDeduplicationID) { - app.SyncQueues.Queues[queueName].Messages = append(app.SyncQueues.Queues[queueName].Messages, msg) - } else { - log.Debugf("Message with deduplicationId [%s] in queue [%s] is duplicate ", messageDeduplicationID, queueName) - } - - app.SyncQueues.Queues[queueName].InitDuplicatation(messageDeduplicationID) - app.SyncQueues.Unlock() - log.Infof("%s: Queue: %s, Message: %s\n", time.Now().Format("2006-01-02 15:04:05"), queueName, msg.MessageBody) - - respStruct := app.SendMessageResponse{ - Xmlns: "http://queue.amazonaws.com/doc/2012-11-05/", - Result: app.SendMessageResult{ - MD5OfMessageAttributes: msg.MD5OfMessageAttributes, - MD5OfMessageBody: msg.MD5OfMessageBody, - MessageId: msg.Uuid, - SequenceNumber: fifoSeqNumber, - }, - Metadata: app.ResponseMetadata{ - RequestId: "00000000-0000-0000-0000-000000000000", - }, - } - - enc := xml.NewEncoder(w) - enc.Indent(" ", " ") - if err := enc.Encode(respStruct); err != nil { - log.Printf("error: %v\n", err) - } -} - type SendEntry struct { Id string MessageBody string diff --git a/app/gosqs/gosqs_test.go b/app/gosqs/gosqs_test.go index 3d373b00..1a441e25 100644 --- a/app/gosqs/gosqs_test.go +++ b/app/gosqs/gosqs_test.go @@ -40,25 +40,20 @@ func TestSendMessage_MaximumMessageSize_Success(t *testing.T) { form.Add("Version", "2012-11-05") req.PostForm = form - // We create a ResponseRecorder (which satisfies http.ResponseWriter) to record the response. - rr := httptest.NewRecorder() - handler := http.HandlerFunc(SendMessage) - - // Our handlers satisfy http.Handler, so we can call their ServeHTTP method - // directly and pass in our Request and ResponseRecorder. - handler.ServeHTTP(rr, req) + status, response := SendMessageV1(req) // Check the status code is what we expect. - if status := rr.Code; status != http.StatusOK { + if status != http.StatusOK { t.Errorf("handler returned wrong status code: got %v want %v", status, http.StatusOK) } // Check the response body is what we expect. - expected := "MD5OfMessageBody" - if !strings.Contains(rr.Body.String(), expected) { - t.Errorf("handler returned unexpected body: got %v want %v", - rr.Body.String(), expected) + sendMessageResponse, ok := response.(models.SendMessageResponse) + assert.True(t, ok) + if len(sendMessageResponse.Result.MD5OfMessageBody) == 0 { + t.Errorf("handler returned unexpected body: got %v", + sendMessageResponse.Result) } } @@ -78,25 +73,21 @@ func TestSendMessage_MaximumMessageSize_MessageTooBig(t *testing.T) { form.Add("Version", "2012-11-05") req.PostForm = form - // We create a ResponseRecorder (which satisfies http.ResponseWriter) to record the response. - rr := httptest.NewRecorder() - handler := http.HandlerFunc(SendMessage) - - // Our handlers satisfy http.Handler, so we can call their ServeHTTP method - // directly and pass in our Request and ResponseRecorder. - handler.ServeHTTP(rr, req) + status, response := SendMessageV1(req) // Check the status code is what we expect. - if status := rr.Code; status != http.StatusBadRequest { + if status != http.StatusBadRequest { t.Errorf("handler returned wrong status code: got %v want %v", status, http.StatusBadRequest) } // Check the response body is what we expect. + errorResponse, ok := response.(models.ErrorResponse) + assert.True(t, ok) expected := "MessageTooBig" - if !strings.Contains(rr.Body.String(), expected) { + if errorResponse.Result.Type != expected { t.Errorf("handler returned unexpected body: got %v want %v", - rr.Body.String(), expected) + errorResponse.Result.Type, expected) } } @@ -115,25 +106,21 @@ func TestSendQueue_POST_NonExistant(t *testing.T) { form.Add("Version", "2012-11-05") req.PostForm = form - // We create a ResponseRecorder (which satisfies http.ResponseWriter) to record the response. - rr := httptest.NewRecorder() - handler := http.HandlerFunc(SendMessage) - - // Our handlers satisfy http.Handler, so we can call their ServeHTTP method - // directly and pass in our Request and ResponseRecorder. - handler.ServeHTTP(rr, req) + status, response := SendMessageV1(req) // Check the status code is what we expect. - if status := rr.Code; status != http.StatusBadRequest { + if status != http.StatusBadRequest { t.Errorf("handler returned wrong status code: got %v want %v", status, http.StatusBadRequest) } // Check the response body is what we expect. - expected := "NonExistentQueue" - if !strings.Contains(rr.Body.String(), expected) { + errorResponse, ok := response.(models.ErrorResponse) + assert.True(t, ok) + expected := "Not Found" + if errorResponse.Result.Type != expected { t.Errorf("handler returned unexpected body: got %v want %v", - rr.Body.String(), expected) + errorResponse.Result.Type, expected) } } @@ -503,7 +490,7 @@ func TestRequeueing_VisibilityTimeoutExpires(t *testing.T) { req.PostForm = form rr = httptest.NewRecorder() - http.HandlerFunc(SendMessage).ServeHTTP(rr, req) + status, _ = SendMessageV1(req) if status := rr.Code; status != http.StatusOK { t.Errorf("handler returned wrong status code: got \n%v want %v", @@ -619,9 +606,9 @@ func TestRequeueing_ResetVisibilityTimeout(t *testing.T) { req.PostForm = form rr = httptest.NewRecorder() - http.HandlerFunc(SendMessage).ServeHTTP(rr, req) + status, _ = SendMessageV1(req) - if status := rr.Code; status != http.StatusOK { + if status != http.StatusOK { t.Errorf("handler returned wrong status code: got \n%v want %v", status, http.StatusOK) } @@ -772,9 +759,9 @@ func TestDeadLetterQueue(t *testing.T) { req.PostForm = form rr = httptest.NewRecorder() - http.HandlerFunc(SendMessage).ServeHTTP(rr, req) + status, _ = SendMessageV1(req) - if status := rr.Code; status != http.StatusOK { + if status != http.StatusOK { t.Errorf("handler returned wrong status code: got \n%v want %v", status, http.StatusOK) } @@ -909,9 +896,9 @@ func TestReceiveMessageWaitTimeEnforced(t *testing.T) { req.PostForm = form rr = httptest.NewRecorder() - http.HandlerFunc(SendMessage).ServeHTTP(rr, req) + status, _ = SendMessageV1(req) - if status := rr.Code; status != http.StatusOK { + if status != http.StatusOK { t.Errorf("handler returned wrong status code: got \n%v want %v", status, http.StatusOK) } @@ -1014,9 +1001,9 @@ func TestReceiveMessage_CanceledByClient(t *testing.T) { req.PostForm = form rr = httptest.NewRecorder() - http.HandlerFunc(SendMessage).ServeHTTP(rr, req) + status, _ = SendMessageV1(req) - if status := rr.Code; status != http.StatusOK { + if status != http.StatusOK { t.Errorf("handler returned wrong status code: got \n%v want %v", status, http.StatusOK) } @@ -1173,9 +1160,11 @@ func TestReceiveMessageDelaySeconds(t *testing.T) { form.Add("MessageBody", "1") form.Add("Version", "2012-11-05") req.PostForm = form + rr = httptest.NewRecorder() - http.HandlerFunc(SendMessage).ServeHTTP(rr, req) - if status := rr.Code; status != http.StatusOK { + status, _ = SendMessageV1(req) + + if status != http.StatusOK { t.Errorf("handler returned wrong status code: got \n%v want %v", status, http.StatusOK) } @@ -1302,9 +1291,9 @@ func TestSendingAndReceivingFromFIFOQueueReturnsSameMessageOnError(t *testing.T) req.PostForm = form rr = httptest.NewRecorder() - http.HandlerFunc(SendMessage).ServeHTTP(rr, req) + status, _ = SendMessageV1(req) - if status := rr.Code; status != http.StatusOK { + if status != http.StatusOK { t.Errorf("handler returned wrong status code: got \n%v want %v", status, http.StatusOK) } @@ -1324,9 +1313,9 @@ func TestSendingAndReceivingFromFIFOQueueReturnsSameMessageOnError(t *testing.T) req.PostForm = form rr = httptest.NewRecorder() - http.HandlerFunc(SendMessage).ServeHTTP(rr, req) + status, _ = SendMessageV1(req) - if status := rr.Code; status != http.StatusOK { + if status != http.StatusOK { t.Errorf("handler returned wrong status code: got \n%v want %v", status, http.StatusOK) } @@ -1474,7 +1463,6 @@ func TestSendMessage_POST_DuplicatationNotAppliedToStandardQueue(t *testing.T) { form.Add("Version", "2012-11-05") req.PostForm = form - rr := httptest.NewRecorder() status, _ := CreateQueueV1(req) assert.Equal(t, status, http.StatusOK) @@ -1492,11 +1480,10 @@ func TestSendMessage_POST_DuplicatationNotAppliedToStandardQueue(t *testing.T) { form.Add("Version", "2012-11-05") req.PostForm = form - rr = httptest.NewRecorder() - http.HandlerFunc(SendMessage).ServeHTTP(rr, req) + status, _ = SendMessageV1(req) // Check the status code is what we expect. - if status := rr.Code; status != http.StatusOK { + if status != http.StatusOK { t.Errorf("handler returned wrong status code: got \n%v want %v", status, http.StatusOK) } @@ -1512,11 +1499,10 @@ func TestSendMessage_POST_DuplicatationNotAppliedToStandardQueue(t *testing.T) { form.Add("Version", "2012-11-05") req.PostForm = form - rr = httptest.NewRecorder() - http.HandlerFunc(SendMessage).ServeHTTP(rr, req) + status, _ = SendMessageV1(req) // Check the status code is what we expect. - if status := rr.Code; status != http.StatusOK { + if status != http.StatusOK { t.Errorf("handler returned wrong status code: got \n%v want %v", status, http.StatusOK) } @@ -1541,7 +1527,6 @@ func TestSendMessage_POST_DuplicatationDisabledOnFifoQueue(t *testing.T) { form.Add("Version", "2012-11-05") req.PostForm = form - rr := httptest.NewRecorder() status, _ := CreateQueueV1(req) assert.Equal(t, status, http.StatusOK) @@ -1559,11 +1544,10 @@ func TestSendMessage_POST_DuplicatationDisabledOnFifoQueue(t *testing.T) { form.Add("Version", "2012-11-05") req.PostForm = form - rr = httptest.NewRecorder() - http.HandlerFunc(SendMessage).ServeHTTP(rr, req) + status, _ = SendMessageV1(req) // Check the status code is what we expect. - if status := rr.Code; status != http.StatusOK { + if status != http.StatusOK { t.Errorf("handler returned wrong status code: got \n%v want %v", status, http.StatusOK) } @@ -1579,11 +1563,10 @@ func TestSendMessage_POST_DuplicatationDisabledOnFifoQueue(t *testing.T) { form.Add("Version", "2012-11-05") req.PostForm = form - rr = httptest.NewRecorder() - http.HandlerFunc(SendMessage).ServeHTTP(rr, req) + status, _ = SendMessageV1(req) // Check the status code is what we expect. - if status := rr.Code; status != http.StatusOK { + if status != http.StatusOK { t.Errorf("handler returned wrong status code: got \n%v want %v", status, http.StatusOK) } @@ -1608,7 +1591,6 @@ func TestSendMessage_POST_DuplicatationEnabledOnFifoQueue(t *testing.T) { form.Add("Version", "2012-11-05") req.PostForm = form - rr := httptest.NewRecorder() status, _ := CreateQueueV1(req) assert.Equal(t, status, http.StatusOK) @@ -1628,11 +1610,10 @@ func TestSendMessage_POST_DuplicatationEnabledOnFifoQueue(t *testing.T) { form.Add("Version", "2012-11-05") req.PostForm = form - rr = httptest.NewRecorder() - http.HandlerFunc(SendMessage).ServeHTTP(rr, req) + status, _ = SendMessageV1(req) // Check the status code is what we expect. - if status := rr.Code; status != http.StatusOK { + if status != http.StatusOK { t.Errorf("handler returned wrong status code: got \n%v want %v", status, http.StatusOK) } @@ -1648,11 +1629,10 @@ func TestSendMessage_POST_DuplicatationEnabledOnFifoQueue(t *testing.T) { form.Add("Version", "2012-11-05") req.PostForm = form - rr = httptest.NewRecorder() - http.HandlerFunc(SendMessage).ServeHTTP(rr, req) + status, _ = SendMessageV1(req) // Check the status code is what we expect. - if status := rr.Code; status != http.StatusOK { + if status != http.StatusOK { t.Errorf("handler returned wrong status code: got \n%v want %v", status, http.StatusOK) } @@ -1676,7 +1656,6 @@ func TestSendMessage_POST_DelaySeconds(t *testing.T) { form.Add("Version", "2012-11-05") req.PostForm = form - rr := httptest.NewRecorder() status, _ := CreateQueueV1(req) assert.Equal(t, status, http.StatusOK) @@ -1693,9 +1672,9 @@ func TestSendMessage_POST_DelaySeconds(t *testing.T) { form.Add("DelaySeconds", "2") form.Add("Version", "2012-11-05") req.PostForm = form - rr = httptest.NewRecorder() - http.HandlerFunc(SendMessage).ServeHTTP(rr, req) - if status := rr.Code; status != http.StatusOK { + + status, _ = SendMessageV1(req) + if status != http.StatusOK { t.Errorf("handler returned wrong status code: got \n%v want %v", status, http.StatusOK) } @@ -1710,7 +1689,8 @@ func TestSendMessage_POST_DelaySeconds(t *testing.T) { form.Add("QueueUrl", "http://localhost:4100/queue/sendmessage-delay") form.Add("Version", "2012-11-05") req.PostForm = form - rr = httptest.NewRecorder() + + rr := httptest.NewRecorder() http.HandlerFunc(ReceiveMessage).ServeHTTP(rr, req) if status := rr.Code; status != http.StatusOK { t.Errorf("handler returned wrong status code: got \n%v want %v", diff --git a/app/gosqs/send_message.go b/app/gosqs/send_message.go new file mode 100644 index 00000000..fa0edf12 --- /dev/null +++ b/app/gosqs/send_message.go @@ -0,0 +1,103 @@ +package gosqs + +import ( + "net/http" + "strconv" + "strings" + "time" + + "github.com/Admiral-Piett/goaws/app/interfaces" + "github.com/Admiral-Piett/goaws/app/models" + + "github.com/Admiral-Piett/goaws/app/utils" + + log "github.com/sirupsen/logrus" + + "github.com/Admiral-Piett/goaws/app" + "github.com/Admiral-Piett/goaws/app/common" + "github.com/gorilla/mux" +) + +func SendMessageV1(req *http.Request) (int, interfaces.AbstractResponseBody) { + requestBody := models.NewSendMessageRequest() + ok := utils.REQUEST_TRANSFORMER(requestBody, req) + if !ok { + log.Error("Invalid Request - CreateQueueV1") + return createErrorResponseV1(ErrInvalidParameterValue.Type) + } + messageBody := requestBody.MessageBody + messageGroupID := requestBody.MessageGroupId + messageDeduplicationID := requestBody.MessageDeduplicationId + messageAttributes := extractMessageAttributes(req, "") + + queueUrl := getQueueFromPath(requestBody.QueueUrl, req.URL.String()) + + queueName := "" + if queueUrl == "" { + vars := mux.Vars(req) + queueName = vars["queueName"] + } else { + uriSegments := strings.Split(queueUrl, "/") + queueName = uriSegments[len(uriSegments)-1] + } + + if _, ok := app.SyncQueues.Queues[queueName]; !ok { + // Queue does not exist + return createErrorResponseV1("QueueNotFound") + } + + if app.SyncQueues.Queues[queueName].MaximumMessageSize > 0 && + len(messageBody) > app.SyncQueues.Queues[queueName].MaximumMessageSize { + // Message size is too big + return createErrorResponseV1("MessageTooBig") + } + + delaySecs := app.SyncQueues.Queues[queueName].DelaySeconds + if mv := req.FormValue("DelaySeconds"); mv != "" { + delaySecs, _ = strconv.Atoi(mv) + } + + log.Println("Putting Message in Queue:", queueName) + msg := app.Message{MessageBody: []byte(messageBody)} + if len(messageAttributes) > 0 { + msg.MessageAttributes = messageAttributes + msg.MD5OfMessageAttributes = common.HashAttributes(messageAttributes) + } + msg.MD5OfMessageBody = common.GetMD5Hash(messageBody) + msg.Uuid, _ = common.NewUUID() + msg.GroupID = messageGroupID + msg.DeduplicationID = messageDeduplicationID + msg.SentTime = time.Now() + msg.DelaySecs = delaySecs + + app.SyncQueues.Lock() + fifoSeqNumber := "" + if app.SyncQueues.Queues[queueName].IsFIFO { + fifoSeqNumber = app.SyncQueues.Queues[queueName].NextSequenceNumber(messageGroupID) + } + + if !app.SyncQueues.Queues[queueName].IsDuplicate(messageDeduplicationID) { + app.SyncQueues.Queues[queueName].Messages = append(app.SyncQueues.Queues[queueName].Messages, msg) + } else { + log.Debugf("Message with deduplicationId [%s] in queue [%s] is duplicate ", messageDeduplicationID, queueName) + } + + app.SyncQueues.Queues[queueName].InitDuplicatation(messageDeduplicationID) + app.SyncQueues.Unlock() + log.Infof("%s: Queue: %s, Message: %s\n", time.Now().Format("2006-01-02 15:04:05"), queueName, msg.MessageBody) + + respStruct := models.SendMessageResponse{ + Xmlns: "http://queue.amazonaws.com/doc/2012-11-05/", + Result: models.SendMessageResult{ + MD5OfMessageAttributes: msg.MD5OfMessageAttributes, + MD5OfMessageBody: msg.MD5OfMessageBody, + MessageId: msg.Uuid, + SequenceNumber: fifoSeqNumber, + }, + Metadata: app.ResponseMetadata{ + RequestId: "00000000-0000-0000-0000-000000000000", + }, + } + + return http.StatusOK, respStruct +} diff --git a/app/models/send_message_model.go b/app/models/send_message_model.go new file mode 100644 index 00000000..b626cbf5 --- /dev/null +++ b/app/models/send_message_model.go @@ -0,0 +1,88 @@ +package models + +import ( + "fmt" + "net/url" + + "github.com/Admiral-Piett/goaws/app" + log "github.com/sirupsen/logrus" +) + +/*** Request */ + +func NewSendMessageRequest() *SendMessageRequest { + return &SendMessageRequest{ + MessageAttributes: make(map[string]MessageAttributes), + MessageSystemAttributes: make(map[string]MessageAttributes), + } +} + +type SendMessageRequest struct { + DelaySeconds int `json:"Del1aySeconds" schema:"DelaySeconds"` + MessageAttributes map[string]MessageAttributes `json:"MessageAttributes" schema:"MessageAttributes"` + MessageBody string `json:"MessageBody" schema:"MessageBody"` + MessageDeduplicationId string `json:"MessageDeduplicationId" schema:"MessageDeduplicationId"` + MessageGroupId string `json:"MessageGroupId" schema:"MessageGroupId"` + MessageSystemAttributes map[string]MessageAttributes `json:"MessageSystemAttributes" schema:"MessageSystemAttributes"` + QueueUrl string `json:"QueueUrl" schema:"QueueUrl"` +} +type MessageAttributes struct { + BinaryListValues []string `json:"BinaryListValues"` // goaws does not supported yet + BinaryValue string `json:"BinaryValue"` + DataType string `json:"DataType"` + StringListValues []string `json:"StringListValues"` // goaws does not supported yet + StringValue string `json:"StringValue"` +} + +func (r *SendMessageRequest) SetAttributesFromForm(values url.Values) { + for i := 1; true; i++ { + nameKey := fmt.Sprintf("MessageAttribute.%d.Name", i) + name := values.Get(nameKey) + if name == "" { + break + } + + dataTypeKey := fmt.Sprintf("MessageAttribute.%d.Value.DataType", i) + dataType := values.Get(dataTypeKey) + if dataType == "" { + log.Warnf("DataType of MessageAttribute %s is missing, MD5 checksum will most probably be wrong!\n", name) + continue + } + + stringValue := values.Get(fmt.Sprintf("MessageAttribute.%d.Value.StringValue", i)) + binaryValue := values.Get(fmt.Sprintf("MessageAttribute.%d.Value.BinaryValue", i)) + + r.MessageAttributes[name] = MessageAttributes{ + DataType: dataType, + StringValue: stringValue, + BinaryValue: binaryValue, + } + + if _, ok := r.MessageAttributes[name]; !ok { + log.Warnf("StringValue or BinaryValue of MessageAttribute %s is missing, MD5 checksum will most probably be wrong!\n", name) + } + } +} + +/*** Response */ + +type SendMessageResult struct { + MD5OfMessageAttributes string `xml:"MD5OfMessageAttributes"` + MD5OfMessageBody string `xml:"MD5OfMessageBody"` + MessageId string `xml:"MessageId"` + SequenceNumber string `xml:"SequenceNumber"` +} + +type SendMessageResponse struct { + Xmlns string `xml:"xmlns,attr"` + Result SendMessageResult `xml:"SendMessageResult"` + Metadata app.ResponseMetadata `xml:"ResponseMetadata"` +} + +func (r SendMessageResponse) GetResult() interface{} { + return r.Result +} + +func (r SendMessageResponse) GetRequestId() string { + return r.Metadata.RequestId +} diff --git a/app/router/router.go b/app/router/router.go index f3ef1fb3..f0d73c85 100644 --- a/app/router/router.go +++ b/app/router/router.go @@ -62,13 +62,13 @@ func encodeResponse(w http.ResponseWriter, req *http.Request, statusCode int, bo var routingTableV1 = map[string]func(r *http.Request) (int, interfaces.AbstractResponseBody){ "CreateQueue": sqs.CreateQueueV1, "ListQueues": sqs.ListQueuesV1, + "SendMessage": sqs.SendMessageV1, } var routingTable = map[string]http.HandlerFunc{ // SQS "GetQueueAttributes": sqs.GetQueueAttributes, "SetQueueAttributes": sqs.SetQueueAttributes, - "SendMessage": sqs.SendMessage, "SendMessageBatch": sqs.SendMessageBatch, "ReceiveMessage": sqs.ReceiveMessage, "DeleteMessage": sqs.DeleteMessage, diff --git a/app/router/router_test.go b/app/router/router_test.go index 8f3d975b..71554729 100644 --- a/app/router/router_test.go +++ b/app/router/router_test.go @@ -263,12 +263,12 @@ func TestActionHandler_v0_xml(t *testing.T) { routingTableV1 = map[string]func(r *http.Request) (int, interfaces.AbstractResponseBody){ "CreateQueue": sqs.CreateQueueV1, "ListQueues": sqs.ListQueuesV1, + "SendMessage": sqs.SendMessageV1, } routingTable = map[string]http.HandlerFunc{ // SQS "GetQueueAttributes": sqs.GetQueueAttributes, "SetQueueAttributes": sqs.SetQueueAttributes, - "SendMessage": sqs.SendMessage, "SendMessageBatch": sqs.SendMessageBatch, "ReceiveMessage": sqs.ReceiveMessage, "DeleteMessage": sqs.DeleteMessage, diff --git a/app/sqs_messages.go b/app/sqs_messages.go index f8693277..faee5008 100644 --- a/app/sqs_messages.go +++ b/app/sqs_messages.go @@ -1,7 +1,6 @@ package app /*** Send Message Response */ - type SendMessageResult struct { MD5OfMessageAttributes string `xml:"MD5OfMessageAttributes"` MD5OfMessageBody string `xml:"MD5OfMessageBody"` @@ -15,6 +14,17 @@ type SendMessageResponse struct { Metadata ResponseMetadata `xml:"ResponseMetadata"` } +/*** List Queues Response */ +type ListQueuesResult struct { + QueueUrl []string `xml:"QueueUrl"` +} + +type ListQueuesResponse struct { + Xmlns string `xml:"xmlns,attr"` + Result ListQueuesResult `xml:"ListQueuesResult"` + Metadata ResponseMetadata `xml:"ResponseMetadata"` +} + /*** Receive Message Response */ type ResultMessage struct {