@@ -3,6 +3,7 @@ package httpsign
33import (
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-
1817var 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
2430func 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
3945var 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