parseTimeout parses the Timeout HTTP header, as per section 10.7. If s is empty, an infiniteTimeout is returned.
(s string)
| 419 | // parseTimeout parses the Timeout HTTP header, as per section 10.7. If s is |
| 420 | // empty, an infiniteTimeout is returned. |
| 421 | func parseTimeout(s string) (time.Duration, error) { |
| 422 | if s == "" { |
| 423 | return infiniteTimeout, nil |
| 424 | } |
| 425 | if i := strings.IndexByte(s, ','); i >= 0 { |
| 426 | s = s[:i] |
| 427 | } |
| 428 | s = strings.TrimSpace(s) |
| 429 | if s == "Infinite" { |
| 430 | return infiniteTimeout, nil |
| 431 | } |
| 432 | const pre = "Second-" |
| 433 | if !strings.HasPrefix(s, pre) { |
| 434 | return 0, errInvalidTimeout |
| 435 | } |
| 436 | s = s[len(pre):] |
| 437 | if s == "" || s[0] < '0' || '9' < s[0] { |
| 438 | return 0, errInvalidTimeout |
| 439 | } |
| 440 | n, err := strconv.ParseInt(s, 10, 64) |
| 441 | if err != nil || 1<<32-1 < n { |
| 442 | return 0, errInvalidTimeout |
| 443 | } |
| 444 | return time.Duration(n) * time.Second, nil |
| 445 | } |
no outgoing calls