package http2
import (
)
type serverInternalState struct {
s1 *http.Server
initOnce sync.Once
serveConnFunc func(context.Context, net.Conn, http.Handler, bool, *http.Request, []byte)
}
func ( *http.Server, *Server) error {
if == nil {
panic("nil *http.Server")
}
if == nil {
= new(Server)
}
if .state != nil {
panic("ConfigureServer may be called only once per Server")
}
if , := , ; .IdleTimeout == 0 {
if .IdleTimeout != 0 {
.IdleTimeout = .IdleTimeout
} else {
.IdleTimeout = .ReadTimeout
}
}
if .TLSConfig == nil {
.TLSConfig = new(tls.Config)
}
if !slices.Contains(.TLSConfig.NextProtos, NextProtoTLS) {
.TLSConfig.NextProtos = append(.TLSConfig.NextProtos, NextProtoTLS)
}
if !slices.Contains(.TLSConfig.NextProtos, "http/1.1") {
.TLSConfig.NextProtos = append(.TLSConfig.NextProtos, "http/1.1")
}
.state = &serverInternalState{
s1: ,
}
:= &serverConfig{s: }
if := .Serve(); != nil || .serveConnFunc == nil {
panic("http2: net/http does not support this version of x/net/http2")
}
.state.serveConnFunc = .serveConnFunc
return nil
}
type serverConfig struct {
s *Server
serveConnFunc func(context.Context, net.Conn, http.Handler, bool, *http.Request, []byte)
}
func (*serverConfig) () (net.Conn, error) {
return nil, errors.New("unexpected call to Accept")
}
func (*serverConfig) () error {
return nil
}
func (*serverConfig) () net.Addr {
return nil
}
func ( *serverConfig) ( func(context.Context, net.Conn, http.Handler, bool, *http.Request, []byte)) {
.serveConnFunc =
}
func ( *serverConfig) () http.HTTP2Config {
return http.HTTP2Config{
MaxConcurrentStreams: int(.s.MaxConcurrentStreams),
MaxDecoderHeaderTableSize: int(.s.MaxDecoderHeaderTableSize),
MaxEncoderHeaderTableSize: int(.s.MaxEncoderHeaderTableSize),
MaxReadFrameSize: int(.s.MaxReadFrameSize),
PermitProhibitedCipherSuites: .s.PermitProhibitedCipherSuites,
MaxReceiveBufferPerConnection: int(.s.MaxUploadBufferPerConnection),
MaxReceiveBufferPerStream: int(.s.MaxUploadBufferPerStream),
SendPingTimeout: .s.ReadIdleTimeout,
PingTimeout: .s.PingTimeout,
WriteByteTimeout: .s.WriteByteTimeout,
CountError: .s.CountError,
}
}
func ( *serverConfig) () time.Duration {
return .s.IdleTimeout
}
type serverConn struct{}
func ( *Server) ( net.Conn, *ServeConnOpts, func(*serverConn)) {
var func(context.Context, net.Conn, http.Handler, bool, *http.Request, []byte)
switch {
case .BaseConfig != nil:
:= &http.Server{
TLSConfig: .BaseConfig.TLSConfig,
ReadTimeout: .BaseConfig.ReadTimeout,
ReadHeaderTimeout: .BaseConfig.ReadHeaderTimeout,
WriteTimeout: .BaseConfig.WriteTimeout,
IdleTimeout: .BaseConfig.IdleTimeout,
MaxHeaderBytes: .BaseConfig.MaxHeaderBytes,
ConnState: .BaseConfig.ConnState,
ErrorLog: .BaseConfig.ErrorLog,
BaseContext: .BaseConfig.BaseContext,
ConnContext: .BaseConfig.ConnContext,
HTTP2: .BaseConfig.HTTP2,
}
:= &serverConfig{s: }
if := .Serve(); != nil || .serveConnFunc == nil {
panic("http2: net/http does not support this version of x/net/http2")
}
= .serveConnFunc
case .state != nil:
= .state.serveConnFunc
default:
:= &http.Server{}
:= &serverConfig{s: }
if := .Serve(); != nil || .serveConnFunc == nil {
panic("http2: net/http does not support this version of x/net/http2")
}
= .serveConnFunc
}
, := serverConnBaseContext(, )
defer ()
(, , .handler(), .SawClientPreface, .UpgradeRequest, .Settings)
}
type FrameWriteRequest struct {
}
func ( FrameWriteRequest) () uint32 {
return 0
}
func ( FrameWriteRequest) () int {
return 0
}
func ( FrameWriteRequest) ( int32) (FrameWriteRequest, FrameWriteRequest, int) {
return FrameWriteRequest{}, FrameWriteRequest{}, 0
}
func ( FrameWriteRequest) () string {
return ""
}
func ( *PriorityWriteSchedulerConfig) WriteScheduler {
return unsupportedWriteScheduler{}
}
func () WriteScheduler {
return unsupportedWriteScheduler{}
}
type unsupportedWriteScheduler struct{}
func (unsupportedWriteScheduler) ( uint32, OpenStreamOptions) {}
func (unsupportedWriteScheduler) ( uint32) {}
func (unsupportedWriteScheduler) ( uint32, PriorityParam) {}
func (unsupportedWriteScheduler) ( FrameWriteRequest) {}
func (unsupportedWriteScheduler) () ( FrameWriteRequest, bool) {
return FrameWriteRequest{}, false
}