Extract only necessary metadata header key/values by filtering them out with a list of custom header keys.
(header http.Header)
| 202 | // Extract only necessary metadata header key/values by |
| 203 | // filtering them out with a list of custom header keys. |
| 204 | func extractObjMetadata(header http.Header) http.Header { |
| 205 | preserveKeys := []string{ |
| 206 | "Content-Type", |
| 207 | "Cache-Control", |
| 208 | "Content-Encoding", |
| 209 | "Content-Language", |
| 210 | "Content-Disposition", |
| 211 | "X-Amz-Storage-Class", |
| 212 | "X-Amz-Object-Lock-Mode", |
| 213 | "X-Amz-Object-Lock-Retain-Until-Date", |
| 214 | "X-Amz-Object-Lock-Legal-Hold", |
| 215 | "X-Amz-Website-Redirect-Location", |
| 216 | "X-Amz-Server-Side-Encryption", |
| 217 | "X-Amz-Tagging-Count", |
| 218 | "X-Amz-Meta-", |
| 219 | "X-Minio-Meta-", |
| 220 | // Add new headers to be preserved. |
| 221 | // if you add new headers here, please extend |
| 222 | // PutObjectOptions{} to preserve them |
| 223 | // upon upload as well. |
| 224 | } |
| 225 | filteredHeader := make(http.Header) |
| 226 | for k, v := range header { |
| 227 | var found bool |
| 228 | for _, prefix := range preserveKeys { |
| 229 | if !strings.HasPrefix(k, prefix) { |
| 230 | continue |
| 231 | } |
| 232 | found = true |
| 233 | if prefix == "X-Amz-Meta-" || prefix == "X-Minio-Meta-" { |
| 234 | for index, val := range v { |
| 235 | if strings.HasPrefix(val, "=?") { |
| 236 | decoder := mime.WordDecoder{} |
| 237 | if decoded, err := decoder.DecodeHeader(val); err == nil { |
| 238 | v[index] = decoded |
| 239 | } |
| 240 | } |
| 241 | } |
| 242 | } |
| 243 | break |
| 244 | } |
| 245 | if found { |
| 246 | filteredHeader[k] = v |
| 247 | } |
| 248 | } |
| 249 | return filteredHeader |
| 250 | } |
| 251 | |
| 252 | const ( |
| 253 | // RFC 7231#section-7.1.1.1 timetamp format. e.g Tue, 29 Apr 2014 18:30:38 GMT |
no outgoing calls