1//go:build quic 2 3package nghttp2 4 5import ( 6 "bytes" 7 "context" 8 "crypto/tls" 9 "io" 10 "net/http" 11 "net/url" 12 "time" 13 14 "github.com/quic-go/quic-go/http3" 15) 16 17func (st *serverTester) http3(rp requestParam) (*serverResponse, error) { 18 rt := &http3.RoundTripper{ 19 TLSClientConfig: &tls.Config{ 20 InsecureSkipVerify: true, 21 }, 22 } 23 24 defer rt.Close() 25 26 c := &http.Client{ 27 Transport: rt, 28 } 29 30 method := "GET" 31 if rp.method != "" { 32 method = rp.method 33 } 34 35 var body io.Reader 36 37 if rp.body != nil { 38 body = bytes.NewBuffer(rp.body) 39 } 40 41 reqURL := st.url 42 43 if rp.path != "" { 44 u, err := url.Parse(st.url) 45 if err != nil { 46 st.t.Fatalf("Error parsing URL from st.url %v: %v", st.url, err) 47 } 48 u.Path = "" 49 u.RawQuery = "" 50 reqURL = u.String() + rp.path 51 } 52 53 ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) 54 defer cancel() 55 56 req, err := http.NewRequestWithContext(ctx, method, reqURL, body) 57 if err != nil { 58 return nil, err 59 } 60 61 for _, h := range rp.header { 62 req.Header.Add(h.Name, h.Value) 63 } 64 65 req.Header.Add("Test-Case", rp.name) 66 67 // TODO http3 package does not support trailer at the time of 68 // this writing. 69 70 resp, err := c.Do(req) 71 if err != nil { 72 return nil, err 73 } 74 75 defer resp.Body.Close() 76 77 respBody, err := io.ReadAll(resp.Body) 78 if err != nil { 79 return nil, err 80 } 81 82 res := &serverResponse{ 83 status: resp.StatusCode, 84 header: resp.Header, 85 body: respBody, 86 connClose: resp.Close, 87 } 88 89 return res, nil 90} 91