mirror of
https://github.com/truewhile/MeBox.git
synced 2026-10-06 21:36:37 +08:00
3
This commit is contained in:
@@ -40,7 +40,9 @@ func FileSHA1Partial(path string, start, end int64) (string, error) {
|
|||||||
}
|
}
|
||||||
length := end - start + 1
|
length := end - start + 1
|
||||||
h := sha1.New()
|
h := sha1.New()
|
||||||
if _, err := io.CopyN(h, f, length); err != nil {
|
// io.CopyN 在文件不足 length 字节时会返回 io.EOF,导致小文件(如小于 128 KiB 的
|
||||||
|
// 元数据图片)无法上传。这里只拷贝实际读到的字节,文件尾对齐到区间终点即可。
|
||||||
|
if _, err := io.CopyN(h, f, length); err != nil && err != io.EOF {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
return hex.EncodeToString(h.Sum(nil)), nil
|
return hex.EncodeToString(h.Sum(nil)), nil
|
||||||
|
|||||||
@@ -39,6 +39,26 @@ func TestFileSHA1Partial(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestFileSHA1PartialSmallerThanWindow 回归测试:经典 bug 是 io.CopyN 在文件不足
|
||||||
|
// length 字节时返回 io.EOF。115 上传固定用 [0,128*1024-1] 窗口计算 preid,导致所有
|
||||||
|
// 小于 128 KiB 的元数据文件(如海报/缩略图)上传必然失败。
|
||||||
|
func TestFileSHA1PartialSmallerThanWindow(t *testing.T) {
|
||||||
|
dir := t.TempDir()
|
||||||
|
path := filepath.Join(dir, "small.bin")
|
||||||
|
// 6 字节小文件,不足 128 KiB 窗口
|
||||||
|
if err := os.WriteFile(path, []byte("abcdef"), 0o644); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
sum, err := FileSHA1Partial(path, 0, 128*1024-1)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("compute partial sha1 for small file should not fail: %v", err)
|
||||||
|
}
|
||||||
|
// 应等于整个文件(6 字节)的 sha1
|
||||||
|
if sum != "1f8ac10f23c5b5bc1167bda84b833e5c057a77d2" {
|
||||||
|
t.Errorf("unexpected partial sha1: %s", sum)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestParseSignCheckRange(t *testing.T) {
|
func TestParseSignCheckRange(t *testing.T) {
|
||||||
rng, err := parseSignCheckRange("0-131071")
|
rng, err := parseSignCheckRange("0-131071")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user