forked from quic-go/quic-go
78 lines
1.9 KiB
Go
78 lines
1.9 KiB
Go
package http09
|
|
|
|
import (
|
|
"crypto/tls"
|
|
"fmt"
|
|
"io"
|
|
"net"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"github.com/quic-go/quic-go"
|
|
"github.com/quic-go/quic-go/internal/testdata"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func startServer(t *testing.T) net.Addr {
|
|
t.Helper()
|
|
server := &Server{}
|
|
conn, err := net.ListenUDP("udp", &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 0})
|
|
require.NoError(t, err)
|
|
tr := &quic.Transport{Conn: conn}
|
|
tlsConf := testdata.GetTLSConfig()
|
|
tlsConf.NextProtos = []string{NextProto}
|
|
ln, err := tr.ListenEarly(tlsConf, &quic.Config{})
|
|
require.NoError(t, err)
|
|
done := make(chan struct{})
|
|
go func() {
|
|
defer close(done)
|
|
_ = server.ServeListener(ln)
|
|
}()
|
|
t.Cleanup(func() {
|
|
require.NoError(t, ln.Close())
|
|
<-done
|
|
})
|
|
return ln.Addr()
|
|
}
|
|
|
|
func TestHTTPRequest(t *testing.T) {
|
|
http.HandleFunc("/helloworld", func(w http.ResponseWriter, r *http.Request) {
|
|
_, _ = w.Write([]byte("Hello World!"))
|
|
})
|
|
|
|
addr := startServer(t)
|
|
|
|
rt := &RoundTripper{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}
|
|
t.Cleanup(func() { rt.Close() })
|
|
|
|
req := httptest.NewRequest(http.MethodGet, fmt.Sprintf("https://%s/helloworld", addr), nil)
|
|
rsp, err := rt.RoundTrip(req)
|
|
require.NoError(t, err)
|
|
data, err := io.ReadAll(rsp.Body)
|
|
require.NoError(t, err)
|
|
require.Equal(t, []byte("Hello World!"), data)
|
|
}
|
|
|
|
func TestHTTPHeaders(t *testing.T) {
|
|
http.HandleFunc("/headers", func(w http.ResponseWriter, r *http.Request) {
|
|
w.Header().Add("foo", "bar")
|
|
w.WriteHeader(1337)
|
|
_, _ = w.Write([]byte("done"))
|
|
})
|
|
|
|
addr := startServer(t)
|
|
|
|
rt := &RoundTripper{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}
|
|
t.Cleanup(func() { rt.Close() })
|
|
|
|
req := httptest.NewRequest(http.MethodGet, fmt.Sprintf("https://%s/headers", addr), nil)
|
|
rsp, err := rt.RoundTrip(req)
|
|
require.NoError(t, err)
|
|
data, err := io.ReadAll(rsp.Body)
|
|
require.NoError(t, err)
|
|
require.Equal(t, []byte("done"), data)
|
|
// HTTP/0.9 doesn't support HTTP headers
|
|
}
|