diff options
Diffstat (limited to 'format/pack/ingest/header.go')
| -rw-r--r-- | format/pack/ingest/header.go | 41 |
1 files changed, 28 insertions, 13 deletions
diff --git a/format/pack/ingest/header.go b/format/pack/ingest/header.go index fba2b175..76d43bef 100644 --- a/format/pack/ingest/header.go +++ b/format/pack/ingest/header.go @@ -3,32 +3,47 @@ package ingest import ( "encoding/binary" "fmt" + "io" "codeberg.org/lindenii/furgit/format/pack" ) -// readAndValidatePackHeader reads and validates PACK header from the stream. -func readAndValidatePackHeader(state *ingestState) error { - var hdr [12]byte +const packHeaderSize = 12 - err := state.stream.readFull(hdr[:]) +// readAndValidatePackHeader reads one PACK header from src and validates it. +func readAndValidatePackHeader(src io.Reader) (HeaderInfo, [packHeaderSize]byte, error) { + var hdr [packHeaderSize]byte + + _, err := io.ReadFull(src, hdr[:]) + if err != nil { + return HeaderInfo{}, [packHeaderSize]byte{}, &InvalidPackHeaderError{ + Reason: fmt.Sprintf("read header: %v", err), + } + } + + header, err := parseAndValidatePackHeader(hdr) if err != nil { - return &InvalidPackHeaderError{Reason: fmt.Sprintf("read header: %v", err)} + return HeaderInfo{}, [packHeaderSize]byte{}, err } + return header, hdr, nil +} + +// parseAndValidatePackHeader validates one already-read PACK header. +func parseAndValidatePackHeader(hdr [packHeaderSize]byte) (HeaderInfo, error) { if binary.BigEndian.Uint32(hdr[:4]) != pack.Signature { - return &InvalidPackHeaderError{Reason: "signature mismatch"} + return HeaderInfo{}, &InvalidPackHeaderError{Reason: "signature mismatch"} } version := binary.BigEndian.Uint32(hdr[4:8]) if !pack.VersionSupported(version) { - return &InvalidPackHeaderError{Reason: fmt.Sprintf("unsupported version %d", version)} - } - - state.objectCountHeader = binary.BigEndian.Uint32(hdr[8:12]) - if state.objectCountHeader == 0 { - return &InvalidPackHeaderError{Reason: "zero objects"} + return HeaderInfo{}, &InvalidPackHeaderError{ + Reason: fmt.Sprintf("unsupported version %d", version), + } } - return nil + return HeaderInfo{ + Version: version, + ObjectCount: binary.BigEndian.Uint32(hdr[8:12]), + }, nil } |
