// Copyright 2026 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 import ( "fmt" "net/http" "reflect" _ "unsafe" // for linkname . "golang.org/x/net/internal/http3" ) //go:linkname registerServer net/http_test.registerHTTP3Server func registerServer(s *http.Server, opts any) error { var o ServerOpts if err := shallowStructCopy(&o, opts); err != nil { return err } return RegisterServer(s, o) } //go:linkname registerTransport net/http_test.registerHTTP3Transport func registerTransport(tr *http.Transport, opts any) error { var o TransportOpts if err := shallowStructCopy(&o, opts); err != nil { return err } return RegisterTransport(tr, o) } // shallowStructCopy copies every field in src to *dst. // src must be a struct, and dst must be a pointer to a struct. // // We use this to let net/http tests pass their own version of an options struct to // registerHTTP3{Server,Transport}. // // This is a temporary measure pending this package having a public API, // at which time net/http tests can use the ServerOpts and TransportOpts directly. func shallowStructCopy(dst, src any) error { dv := reflect.ValueOf(dst).Elem() sv := reflect.ValueOf(src) for i := range sv.Type().NumField() { stype := sv.Type().Field(i) if !stype.IsExported() { return fmt.Errorf("%T contains unexported fields", src) } sf := sv.Field(i) df := dv.FieldByName(stype.Name) if !df.CanSet() { return fmt.Errorf("%T.%v: field does not exist or is unassignable", dst, stype.Name) } if !sf.Type().AssignableTo(df.Type()) { return fmt.Errorf("%T.%v: %v is not assignable to %v", dst, stype.Name, sf.Type(), df.Type()) } df.Set(sf) } return nil }