1
2
3
4
5 package http3
6
7 import (
8 "fmt"
9 "net/http"
10 "reflect"
11 _ "unsafe"
12
13 . "golang.org/x/net/internal/http3"
14 )
15
16
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
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
35
36
37
38
39
40
41
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