This repository was archived by the owner on Aug 17, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrange.go
More file actions
80 lines (68 loc) · 1.64 KB
/
range.go
File metadata and controls
80 lines (68 loc) · 1.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package httputil
import (
"errors"
"strconv"
"strings"
)
type HTTPRange struct {
Start, End, Size int64
}
// ErrInvalidFormat is returned when it is an invalid range format
var ErrInvalidFormat = errors.New("invalid range format")
// ErrInvalidRange is returned when it is an invalid range
var ErrInvalidRange = errors.New("invalid range")
// ParseContentRange parses the HTTP Content-Range header
//
// e.g.
// Content-Range: <unit> <range-start>-<range-end>/<size>
// Content-Range: <unit> <range-start>-<range-end>/*
// Content-Range: <unit> */<size>
func ParseContentRange(s string) (*HTTPRange, error) {
if s == "" {
return nil, ErrInvalidFormat // header not present
}
// Only bytes are supported (for now)
const b = "bytes "
if !strings.HasPrefix(s, b) {
return nil, ErrInvalidFormat
}
r := strings.Split(s[len(b):], "/")
if len(r) != 2 {
return nil, ErrInvalidFormat
}
ran := r[0]
size := strings.TrimSpace(r[1])
// Parse size
i, err := strconv.ParseInt(size, 10, 64)
if err != nil {
return nil, ErrInvalidFormat
}
httpRange := &HTTPRange{
Size: i,
}
// Parse ranges
r = strings.Split(ran, "-")
if len(r) != 2 {
return nil, ErrInvalidFormat
}
start := strings.TrimSpace(r[0])
end := strings.TrimSpace(r[1])
i, err = strconv.ParseInt(start, 10, 64)
if err != nil {
return nil, ErrInvalidFormat
}
httpRange.Start = i
i, err = strconv.ParseInt(end, 10, 64)
if err != nil {
return nil, ErrInvalidFormat
}
httpRange.End = i
// Ensure range validity
if httpRange.Start > httpRange.End {
return nil, ErrInvalidRange
}
if httpRange.End > httpRange.Size {
return nil, ErrInvalidRange
}
return httpRange, nil
}