siyuan-note/siyuan · error

get checksum manifest failed

Error message

get checksum manifest failed: %d

What it means

The checksum manifest download completed but GitHub responded with a non-200 status code. The function formats the status into this error and aborts, since only HTTP 200 yields a trustworthy manifest body. No manifest is cached on this path.

Solutions

  1. Check the printed status code: 403 usually means GitHub rate limiting — wait for the window to reset or set a token
  2. 404 means the manifest asset is gone — verify the release still lists SHA256SUMS.txt
  3. Retry later for 5xx/CDN errors
  4. Bypass misbehaving proxies for github.com if a corporate proxy is intercepting requests
Defensive patterns

Strategy: try-catch

Validate before calling

// pre-check the asset URL reachability
resp, err := http.Head(manifestURL)
if err == nil && resp.StatusCode != 200 {
    logging.LogWarnf("manifest URL head status %d; expect failure", resp.StatusCode)
}

Try / catch

checksum, err := getGitHubManifestChecksum(ctx, release, pkgName)
if err != nil {
    var statusErr *fmt.Errorf
    if errors.As(err, &statusErr) && strings.Contains(err.Error(), "get checksum manifest failed") {
        // inspect embedded status: 403 rate limit -> backoff; 404 -> release assets changed
        return err
    }
}

Prevention

When it happens

Trigger: GET of manifestAsset.BrowserDownloadURL returns 404 (asset removed), 403 (rate limit/blocked), 302 that terminates in an error page, or 5xx from GitHub/CDN during getGitHubUpdateRelease.

Common situations: Anonymous GitHub rate limiting (403 with rate-limit headers); the release was deleted or its assets removed after the API listing was cached; CDN outages; corporate proxies returning block pages.

Related errors


AI-assisted analysis of siyuan-note/siyuan@8641553a1f (2026-09-11). Data as JSON: /api/errors/98e21c6b60c02fff. Report an issue: GitHub.

Appendix: source

Thrown at kernel/model/updater_release.go:392

		cached, ok := githubManifestCache.Load(manifestCacheKey)
		if ok {
			if checksum := parseChecksumManifest(cached.(string), pkgName); "" != checksum {
				return checksum, nil
			}
			return "", errors.New("package checksum is unavailable")
		}
	}

	response, err := httpclient.NewCloudRequest30s().SetContext(ctx).Get(manifestAsset.BrowserDownloadURL)
	if err != nil {
		return "", err
	}
	if nil == response || nil == response.Response {
		return "", errors.New("checksum manifest response is empty")
	}
	defer response.Body.Close()
	if 200 != response.StatusCode {
		return "", fmt.Errorf("get checksum manifest failed: %d", response.StatusCode)
	}
	data, err := io.ReadAll(io.LimitReader(response.Body, maxChecksumManifestSize+1))
	if err != nil {
		return "", err
	}
	if maxChecksumManifestSize < int64(len(data)) {
		return "", errors.New("checksum manifest is too large")
	}
	if "" != manifestDigest {
		actualDigest := fmt.Sprintf("%x", sha256.Sum256(data))
		if manifestDigest != actualDigest {
			return "", errors.New("checksum manifest digest mismatch")
		}
	}
	manifest := string(data)
	if "" != manifestCacheKey {
		githubManifestCache.Store(manifestCacheKey, manifest)
	}

View on GitHub (pinned to 8641553a1f)