Skip to content

Commit 9b80776

Browse files
committed
Test HTTP/1.1 and TLS+HTTP/2.0
1 parent 01e42c1 commit 9b80776

File tree

1 file changed

+64
-15
lines changed

1 file changed

+64
-15
lines changed

http2_test.go

Lines changed: 64 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package httpsign
33
import (
44
"bufio"
55
"bytes"
6+
"crypto/tls"
67
"github.com/andreyvit/diff"
78
"io"
89
"net/http"
@@ -13,13 +14,18 @@ import (
1314
"text/template"
1415
)
1516

16-
var httpreq5 = ``
17-
1817
var wantFields = `"kuku": my awesome header
1918
"@query": ?k1=v1&k2
2019
"@method": GET
21-
"@target-uri": http://127.0.0.1:{{.Port}}/?k1=v1&k2
22-
"@signature-params": ("kuku" "@query" "@method" "@target-uri");alg="hmac-sha256";keyid="key1"`
20+
"@target-uri": {{.Scheme}}://127.0.0.1:{{.Port}}/path?k1=v1&k2
21+
"@authority": 127.0.0.1:{{.Port}}
22+
"@scheme": {{.Scheme}}
23+
"@target-uri": {{.Scheme}}://127.0.0.1:{{.Port}}/path?k1=v1&k2
24+
"@path": /path
25+
"@query": ?k1=v1&k2
26+
"@query-params";name="k1": v1
27+
"@query-params";name="k2":
28+
"@signature-params": ("kuku" "@query" "@method" "@target-uri" "@authority" "@scheme" "@target-uri" "@path" "@query" "@query-params";name="k1" "@query-params";name="k2");alg="hmac-sha256";keyid="key1"`
2329

2430
func execTemplate(t template.Template, name string, data interface{}) (string, error) {
2531
buf := &bytes.Buffer{}
@@ -38,11 +44,17 @@ func newClientRequest(t *testing.T, method, url, body string) *http.Request {
3844

3945
var ts *httptest.Server // global, so can be used *inside* the server, too
4046

41-
func TestHTTP11(t *testing.T) {
47+
func testHTTP(t *testing.T, proto string) {
4248
simpleHandler := func(w http.ResponseWriter, r *http.Request) {
43-
proto := r.Proto
44-
if proto != "HTTP/1.1" {
45-
t.Errorf("expected HTTP/1.1, got %s", proto)
49+
reqProto := r.Proto
50+
if reqProto != proto {
51+
t.Errorf("expected %s, got %s", proto, reqProto)
52+
}
53+
var scheme string
54+
if ts.TLS == nil {
55+
scheme = "http"
56+
} else {
57+
scheme = "https"
4658
}
4759
sp := bytes.Split([]byte(ts.URL), []byte(":"))
4860
portval, err := strconv.Atoi(string(sp[2]))
@@ -53,8 +65,11 @@ func TestHTTP11(t *testing.T) {
5365
if err != nil {
5466
t.Errorf("could not parse template")
5567
}
56-
type inputs struct{ Port int }
57-
wf, err := execTemplate(*tpl, "fields", inputs{Port: portval})
68+
type inputs struct {
69+
Port int
70+
Scheme string
71+
}
72+
wf, err := execTemplate(*tpl, "fields", inputs{Port: portval, Scheme: scheme})
5873
verifier, err := NewHMACSHA256Verifier("key1", bytes.Repeat([]byte{0x03}, 64),
5974
NewVerifyConfig().SetVerifyCreated(false),
6075
Headers("@query"))
@@ -69,17 +84,43 @@ func TestHTTP11(t *testing.T) {
6984
if sigInput != wf {
7085
// t.Errorf("expected: %s\ngot: %s\n", wantFields, sigInput)
7186
t.Errorf("unexpected fields: %s\n", diff.CharacterDiff(sigInput, wantFields))
72-
} // TODO: copy Host from request/response to URL if empty in URL
87+
}
7388
w.WriteHeader(200)
7489
}
75-
ts = httptest.NewServer(http.HandlerFunc(simpleHandler))
90+
91+
// Client code
92+
switch proto {
93+
case "HTTP/1.1":
94+
ts = httptest.NewServer(http.HandlerFunc(simpleHandler))
95+
case "HTTP/2.0":
96+
ts = httptest.NewUnstartedServer(http.HandlerFunc(simpleHandler))
97+
ts.EnableHTTP2 = true
98+
ts.StartTLS()
99+
default:
100+
t.Errorf("no server")
101+
}
76102
defer ts.Close()
77103

104+
tr := &http.Transport{
105+
TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, // Do not verify server certificate
106+
ForceAttemptHTTP2: true,
107+
}
108+
78109
signer, err := NewHMACSHA256Signer("key1", bytes.Repeat([]byte{0x03}, 64),
79110
NewSignConfig().SignCreated(false),
80-
Headers("kuku", "@query", "@method", "@target-uri"))
81-
client := NewDefaultClient("sig1", signer, nil, nil)
82-
req := newClientRequest(t, "GET", ts.URL+"/"+"?k1=v1&k2", httpreq5)
111+
*NewFields().AddHeaders("kuku", "@query", "@method", "@target-uri", "@authority", "@scheme", "@target-uri",
112+
"@path", "@query").AddQueryParam("k1").AddQueryParam("k2"))
113+
var client *Client
114+
switch proto {
115+
case "HTTP/1.1":
116+
client = NewDefaultClient("sig1", signer, nil, nil)
117+
case "HTTP/2.0":
118+
c := &http.Client{Transport: tr}
119+
client = NewClient("sig1", signer, nil, nil, *c)
120+
default:
121+
t.Errorf("no client for you")
122+
}
123+
req := newClientRequest(t, "GET", ts.URL+"/path"+"?k1=v1&k2", "")
83124
req.Header.Set("Kuku", "my awesome header")
84125
res, err := client.Do(req)
85126
if err != nil {
@@ -97,3 +138,11 @@ func TestHTTP11(t *testing.T) {
97138
}
98139
}
99140
}
141+
142+
func TestHTTP11(t *testing.T) {
143+
testHTTP(t, "HTTP/1.1")
144+
}
145+
146+
func TestHTTP20(t *testing.T) {
147+
testHTTP(t, "HTTP/2.0")
148+
}

0 commit comments

Comments
 (0)