fix: don't rely on content length, but do a basic heuristic by reading 1 byte past the max upload, if if we haven't hit the limit and the sizes don't match, then error, but otherwise take an optimistic stance
This commit is contained in:
parent
c0fa8d4ea3
commit
a5c1356847
20
api/s5/s5.go
20
api/s5/s5.go
|
@ -1085,31 +1085,25 @@ func (s *S5API) pinEntity(ctx context.Context, userId uint, cid *encoding.CID) e
|
||||||
}
|
}
|
||||||
}(res.Body)
|
}(res.Body)
|
||||||
|
|
||||||
contentLengthStr := res.Header.Get("Content-Length")
|
// Use io.LimitedReader to limit the download size and attempt to detect if there's more data.
|
||||||
if contentLengthStr == "" {
|
limitedReader := &io.LimitedReader{R: res.Body, N: int64(s.config.Config().Core.PostUploadLimit + 1)}
|
||||||
err = dlUriProvider.Downvote(location)
|
data, err := io.ReadAll(limitedReader)
|
||||||
if err != nil {
|
|
||||||
s.logger.Error("Error downvoting location", zap.Error(err))
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
|
|
||||||
contentLength, err := strconv.ParseInt(contentLengthStr, 10, 64)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, false
|
return nil, false
|
||||||
}
|
}
|
||||||
|
|
||||||
if !isCidManifest(cid) {
|
if !isCidManifest(cid) {
|
||||||
if uint64(contentLength) != cid.Size {
|
if limitedReader.N >= 0 && uint64(len(data)) != cid.Size {
|
||||||
return nil, false
|
return nil, false
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
data, err := io.ReadAll(res.Body)
|
dataCont, err := io.ReadAll(res.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, false
|
return nil, false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data = append(data, dataCont...)
|
||||||
|
|
||||||
proof, err := s.storage.HashObject(ctx, bytes.NewReader(data))
|
proof, err := s.storage.HashObject(ctx, bytes.NewReader(data))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, false
|
return nil, false
|
||||||
|
|
Loading…
Reference in New Issue