Skip to content

Commit fcd0259

Browse files
authored
Update regex pattern allowing for optional space before expiry-date (#2224)
1 parent 1ed03f6 commit fcd0259

2 files changed

Lines changed: 75 additions & 1 deletion

File tree

utils.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ func amzExpirationToExpiryDateRuleID(expiration string) (time.Time, string) {
6464
return time.Time{}, ""
6565
}
6666

67-
var restoreRegex = regexp.MustCompile(`ongoing-request="(.*?)"(, expiry-date="(.*?)")?`)
67+
var restoreRegex = regexp.MustCompile(`ongoing-request="(.*?)"(, ?expiry-date="(.*?)")?`)
6868

6969
func amzRestoreToStruct(restore string) (ongoing bool, expTime time.Time, err error) {
7070
matches := restoreRegex.FindStringSubmatch(restore)

utils_test.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,80 @@ func TestExtractObjMetadata(t *testing.T) {
559559
}
560560
}
561561

562+
func TestAmzRestoreToStruct(t *testing.T) {
563+
tests := []struct {
564+
name string
565+
input string
566+
wantOng bool
567+
wantExpiry bool
568+
expectedExpiry string
569+
wantErr bool
570+
}{
571+
{
572+
name: "ongoing true without expiry",
573+
input: `ongoing-request="true"`,
574+
wantOng: true,
575+
wantExpiry: false,
576+
wantErr: false,
577+
},
578+
{
579+
name: "ongoing false with expiry",
580+
input: `ongoing-request="false", expiry-date="Wed, 21 Oct 2015 07:28:00 GMT"`,
581+
wantOng: false,
582+
wantExpiry: true,
583+
expectedExpiry: "Wed, 21 Oct 2015 07:28:00 GMT",
584+
wantErr: false,
585+
},
586+
{
587+
name: "no space after comma",
588+
input: `ongoing-request="false",expiry-date="Wed, 21 Oct 2015 07:28:00 GMT"`,
589+
wantOng: false,
590+
wantExpiry: true,
591+
expectedExpiry: "Wed, 21 Oct 2015 07:28:00 GMT",
592+
wantErr: false,
593+
},
594+
{
595+
name: "invalid header",
596+
input: `invalid-format`,
597+
wantErr: true,
598+
},
599+
}
600+
601+
for _, tt := range tests {
602+
t.Run(tt.name, func(t *testing.T) {
603+
ong, expTime, err := amzRestoreToStruct(tt.input)
604+
if tt.wantErr {
605+
if err == nil {
606+
t.Fatalf("expected error, got nil")
607+
}
608+
return
609+
}
610+
if err != nil {
611+
t.Fatalf("unexpected error: %v", err)
612+
}
613+
if ong != tt.wantOng {
614+
t.Errorf("ongoing: got %v, want %v", ong, tt.wantOng)
615+
}
616+
if tt.wantExpiry {
617+
if expTime.IsZero() {
618+
t.Errorf("expected expiry time, got zero")
619+
} else {
620+
// verify parsed expiry matches expected RFC7231 time
621+
expected, perr := parseRFC7231Time(tt.expectedExpiry)
622+
if perr != nil {
623+
t.Fatalf("failed to parse expected expiry: %v", perr)
624+
}
625+
if !expTime.Equal(expected) {
626+
t.Errorf("expiry time mismatch: got %v, want %v", expTime, expected)
627+
}
628+
}
629+
} else if !expTime.IsZero() {
630+
t.Errorf("did not expect expiry time, got %v", expTime)
631+
}
632+
})
633+
}
634+
}
635+
562636
func TestToObjectInfoHeaders(t *testing.T) {
563637
header := http.Header{
564638
"Etag": []string{`"d41d8cd98f00b204e9800998ecf8427e"`},

0 commit comments

Comments
 (0)