• 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
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