mirror of
https://github.com/TeaOSLab/EdgeNode.git
synced 2025-11-03 23:20:25 +08:00
68 lines
1.3 KiB
Go
68 lines
1.3 KiB
Go
// Copyright 2024 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cloud .
|
|
|
|
package bfs
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
)
|
|
|
|
// LazyFileHeader load file header lazily to save memory
|
|
type LazyFileHeader struct {
|
|
rawData []byte
|
|
fileHeader *FileHeader
|
|
}
|
|
|
|
func NewLazyFileHeaderFromData(rawData []byte) *LazyFileHeader {
|
|
return &LazyFileHeader{
|
|
rawData: rawData,
|
|
}
|
|
}
|
|
|
|
func NewLazyFileHeader(fileHeader *FileHeader) *LazyFileHeader {
|
|
return &LazyFileHeader{
|
|
fileHeader: fileHeader,
|
|
}
|
|
}
|
|
|
|
func (this *LazyFileHeader) FileHeaderUnsafe() (*FileHeader, error) {
|
|
if this.fileHeader != nil {
|
|
return this.fileHeader, nil
|
|
}
|
|
|
|
var jsonPrefix = []byte("json:")
|
|
|
|
var header = &FileHeader{}
|
|
|
|
// json
|
|
if bytes.HasPrefix(this.rawData, jsonPrefix) {
|
|
err := json.Unmarshal(this.rawData[len(jsonPrefix):], header)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return header, nil
|
|
}
|
|
|
|
decompressor, err := SharedDecompressPool.Get(bytes.NewBuffer(this.rawData))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
defer func() {
|
|
_ = decompressor.Close()
|
|
SharedDecompressPool.Put(decompressor)
|
|
}()
|
|
|
|
err = json.NewDecoder(decompressor).Decode(header)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
header.IsWriting = false
|
|
|
|
this.fileHeader = header
|
|
this.rawData = nil
|
|
|
|
return header, nil
|
|
}
|