| 343 | ) |
| 344 | |
| 345 | func getAuthAccess(res *http.Response, access creds.AccessMode, modes []creds.AccessMode, multistage bool) (creds.AccessMode, []creds.AccessMode, []string) { |
| 346 | newModes := make([]creds.AccessMode, 0, len(modes)) |
| 347 | for _, mode := range modes { |
| 348 | if multistage || access != mode { |
| 349 | newModes = append(newModes, mode) |
| 350 | } |
| 351 | } |
| 352 | headers := make([]string, 0) |
| 353 | if res != nil { |
| 354 | for _, headerName := range authenticateHeaders { |
| 355 | headers = append(headers, res.Header[headerName]...) |
| 356 | } |
| 357 | supportedModes := make(map[creds.AccessMode]struct{}) |
| 358 | for _, headerName := range authenticateHeaders { |
| 359 | for _, auth := range res.Header[headerName] { |
| 360 | pieces := strings.SplitN(strings.ToLower(auth), " ", 2) |
| 361 | if len(pieces) == 0 { |
| 362 | continue |
| 363 | } |
| 364 | |
| 365 | supportedModes[creds.AccessMode(pieces[0])] = struct{}{} |
| 366 | } |
| 367 | } |
| 368 | for _, mode := range newModes { |
| 369 | if _, ok := supportedModes[mode]; ok { |
| 370 | return mode, newModes, headers |
| 371 | } |
| 372 | } |
| 373 | } |
| 374 | |
| 375 | return creds.BasicAccess, newModes, headers |
| 376 | } |