Skip to content

Commit b313ac4

Browse files
authored
fix(crypt): fix 139cloud hack (#5178)
(cherry picked from commit 18bf64a)
1 parent f2f312b commit b313ac4

2 files changed

Lines changed: 27 additions & 6 deletions

File tree

internal/stream/util.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ func GetRangeReadCloserFromLink(size int64, link *model.Link) (model.RangeReadCl
4343
return nil, fmt.Errorf("http request failure,status: %d err:%s", response.StatusCode, err)
4444
}
4545
if r.Start == 0 && (r.Length == -1 || r.Length == size) || response.StatusCode == http.StatusPartialContent ||
46-
checkContentRange(&response.Header, size, r.Start) {
46+
checkContentRange(&response.Header, r.Start) {
4747
return response.Body, nil
4848
} else if response.StatusCode == http.StatusOK {
4949
log.Warnf("remote http server not supporting range request, expect low perfromace!")
@@ -72,12 +72,12 @@ func RequestRangedHttp(ctx context.Context, link *model.Link, offset, length int
7272
}
7373

7474
// 139 cloud does not properly return 206 http status code, add a hack here
75-
func checkContentRange(header *http.Header, size, offset int64) bool {
76-
r, err2 := http_range.ParseRange(header.Get("Content-Range"), size)
77-
if err2 != nil {
78-
log.Warnf("exception trying to parse Content-Range, will ignore,err=%s", err2)
75+
func checkContentRange(header *http.Header, offset int64) bool {
76+
start, _, err := http_range.ParseContentRange(header.Get("Content-Range"))
77+
if err != nil {
78+
log.Warnf("exception trying to parse Content-Range, will ignore,err=%s", err)
7979
}
80-
if len(r) == 1 && r[0].Start == offset {
80+
if start == offset {
8181
return true
8282
}
8383
return false

pkg/http_range/range.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,27 @@ func ParseRange(s string, size int64) ([]Range, error) { // nolint:gocognit
107107
return ranges, nil
108108
}
109109

110+
// ParseContentRange this function parse content-range in http response
111+
func ParseContentRange(s string) (start, end int64, err error) {
112+
if s == "" {
113+
return 0, 0, ErrInvalid
114+
}
115+
const b = "bytes "
116+
if !strings.HasPrefix(s, b) {
117+
return 0, 0, ErrInvalid
118+
}
119+
p1 := strings.Index(s, "-")
120+
p2 := strings.Index(s, "/")
121+
if p1 < 0 || p2 < 0 {
122+
return 0, 0, ErrInvalid
123+
}
124+
startStr, endStr := textproto.TrimString(s[len(b):p1]), textproto.TrimString(s[p1+1:p2])
125+
start, startErr := strconv.ParseInt(startStr, 10, 64)
126+
end, endErr := strconv.ParseInt(endStr, 10, 64)
127+
128+
return start, end, errors.Join(startErr, endErr)
129+
}
130+
110131
func (r Range) MimeHeader(contentType string, size int64) textproto.MIMEHeader {
111132
return textproto.MIMEHeader{
112133
"Content-Range": {r.ContentRange(size)},

0 commit comments

Comments
 (0)