blob: 0f35e0c54f129f8c8ab2f8cd813b504cc0293a3b [file] [log] [blame] [edit]
// Copyright 2025 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//go:build go1.24
package http3
type qpackEncoder struct {
// The encoder has no state for now,
// but that'll change once we add dynamic table support.
//
// TODO: dynamic table support.
}
func (qe *qpackEncoder) init() {
staticTableOnce.Do(initStaticTableMaps)
}
// encode encodes a list of headers into a QPACK encoded field section.
//
// The headers func must produce the same headers on repeated calls,
// although the order may vary.
func (qe *qpackEncoder) encode(headers func(func(itype indexType, name, value string))) []byte {
// Encoded Field Section prefix.
//
// We don't yet use the dynamic table, so both values here are zero.
var b []byte
b = appendPrefixedInt(b, 0, 8, 0) // Required Insert Count
b = appendPrefixedInt(b, 0, 7, 0) // Delta Base
headers(func(itype indexType, name, value string) {
if itype == mayIndex {
if i, ok := staticTableByNameValue[tableEntry{name, value}]; ok {
b = appendIndexedFieldLine(b, staticTable, i)
return
}
}
if i, ok := staticTableByName[name]; ok {
b = appendLiteralFieldLineWithNameReference(b, staticTable, itype, i, value)
} else {
b = appendLiteralFieldLineWithLiteralName(b, itype, name, value)
}
})
return b
}