Source file src/vendor/golang.org/x/net/http3/http3.go

     1  // Copyright 2026 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package http3
     6  
     7  import (
     8  	"fmt"
     9  	"net/http"
    10  	"reflect"
    11  	_ "unsafe" // for linkname
    12  
    13  	. "golang.org/x/net/internal/http3"
    14  )
    15  
    16  //go:linkname registerServer net/http_test.registerHTTP3Server
    17  func registerServer(s *http.Server, opts any) error {
    18  	var o ServerOpts
    19  	if err := shallowStructCopy(&o, opts); err != nil {
    20  		return err
    21  	}
    22  	return RegisterServer(s, o)
    23  }
    24  
    25  //go:linkname registerTransport net/http_test.registerHTTP3Transport
    26  func registerTransport(tr *http.Transport, opts any) error {
    27  	var o TransportOpts
    28  	if err := shallowStructCopy(&o, opts); err != nil {
    29  		return err
    30  	}
    31  	return RegisterTransport(tr, o)
    32  }
    33  
    34  // shallowStructCopy copies every field in src to *dst.
    35  // src must be a struct, and dst must be a pointer to a struct.
    36  //
    37  // We use this to let net/http tests pass their own version of an options struct to
    38  // registerHTTP3{Server,Transport}.
    39  //
    40  // This is a temporary measure pending this package having a public API,
    41  // at which time net/http tests can use the ServerOpts and TransportOpts directly.
    42  func shallowStructCopy(dst, src any) error {
    43  	dv := reflect.ValueOf(dst).Elem()
    44  	sv := reflect.ValueOf(src)
    45  	for i := range sv.Type().NumField() {
    46  		stype := sv.Type().Field(i)
    47  		if !stype.IsExported() {
    48  			return fmt.Errorf("%T contains unexported fields", src)
    49  		}
    50  		sf := sv.Field(i)
    51  		df := dv.FieldByName(stype.Name)
    52  		if !df.CanSet() {
    53  			return fmt.Errorf("%T.%v: field does not exist or is unassignable", dst, stype.Name)
    54  		}
    55  		if !sf.Type().AssignableTo(df.Type()) {
    56  			return fmt.Errorf("%T.%v: %v is not assignable to %v", dst, stype.Name, sf.Type(), df.Type())
    57  		}
    58  		df.Set(sf)
    59  	}
    60  	return nil
    61  }
    62  

View as plain text