diff --git a/internal/http3/server.go b/internal/http3/server.go index 0bd8e8c6..ef7c1ec4 100644 --- a/internal/http3/server.go +++ b/internal/http3/server.go @@ -7,6 +7,7 @@ package http3 import ( "context" "net/http" + "net/url" "strconv" "sync" @@ -156,8 +157,13 @@ func (sc *serverConn) handlePushStream(*stream) error { } } -func parseRequest(st *stream) (*http.Request, error) { - req := &http.Request{} +func (sc *serverConn) parseRequest(st *stream) (*http.Request, error) { + req := &http.Request{ + URL: &url.URL{}, + Proto: "HTTP/3.0", + ProtoMajor: 3, + RemoteAddr: sc.qconn.RemoteAddr().String(), + } ftype, err := st.readFrameHeader() if err != nil { return nil, err @@ -195,7 +201,7 @@ func parseRequest(st *stream) (*http.Request, error) { } func (sc *serverConn) handleRequestStream(st *stream) error { - req, err := parseRequest(st) + req, err := sc.parseRequest(st) if err != nil { return err } diff --git a/internal/http3/server_test.go b/internal/http3/server_test.go index 3d29dba3..31fdda87 100644 --- a/internal/http3/server_test.go +++ b/internal/http3/server_test.go @@ -68,6 +68,7 @@ func TestServerHeader(t *testing.T) { ":status": {"204"}, "Header-From-Client": {"that", "should", "be", "echoed"}, }) + reqStream.wantClosed("request is complete") }) } @@ -92,6 +93,7 @@ func TestServerPseudoHeader(t *testing.T) { reqStream.writeHeaders(http.Header{":method": {"GET"}}) synctest.Wait() reqStream.wantHeaders(map[string][]string{":status": {"321"}}) + reqStream.wantClosed("request is complete") }) } @@ -116,6 +118,7 @@ func TestServerInvalidHeader(t *testing.T) { "Valid-Name": {"valid value"}, "Valid-Name-2": {"valid value 2"}, }) + reqStream.wantClosed("request is complete") }) } @@ -126,19 +129,24 @@ func TestServerBody(t *testing.T) { if err != nil { t.Fatal(err) } - w.Write(body) // Implicitly calls w.WriteHeader(200). + w.Write([]byte(r.URL.Path)) // Implicitly calls w.WriteHeader(200). + w.Write(body) })) tc := ts.connect() tc.greet() reqStream := tc.newStream(streamTypeRequest) - reqStream.writeHeaders(http.Header{}) + reqStream.writeHeaders(http.Header{ + ":path": {"/"}, + }) bodyContent := []byte("some body content that should be echoed") reqStream.writeData(bodyContent) reqStream.stream.stream.CloseWrite() synctest.Wait() reqStream.wantHeaders(http.Header{":status": {"200"}}) + reqStream.wantData([]byte("/")) reqStream.wantData(bodyContent) + reqStream.wantClosed("request is complete") }) }