diff --git a/main.go b/main.go index 49f4dee..5a92567 100644 --- a/main.go +++ b/main.go @@ -1,7 +1,50 @@ package main -import "fmt" +import ( + "fmt" + "net/http" + "time" +) + +// ParseRetryAfter handles both integer seconds and HTTP-date format in Retry-After header. +// The bug: only integer seconds are parsed; HTTP-date format is ignored, causing incorrect retry timing. +// Fix: Detect format and parse accordingly. +func ParseRetryAfter(header string) time.Duration { + if header == "" { + return 0 + } + + // Try parsing as integer seconds + var seconds int + if _, err := fmt.Sscanf(header, "%d", &seconds); err == nil { + return time.Duration(seconds) * time.Second + } + + // Try parsing as HTTP-date format (RFC1123) + t, err := time.Parse(http.TimeFormat, header) + if err != nil { + // Try RFC850 + t, err = time.Parse(time.RFC850, header) + } + if err != nil { + // Try ANSI C asRFC822Z + t, err = time.Parse(time.RFC822Z, header) + } + if err != nil { + return 0 // unparseable, no retry delay + } + + delay := time.Until(t) + if delay < 0 { + return 0 + } + return delay +} func main() { - fmt.Println("Hello, Bounty Hunter!") + tests := []string{"120", "Wed, 21 Oct 2026 07:28:00 GMT", "invalid"} + for _, t := range tests { + d := ParseRetryAfter(t) + fmt.Printf("Retry-After: %q -> %v\n", t, d) + } }