Help us shape the future of Go! Take the 2026 Go Developer Survey

container

package
v0.1.6 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 27, 2026 License: Apache-2.0 Imports: 14 Imported by: 0

Documentation

Overview

Package container 提供 OFD 文档容器的索引、安全读取、逻辑包视图及 ZIP 压缩和规模预算。

Index

Constants

View Source
const (
	// DefaultMaxEntries 是默认的最大条目数。
	DefaultMaxEntries = 10000
	// DefaultMaxEntryBytes 是默认的单条解压上限(64MB)。
	DefaultMaxEntryBytes = int64(64 << 20)
	// DefaultMaxTotalBytes 是默认的解压总字节上限(512MB)。
	DefaultMaxTotalBytes = int64(512 << 20)
)
View Source
const DefaultCompressionLevel = 5

DefaultCompressionLevel 是 DEFLATE 的默认压缩级别,与 klauspost zip 的 默认一致。级别越高压缩率越高、写入越慢。

Variables

View Source
var (
	// ErrReadLimitExceeded 表示读取的解压后内容超过了大小限制。
	ErrReadLimitExceeded = errors.New("读取内容超过大小限制")
	// ErrPackageClosed 表示 ZIP 包已经关闭。
	ErrPackageClosed = errors.New("ZIP 包已经关闭")
)

Functions

func ApplyCompressionLevel

func ApplyCompressionLevel(w *zip.Writer, level int)

ApplyCompressionLevel 在 zip.Writer 上按级别注册 DEFLATE 压缩器,必须 在第一次创建 Deflate 条目之前调用。level 为 0 或默认级别时保持 klauspost 的默认实现,不注册。调用方应先通过 NormalizeCompressionLevel 校验级别。

func CheckSize

func CheckSize(name string, size, maxEntryBytes, maxTotalBytes int64, remaining *int64) error

CheckSize 校验内存条目 size 是否在单条与总预算内,并在通过后扣减总预算。

func EntryMethod

func EntryMethod(name string, mode CompressionMode) uint16

EntryMethod 返回 ZIP 条目的压缩方式。mode 为 "store" 或 "deflate" 时 强制指定;其他值按扩展名自动选择:本身已压缩的格式使用 Store,其余使用 Deflate。

func NormalizeCompressionLevel

func NormalizeCompressionLevel(level int) (int, error)

NormalizeCompressionLevel 校验 DEFLATE 压缩级别:0 表示使用默认级别 DefaultCompressionLevel,显式范围 1(最快)到 9(最紧凑)。返回实际 应使用的压缩级别。

func ValidateEntryName

func ValidateEntryName(name string) error

ValidateEntryName 校验 OFD 包条目的相对路径是否安全:非空、不以斜杠开头、 不含反斜杠或 NUL,且清理后保持原样(不含 . 或 .. 片段)。该函数不检查同名重复。

func ValidateLimits

func ValidateLimits(limits Limits) error

ValidateLimits 校验解压规模限制不能为负数。

Types

type CompressionMode

type CompressionMode string

CompressionMode 表示 OFD ZIP 条目的压缩策略。

const (
	// CompressionAuto 对已压缩格式使用 Store,其他文件使用 Deflate。
	CompressionAuto CompressionMode = "auto"
	// CompressionDeflate 对所有条目使用 Deflate。
	CompressionDeflate CompressionMode = "deflate"
	// CompressionStore 对所有条目使用 Store。
	CompressionStore CompressionMode = "store"
)

func NormalizeCompression

func NormalizeCompression(mode CompressionMode) (CompressionMode, error)

NormalizeCompression 返回合法化的压缩策略:空值使用 CompressionAuto, 不支持的值返回错误。

type Entry

type Entry struct {
	// Virtual 表示元数据描述的是逻辑条目,不对应实际 ZIP 文件头。
	Virtual bool
	// SizeUnknown 和 Locked 仅用于部分解锁的逻辑视图。
	SizeUnknown bool
	Locked      bool
	// Name 是 ZIP 条目的原始名称。
	Name string
	// Path 是去除开头斜杠后的包内查找路径。
	Path string
	// CompressedSize 是条目的压缩后大小。
	CompressedSize uint64
	// UncompressedSize 是条目的解压后大小。
	UncompressedSize uint64
	// Method 是 ZIP 压缩方法编号。
	Method uint16
	// CRC32 是条目的 CRC-32 校验值。
	CRC32 uint32
	// Modified 是条目的修改时间。
	Modified time.Time
	// Mode 是条目的文件模式。
	Mode fs.FileMode
	// IsDir 表示条目是否为目录。
	IsDir bool
	// contains filtered or unexported fields
}

Entry 描述 OFD ZIP 包中的一个条目。

type LimitWriter

type LimitWriter struct {
	// contains filtered or unexported fields
}

LimitWriter 在复制过程中同时限制单条与总解压字节数,防止声明的解压 大小与实际不符(如 zip bomb)。

func NewLimitWriter

func NewLimitWriter(writer io.Writer, name string, entryRemaining, maxTotal int64, totalRemaining *int64) *LimitWriter

