Skip to content

Commit

Permalink
fix parsing of request path for Extended CONNECT requests (quic-go#3388)
Browse files Browse the repository at this point in the history
  • Loading branch information
marten-seemann authored and sudarshan-reddy committed Aug 9, 2022
1 parent 0b3f194 commit 3d3e4e8
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 13 deletions.
29 changes: 18 additions & 11 deletions http3/request.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,14 @@ func requestFromHeaders(headers []qpack.HeaderField) (*http.Request, error) {
}

isConnect := method == http.MethodConnect
if isConnect {
// Extended CONNECT, see https://datatracker.ietf.org/doc/html/rfc8441#section-4
if protocol != "" {
if scheme == "" || path == "" || authority == "" {
return nil, errors.New("extended CONNECT: :scheme, :path and :authority must not be empty")
}
} else if path != "" || authority == "" { // normal CONNECT
// Extended CONNECT, see https://datatracker.ietf.org/doc/html/rfc8441#section-4
isExtendedConnected := isConnect && protocol != ""
if isExtendedConnected {
if scheme == "" || path == "" || authority == "" {
return nil, errors.New("extended CONNECT: :scheme, :path and :authority must not be empty")
}
} else if isConnect {
if path != "" || authority == "" { // normal CONNECT
return nil, errors.New(":path must be empty and :authority must not be empty")
}
} else if len(path) == 0 || len(authority) == 0 || len(method) == 0 {
Expand All @@ -60,11 +61,17 @@ func requestFromHeaders(headers []qpack.HeaderField) (*http.Request, error) {
var err error

if isConnect {
u = &url.URL{
Scheme: scheme,
Host: authority,
Path: path,
u = &url.URL{}
if isExtendedConnected {
u, err = url.ParseRequestURI(path)
if err != nil {
return nil, err
}
} else {
u.Path = path
}
u.Scheme = scheme
u.Host = authority
requestURI = authority
} else {
protocol = "HTTP/3"
Expand Down
5 changes: 3 additions & 2 deletions http3/request_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,13 +146,14 @@ var _ = Describe("Request", func() {
{Name: ":scheme", Value: "ftp"},
{Name: ":method", Value: http.MethodConnect},
{Name: ":authority", Value: "quic.clemente.io"},
{Name: ":path", Value: "/foo"},
{Name: ":path", Value: "/foo?val=1337"},
}
req, err := requestFromHeaders(headers)
Expect(err).NotTo(HaveOccurred())
Expect(req.Method).To(Equal(http.MethodConnect))
Expect(req.Proto).To(Equal("webtransport"))
Expect(req.URL.String()).To(Equal("ftp:https://quic.clemente.io/foo"))
Expect(req.URL.String()).To(Equal("ftp:https://quic.clemente.io/foo?val=1337"))
Expect(req.URL.Query().Get("val")).To(Equal("1337"))
})

It("errors with missing scheme", func() {
Expand Down

0 comments on commit 3d3e4e8

Please sign in to comment.