fix: v0.1.19 — валидация VisibilityTimeout/WaitTimeSeconds/пустой MessageBody, fix hardcore_test LONG_Q length

This commit is contained in:
Naeel
2026-04-11 15:56:31 +03:00
parent 95d1dc1adb
commit d633e59a50
5 changed files with 90 additions and 76 deletions
+3 -2
View File
@@ -10,6 +10,7 @@ import (
"shared-sqs/app/interfaces" "shared-sqs/app/interfaces"
"shared-sqs/app/models" "shared-sqs/app/models"
"shared-sqs/app/utils" "shared-sqs/app/utils"
"github.com/gorilla/mux" "github.com/gorilla/mux"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
@@ -41,8 +42,8 @@ key := tenantQueueKey(t.AccessKey, queueName)
receiptHandle := requestBody.ReceiptHandle receiptHandle := requestBody.ReceiptHandle
visibilityTimeout := requestBody.VisibilityTimeout visibilityTimeout := requestBody.VisibilityTimeout
if visibilityTimeout > 43200 { if visibilityTimeout < 0 || visibilityTimeout > 43200 {
return utils.CreateErrorResponseV1("ValidationError", true) return utils.CreateErrorResponseV1("InvalidParameterValue", true)
} }
if _, ok := models.SyncQueues.Queues[key]; !ok { if _, ok := models.SyncQueues.Queues[key]; !ok {
+9 -2
View File
@@ -57,14 +57,21 @@ func ReceiveMessageV1(req *http.Request) (int, interfaces.AbstractResponseBody)
var messages []*models.ResultMessage var messages []*models.ResultMessage
respStruct := models.ReceiveMessageResponse{} respStruct := models.ReceiveMessageResponse{}
// Валидация VisibilityTimeout: AWS SQS допускает 0–43200
if requestBody.VisibilityTimeout < 0 || requestBody.VisibilityTimeout > MaxVisibilityTimeout {
return utils.CreateErrorResponseV1("InvalidParameterValue", true)
}
waitTimeSeconds := requestBody.WaitTimeSeconds waitTimeSeconds := requestBody.WaitTimeSeconds
if waitTimeSeconds == 0 { if waitTimeSeconds == 0 {
models.SyncQueues.RLock() models.SyncQueues.RLock()
waitTimeSeconds = models.SyncQueues.Queues[key].ReceiveMessageWaitTimeSeconds waitTimeSeconds = models.SyncQueues.Queues[key].ReceiveMessageWaitTimeSeconds
models.SyncQueues.RUnlock() models.SyncQueues.RUnlock()
} }
// Fix #4: clamp WaitTimeSeconds к AWS лимиту 0–20 // Валидация WaitTimeSeconds: AWS SQS допускает 0–20, иначе ошибка
waitTimeSeconds = ClampInt(waitTimeSeconds, 0, MaxReceiveMessageWaitTimeSeconds) if waitTimeSeconds < 0 || waitTimeSeconds > MaxReceiveMessageWaitTimeSeconds {
return utils.CreateErrorResponseV1("InvalidParameterValue", true)
}
if waitTimeSeconds > 0 { if waitTimeSeconds > 0 {
deadline := time.Now().Add(time.Duration(waitTimeSeconds) * time.Second) deadline := time.Now().Add(time.Duration(waitTimeSeconds) * time.Second)
+3
View File
@@ -35,6 +35,9 @@ func SendMessageV1(req *http.Request) (int, interfaces.AbstractResponseBody) {
} }
messageBody := requestBody.MessageBody messageBody := requestBody.MessageBody
if messageBody == "" {
return utils.CreateErrorResponseV1("MissingParameter", true)
}
messageGroupID := requestBody.MessageGroupId messageGroupID := requestBody.MessageGroupId
messageDeduplicationID := requestBody.MessageDeduplicationId messageDeduplicationID := requestBody.MessageDeduplicationId
+2
View File
@@ -22,6 +22,8 @@ func init() {
"ValidationError": {HttpError: http.StatusBadRequest, Type: "ValidationError", Code: "AWS.SimpleQueueService.ValidationError", Message: "The input fails to satisfy the constraints specified by an AWS service."}, "ValidationError": {HttpError: http.StatusBadRequest, Type: "ValidationError", Code: "AWS.SimpleQueueService.ValidationError", Message: "The input fails to satisfy the constraints specified by an AWS service."},
// LimitExceeded — превышен лимит очередей тенанта (max_queues) // LimitExceeded — превышен лимит очередей тенанта (max_queues)
"LimitExceeded": {HttpError: http.StatusBadRequest, Type: "LimitExceeded", Code: "AWS.SimpleQueueService.LimitExceeded", Message: "You've reached the limit on the number of queues."}, "LimitExceeded": {HttpError: http.StatusBadRequest, Type: "LimitExceeded", Code: "AWS.SimpleQueueService.LimitExceeded", Message: "You've reached the limit on the number of queues."},
// MissingParameter — обязательный параметр отсутствует (например, пустой MessageBody)
"MissingParameter": {HttpError: http.StatusBadRequest, Type: "MissingParameter", Code: "MissingParameter", Message: "The request must contain the parameter MessageBody."},
} }
SnsErrors = map[string]SnsErrorType{ SnsErrors = map[string]SnsErrorType{
"InvalidParameterValue": {HttpError: http.StatusBadRequest, Type: "InvalidParameterValue", Code: "AWS.SimpleNotificationService.InvalidParameterValue", Message: "An invalid or out-of-range value was supplied for the input parameter."}, "InvalidParameterValue": {HttpError: http.StatusBadRequest, Type: "InvalidParameterValue", Code: "AWS.SimpleNotificationService.InvalidParameterValue", Message: "An invalid or out-of-range value was supplied for the input parameter."},
+5 -4
View File
@@ -738,14 +738,15 @@ echo "── 15. Граничные случаи: имена, пустые те
# ═══════════════════════════════════════════ # ═══════════════════════════════════════════
# Очень длинное имя очереди (AWS позволяет до 80 символов) # Очень длинное имя очереди (AWS позволяет до 80 символов)
LONG_Q=$(printf 'q%.0s' {1..70})"-${TS}" # 69 q's + "-" + 10 цифр TS = 80 символов (ровно лимит)
LONG_Q=$(printf 'q%.0s' {1..69})"-${TS}"
LONG_QURL=$(qurl "$T1_ID" "$LONG_Q") LONG_QURL=$(qurl "$T1_ID" "$LONG_Q")
R=$(sqs "$T1_AK" "$T1_SK" create-queue --queue-name "$LONG_Q" 2>&1) R=$(sqs "$T1_AK" "$T1_SK" create-queue --queue-name "$LONG_Q" 2>&1)
check "Граница: длинное имя очереди (70 сим)" "$R" "Queue" check "Граница: длинное имя очереди (80 сим)" "$R" "Queue"
# Пустое тело сообщения # Пустое тело сообщения — AWS SQS требует непустой MessageBody
R=$(sqs "$T1_AK" "$T1_SK" send-message --queue-url "$LONG_QURL" --message-body "" 2>&1) R=$(sqs "$T1_AK" "$T1_SK" send-message --queue-url "$LONG_QURL" --message-body "" 2>&1)
check "Граница: пустое тело сообщения" "$R" "MessageId" check "Граница: пустое тело сообщения → ошибка" "$R" "ERROR|Error|error|MissingParameter|Invalid"
# Receive из пустой очереди # Receive из пустой очереди
sqs "$T1_AK" "$T1_SK" purge-queue --queue-url "$LONG_QURL" >/dev/null 2>&1 || true sqs "$T1_AK" "$T1_SK" purge-queue --queue-url "$LONG_QURL" >/dev/null 2>&1 || true