glanceapp/glance · error · errNoContent

%w: could not read body: %w

Error message

%w: could not read body: %w

What it means

The extension response body could not be read with io.ReadAll after the request succeeded. This means the connection broke mid-transfer (unexpected EOF, reset) or the server sent a malformed chunked encoding. Wrapped with errNoContent so the widget shows an empty result.

Source

Thrown at internal/glance/widget-extension.go:140

		request.URL.RawQuery = options.Parameters.toQueryString()
	}

	for key, value := range options.Headers {
		request.Header.Add(key, value)
	}

	response, err := http.DefaultClient.Do(request)
	if err != nil {
		slog.Error("Failed fetching extension", "url", options.URL, "error", err)
		return extension{}, fmt.Errorf("%w: request failed: %w", errNoContent, err)
	}

	defer response.Body.Close()

	body, err := io.ReadAll(response.Body)
	if err != nil {
		slog.Error("Failed reading response body of extension", "url", options.URL, "error", err)
		return extension{}, fmt.Errorf("%w: could not read body: %w", errNoContent, err)
	}

	extension := extension{}

	if response.Header.Get(extensionHeaderTitle) == "" {
		extension.Title = "Extension"
	} else {
		extension.Title = response.Header.Get(extensionHeaderTitle)
	}

	if response.Header.Get(extensionHeaderTitleURL) != "" {
		extension.TitleURL = response.Header.Get(extensionHeaderTitleURL)
	}

	contentType, ok := extensionStringToType[response.Header.Get(extensionHeaderContentType)]

	if !ok {
		contentType, ok = extensionStringToType[options.FallbackContentType]

View on GitHub (pinned to 91324e8de7)

Solutions

  1. Check the extension server logs for crashes or body-size limits (nginx client_max_body_size is not it here — look at proxy buffer/timeout settings)
  2. Retry the fetch — transient truncation often resolves itself
  3. Reduce extension response size (fewer items) to rule out intermediary limits
Defensive patterns

Strategy: retry

Try / catch

body, err := io.ReadAll(response.Body)
if err != nil {
    if errors.Is(err, io.ErrUnexpectedEOF) {
        // truncated transfer: retry once before giving up
        response, body, err = refetchWithRetry(options.URL, 1)
    }
    if err != nil { return extension{}, fmt.Errorf("%w: could not read body: %w", errNoContent, err) }
}

Prevention

When it happens

Trigger: Server closes the connection before Content-Length bytes are sent; proxy truncates the response; network reset during a large extension payload.

Common situations: Extension endpoint behind a proxy with a smaller body limit than the response; server crash mid-response; mobile/flaky networks to self-hosted extensions.

Related errors


AI-assisted analysis of glanceapp/glance@91324e8de7 (2026-08-15). Data as JSON: /api/errors/3c8879980cc6456a. Report an issue: GitHub.