func (s *Store) retrieveAssertion(bs asserts.Backstore, assertType *asserts.AssertionType, primaryKey []string) (asserts.Assertion, error) { a, err := bs.Get(assertType, primaryKey, assertType.MaxSupportedFormat()) if err == asserts.ErrNotFound && s.assertFallback { return s.fallback.Assertion(assertType, primaryKey, nil) } return a, err }
// Assertion retrivies the assertion for the given type and primary key. func (s *Store) Assertion(assertType *asserts.AssertionType, primaryKey []string, user *auth.UserState) (asserts.Assertion, error) { u, err := s.assertionsURI.Parse(path.Join(assertType.Name, path.Join(primaryKey...))) if err != nil { return nil, err } v := url.Values{} v.Set("max-format", strconv.Itoa(assertType.MaxSupportedFormat())) u.RawQuery = v.Encode() reqOptions := &requestOptions{ Method: "GET", URL: u, Accept: asserts.MediaType, } var asrt asserts.Assertion resp, err := s.retryRequest(context.TODO(), s.client, reqOptions, user, func(ok bool, resp *http.Response) error { var e error if ok { // decode assertion dec := asserts.NewDecoder(resp.Body) asrt, e = dec.Decode() } else { contentType := resp.Header.Get("Content-Type") if contentType == jsonContentType || contentType == "application/problem+json" { var svcErr assertionSvcError dec := json.NewDecoder(resp.Body) if e = dec.Decode(&svcErr); e != nil { return fmt.Errorf("cannot decode assertion service error with HTTP status code %d: %v", resp.StatusCode, e) } if svcErr.Status == 404 { return &AssertionNotFoundError{&asserts.Ref{Type: assertType, PrimaryKey: primaryKey}} } return fmt.Errorf("assertion service error: [%s] %q", svcErr.Title, svcErr.Detail) } } return e }) if err != nil { return nil, err } if resp.StatusCode != 200 { return nil, respToError(resp, "fetch assertion") } return asrt, err }