| 11 | ) |
| 12 | |
| 13 | func TestBuildCanonicalHeaders(t *testing.T) { |
| 14 | t.Parallel() |
| 15 | |
| 16 | serviceName := "mockAPI" |
| 17 | region := "mock-region" |
| 18 | endpoint := "https://" + serviceName + "." + region + ".example.com" |
| 19 | |
| 20 | now := time.Now().UTC() |
| 21 | iSO8601Date := now.Format(timeFormat) |
| 22 | |
| 23 | req, err := http.NewRequestWithContext(context.Background(), http.MethodPost, endpoint, nil) |
| 24 | if err != nil { |
| 25 | t.Fatalf("failed to create request, %v", err) |
| 26 | } |
| 27 | |
| 28 | req.Header.Set("Host", req.Host) |
| 29 | req.Header.Set(amzDateKey, iSO8601Date) |
| 30 | req.Header.Set("InnerSpace", " inner space ") |
| 31 | req.Header.Set("LeadingSpace", " leading-space") |
| 32 | req.Header.Add("MultipleSpace", "no-space") |
| 33 | req.Header.Add("MultipleSpace", "\ttab-space") |
| 34 | req.Header.Add("MultipleSpace", "trailing-space ") |
| 35 | req.Header.Set("NoSpace", "no-space") |
| 36 | req.Header.Set("TabSpace", "\ttab-space\t") |
| 37 | req.Header.Set("TrailingSpace", "trailing-space ") |
| 38 | req.Header.Set("WrappedSpace", " wrapped-space ") |
| 39 | |
| 40 | wantSignedHeader := "host;innerspace;leadingspace;multiplespace;nospace;tabspace;trailingspace;wrappedspace;x-amz-date" |
| 41 | wantCanonicalHeader := strings.Join([]string{ |
| 42 | "host:mockAPI.mock-region.example.com", |
| 43 | "innerspace:inner space", |
| 44 | "leadingspace:leading-space", |
| 45 | "multiplespace:no-space,tab-space,trailing-space", |
| 46 | "nospace:no-space", |
| 47 | "tabspace:tab-space", |
| 48 | "trailingspace:trailing-space", |
| 49 | "wrappedspace:wrapped-space", |
| 50 | "x-amz-date:" + iSO8601Date, |
| 51 | "", |
| 52 | }, "\n") |
| 53 | |
| 54 | gotSignedHeaders, gotCanonicalHeader := buildCanonicalHeaders(req, nil) |
| 55 | assert.Equal(t, wantSignedHeader, gotSignedHeaders) |
| 56 | assert.Equal(t, wantCanonicalHeader, gotCanonicalHeader) |
| 57 | } |