forked from quic-go/quic-go
implement a basic request writer
This commit is contained in:
87
h2quic/request_writer_test.go
Normal file
87
h2quic/request_writer_test.go
Normal file
@@ -0,0 +1,87 @@
|
||||
package h2quic
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"golang.org/x/net/http2"
|
||||
"golang.org/x/net/http2/hpack"
|
||||
|
||||
. "github.com/onsi/ginkgo"
|
||||
. "github.com/onsi/gomega"
|
||||
)
|
||||
|
||||
var _ = Describe("Request", func() {
|
||||
var (
|
||||
rw *requestWriter
|
||||
headerStream *mockStream
|
||||
decoder *hpack.Decoder
|
||||
)
|
||||
|
||||
BeforeEach(func() {
|
||||
headerStream = &mockStream{}
|
||||
rw = newRequestWriter(headerStream)
|
||||
decoder = hpack.NewDecoder(4096, func(hf hpack.HeaderField) {})
|
||||
})
|
||||
|
||||
decode := func(p []byte) (*http2.HeadersFrame, map[string] /* HeaderField.Name */ string /* HeaderField.Value */) {
|
||||
framer := http2.NewFramer(nil, bytes.NewReader(p))
|
||||
frame, err := framer.ReadFrame()
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
headerFrame := frame.(*http2.HeadersFrame)
|
||||
fields, err := decoder.DecodeFull(headerFrame.HeaderBlockFragment())
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
values := make(map[string]string)
|
||||
for _, headerField := range fields {
|
||||
values[headerField.Name] = headerField.Value
|
||||
}
|
||||
return headerFrame, values
|
||||
}
|
||||
|
||||
It("writes a GET request", func() {
|
||||
req, err := http.NewRequest("GET", "https://quic.clemente.io/index.html?foo=bar", nil)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
rw.WriteRequest(req, 1337)
|
||||
headerFrame, headerFields := decode(headerStream.Bytes())
|
||||
Expect(headerFrame.StreamID).To(Equal(uint32(1337)))
|
||||
Expect(headerFields).To(HaveKeyWithValue(":authority", "quic.clemente.io"))
|
||||
Expect(headerFields).To(HaveKeyWithValue(":method", "GET"))
|
||||
Expect(headerFields).To(HaveKeyWithValue(":path", "/index.html?foo=bar"))
|
||||
Expect(headerFields).To(HaveKeyWithValue(":scheme", "https"))
|
||||
})
|
||||
|
||||
It("writes a POST request", func() {
|
||||
form := url.Values{}
|
||||
form.Add("foo", "bar")
|
||||
req, err := http.NewRequest("POST", "https://quic.clemente.io/upload.html", strings.NewReader(form.Encode()))
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
rw.WriteRequest(req, 5)
|
||||
_, headerFields := decode(headerStream.Bytes())
|
||||
Expect(headerFields).To(HaveKeyWithValue(":method", "POST"))
|
||||
Expect(headerFields).To(HaveKey("content-length"))
|
||||
contentLength, err := strconv.Atoi(headerFields["content-length"])
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(contentLength).To(BeNumerically(">", 0))
|
||||
})
|
||||
|
||||
It("sends cookies", func() {
|
||||
req, err := http.NewRequest("GET", "https://quic.clemente.io/", nil)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
cookie1 := &http.Cookie{
|
||||
Name: "Cookie #1",
|
||||
Value: "Value #1",
|
||||
}
|
||||
cookie2 := &http.Cookie{
|
||||
Name: "Cookie #2",
|
||||
Value: "Value #2",
|
||||
}
|
||||
req.AddCookie(cookie1)
|
||||
req.AddCookie(cookie2)
|
||||
rw.WriteRequest(req, 11)
|
||||
_, headerFields := decode(headerStream.Bytes())
|
||||
Expect(headerFields).To(HaveKeyWithValue("cookie", "Cookie #1=Value #1; Cookie #2=Value #2"))
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user