• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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