// 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. package http3 const ( // https://www.rfc-editor.org/rfc/rfc9114.html#section-7.2.4.1 settingsMaxFieldSectionSize = 0x06 // https://www.rfc-editor.org/rfc/rfc9204.html#section-5 settingsQPACKMaxTableCapacity = 0x01 settingsQPACKBlockedStreams = 0x07 ) // writeSettings writes a complete SETTINGS frame. // Its parameter is a list of alternating setting types and values. func (st *stream) writeSettings(settings ...int64) { var size int64 for _, s := range settings { // Settings values that don't fit in a QUIC varint ([0,2^62)) will panic here. size += int64(sizeVarint(uint64(s))) } st.writeVarint(int64(frameTypeSettings)) st.writeVarint(size) for _, s := range settings { st.writeVarint(s) } } // readSettings reads a complete SETTINGS frame, including the frame header. func (st *stream) readSettings(f func(settingType, value int64) error) error { frameType, err := st.readFrameHeader() if err != nil || frameType != frameTypeSettings { return &connectionError{ code: errH3MissingSettings, message: "settings not sent on control stream", } } for st.lim > 0 { settingsType, err := st.readVarint() if err != nil { return err } settingsValue, err := st.readVarint() if err != nil { return err } // Use of HTTP/2 settings where there is no corresponding HTTP/3 setting // is an error. // https://www.rfc-editor.org/rfc/rfc9114.html#section-7.2.4.1-5 switch settingsType { case 0x02, 0x03, 0x04, 0x05: return &connectionError{ code: errH3SettingsError, message: "use of reserved setting", } } if err := f(settingsType, settingsValue); err != nil { return err } } return st.endFrame() }