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 49 u.Path = "" 50 u.RawQuery = "" 51 reqURL = u.String() + rp.path 52 } 53 54 ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) 55 defer cancel() 56 57 req, err := http.NewRequestWithContext(ctx, method, reqURL, body) 58 if err != nil { 59 return nil, err 60 } 61 62 for _, h := range rp.header { 63 req.Header.Add(h.Name, h.Value) 64 } 65 66 req.Header.Add("Test-Case", rp.name) 67 68 // TODO http3 package does not support trailer at the time of 69 // this writing. 70 71 resp, err := c.Do(req) 72 if err != nil { 73 return nil, err 74 } 75 76 defer resp.Body.Close() 77 78 respBody, err := io.ReadAll(resp.Body) 79 if err != nil { 80 return nil, err 81 } 82 83 res := &serverResponse{ 84 status: resp.StatusCode, 85 header: resp.Header, 86 body: respBody, 87 connClose: resp.Close, 88 } 89 90 return res, nil 91} 92