mirror of
https://github.com/minio/minio.git
synced 2025-01-12 07:23:23 -05:00
sigv4: Trim and shrink spaces in headers values (#3162)
This commit is contained in:
parent
4503491a0a
commit
d9bab6b3bd
@ -157,3 +157,19 @@ func extractSignedHeaders(signedHeaders []string, reqHeaders http.Header) (http.
|
|||||||
|
|
||||||
return extractedSignedHeaders, ErrNone
|
return extractedSignedHeaders, ErrNone
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Trim leading and trailing spaces and replace sequential spaces with one space, following Trimall()
|
||||||
|
// in http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html
|
||||||
|
func signV4TrimAll(input string) string {
|
||||||
|
// Remove all whitespaces first
|
||||||
|
cleanWhiteSpaces := func(r rune) rune {
|
||||||
|
switch r {
|
||||||
|
case '\t', '\n', '\u000b', '\r', '\f':
|
||||||
|
return ' '
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
input = strings.Map(cleanWhiteSpaces, input)
|
||||||
|
// Compress adjacent spaces to one space and return
|
||||||
|
return strings.Join(strings.Fields(input), " ")
|
||||||
|
}
|
||||||
|
@ -211,3 +211,31 @@ func TestFindHost(t *testing.T) {
|
|||||||
t.Fatalf("Expected the APIErrorCode to be %d, but got %d", ErrNone, errCode)
|
t.Fatalf("Expected the APIErrorCode to be %d, but got %d", ErrNone, errCode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestSigV4TrimAll - tests the logic of TrimAll() function
|
||||||
|
func TestSigV4TrimAll(t *testing.T) {
|
||||||
|
testCases := []struct {
|
||||||
|
// Input.
|
||||||
|
inputStr string
|
||||||
|
// Expected result.
|
||||||
|
result string
|
||||||
|
}{
|
||||||
|
{"本語", "本語"},
|
||||||
|
{" abc ", "abc"},
|
||||||
|
{" a b ", "a b"},
|
||||||
|
{"a b ", "a b"},
|
||||||
|
{"a b", "a b"},
|
||||||
|
{"a b", "a b"},
|
||||||
|
{" a b c ", "a b c"},
|
||||||
|
{"a \t b c ", "a b c"},
|
||||||
|
{"\"a \t b c ", "\"a b c"},
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tests generated values from url encoded name.
|
||||||
|
for i, testCase := range testCases {
|
||||||
|
result := signV4TrimAll(testCase.inputStr)
|
||||||
|
if testCase.result != result {
|
||||||
|
t.Errorf("Test %d: Expected sigV4TrimAll result to be \"%s\", but found it to be \"%s\" instead", i+1, testCase.result, result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -68,7 +68,7 @@ func getCanonicalHeaders(signedHeaders http.Header, host string) string {
|
|||||||
if idx > 0 {
|
if idx > 0 {
|
||||||
buf.WriteByte(',')
|
buf.WriteByte(',')
|
||||||
}
|
}
|
||||||
buf.WriteString(v)
|
buf.WriteString(signV4TrimAll(v))
|
||||||
}
|
}
|
||||||
buf.WriteByte('\n')
|
buf.WriteByte('\n')
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user