getCanonicalHeaders generate a list of request headers for signature.
(req http.Request, ignoredHeaders map[string]bool)
| 110 | // getCanonicalHeaders generate a list of request headers for |
| 111 | // signature. |
| 112 | func getCanonicalHeaders(req http.Request, ignoredHeaders map[string]bool) string { |
| 113 | var headers []string |
| 114 | vals := make(map[string][]string) |
| 115 | for k, vv := range req.Header { |
| 116 | if _, ok := ignoredHeaders[http.CanonicalHeaderKey(k)]; ok { |
| 117 | continue // ignored header |
| 118 | } |
| 119 | headers = append(headers, strings.ToLower(k)) |
| 120 | vals[strings.ToLower(k)] = vv |
| 121 | } |
| 122 | if !headerExists("host", headers) { |
| 123 | headers = append(headers, "host") |
| 124 | } |
| 125 | sort.Strings(headers) |
| 126 | |
| 127 | var buf bytes.Buffer |
| 128 | // Save all the headers in canonical form <header>:<value> newline |
| 129 | // separated for each header. |
| 130 | for _, k := range headers { |
| 131 | buf.WriteString(k) |
| 132 | buf.WriteByte(':') |
| 133 | switch k { |
| 134 | case "host": |
| 135 | buf.WriteString(getHostAddr(&req)) |
| 136 | buf.WriteByte('\n') |
| 137 | default: |
| 138 | for idx, v := range vals[k] { |
| 139 | if idx > 0 { |
| 140 | buf.WriteByte(',') |
| 141 | } |
| 142 | buf.WriteString(signV4TrimAll(v)) |
| 143 | } |
| 144 | buf.WriteByte('\n') |
| 145 | } |
| 146 | } |
| 147 | return buf.String() |
| 148 | } |
| 149 | |
| 150 | func headerExists(key string, headers []string) bool { |
| 151 | for _, k := range headers { |