NewLimitWriter 返回带限制的 writer;totalRemaining 指向调用方的总预算, 每次写入后同步扣减。

func (*LimitWriter) Write

func (l *LimitWriter) Write(p []byte) (int, error)

type Limits

type Limits struct {
	// MaxEntries 是允许搬运的最大条目数,0 表示默认 10000。
	MaxEntries int
	// MaxEntryBytes 是单个条目解压后的最大字节数,0 表示默认 64MB。
	MaxEntryBytes int64
	// MaxTotalBytes 是所有条目解压后的总字节上限,0 表示默认 512MB。
	MaxTotalBytes int64
}

Limits 限制 OFD 包读写的规模,避免恶意或异常文档造成的解压放大。

type Package

type Package struct {
	// contains filtered or unexported fields
}

Package 提供 OFD ZIP 包的条目索引和内容读取能力。

func NewVirtual

func NewVirtual(entries []Entry, open func(string) (io.ReadCloser, error), closer io.Closer) (*Package, error)

NewVirtual 创建不可变的包访问视图。元数据及其 Virtual 标记由调用方提供, 每次打开条目均返回新的读取器。closer 释放当前视图的租约, 不影响同一数据源的其他视图。

func OpenBytes

func OpenBytes(data []byte) (*Package, error)

OpenBytes 从字节数据打开 OFD ZIP 包。

func OpenFile

func OpenFile(filename string) (*Package, error)

OpenFile 从文件路径打开 OFD ZIP 包。 返回的 Package 使用完毕后应调用 Close。

func OpenReader

func OpenReader(reader io.Reader) (*Package, error)

OpenReader 从读取器中读取全部数据并打开 OFD ZIP 包。 调用方仍负责关闭传入的 reader。

func OpenReaderAt

func OpenReaderAt(reader io.ReaderAt, size int64) (*Package, error)

OpenReaderAt 从随机访问读取器打开 OFD ZIP 包,无需把数据整体复制到内存。 size 必须是数据的完整字节长度。调用方仍负责关闭底层 reader。

func (*Package) Close

func (p *Package) Close() error

Close 关闭由 OpenFile 创建的 ZIP 包,并释放其文件句柄。 对 OpenBytes 和 OpenReader 创建的对象,Close 没有额外操作。

func (*Package) Entries

func (p *Package) Entries() []Entry

Entries 返回 ZIP 包条目的元数据快照,顺序与 ZIP 中的条目顺序一致。

func (*Package) Has

func (p *Package) Has(fileName string) bool

Has 判断 ZIP 包中是否存在指定名称的条目。

func (*Package) InputSize

func (p *Package) InputSize() int64

InputSize 返回原始 ZIP 的字节数;通用虚拟数据源返回 0。

func (*Package) Lookup

func (p *Package) Lookup(fileName string) (Entry, bool)

Lookup 查找指定名称的 ZIP 条目元数据。 如果多个条目规范化后路径相同,返回 ZIP 中最后出现的条目;全部条目可通过 Entries 获取。

func (*Package) Open

func (p *Package) Open(fileName string) (io.ReadCloser, error)

Open 打开 ZIP 包内的条目,返回解压后的读取器。

func (*Package) OpenEntry

func (p *Package) OpenEntry(entry Entry) (io.ReadCloser, error)

OpenEntry 打开 Entries 返回的指定 ZIP 条目。 与 Open 不同,OpenEntry 不会因条目名称重复而切换到其他条目。

func (*Package) Read

func (p *Package) Read(fileName string) ([]byte, error)

Read 读取 ZIP 包内条目的全部解压后内容。

func (*Package) ReadLimit

func (p *Package) ReadLimit(fileName string, limit int64) ([]byte, error)

ReadLimit 读取 ZIP 包内条目的解压后内容,并限制最大字节数。 limit 为 0 时表示不限制。

func (*Package) ReadXML

func (p *Package) ReadXML(fileName string, target any) error

ReadXML 解析 ZIP 包内的 XML 文件。

func (*Package) ReadXMLLimit

func (p *Package) ReadXMLLimit(fileName string, target any, limit int64) error

ReadXMLLimit 解析 ZIP 包内的 XML 文件,并限制最大字节数。 limit 为 0 时表示不限制。

func (*Package) WalkEntries

func (p *Package) WalkEntries(fn func(Entry) bool) error

WalkEntries 按 ZIP 条目顺序遍历条目元数据。 回调返回 false 时停止遍历;该方法不会创建完整的条目快照或查找索引。

type PackageSource

type PackageSource interface{ OFDPackage() (*Package, error) }

PackageSource 提供由使用方持有的逻辑 OFD 包租约。 关闭返回的包不得关闭同一数据源的其他租约。

Directories

Path Synopsis
Package entrywriter 提供带规模限制与确定性选项的 OFD ZIP 条目写入器, 供 ZIP 级处理工具(如 pkg/merge、pkg/replace)复用。
Package entrywriter 提供带规模限制与确定性选项的 OFD ZIP 条目写入器, 供 ZIP 级处理工具(如 pkg/merge、pkg/replace)复用。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL