glanceapp/glance · error · errNoContent

%w: request failed: %w

Error message

%w: request failed: %w

What it means

The HTTP request to the extension URL failed at the transport level (DNS failure, connection refused, TLS error, timeout) and the error wraps errNoContent, so the widget renders an empty state. The URL and error are also logged via slog before returning.

Source

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

	default:
		return template.HTML("<pre>" + html.EscapeString(string(content)) + "</pre>")
	}
}

func fetchExtension(options extensionRequestOptions) (extension, error) {
	request, _ := http.NewRequest("GET", options.URL, nil)
	if len(options.Parameters) > 0 {
		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)
	}

View on GitHub (pinned to 91324e8de7)

Solutions

  1. curl the exact extension URL from the glance host to see the transport error
  2. Fix DNS/hosts entries or use an IP/FQDN that resolves from the glance container
  3. For self-signed certs, add the CA to the system trust store of the glance container
  4. If the server is slow, ensure it responds within the default client's timeout budget
Defensive patterns

Strategy: fallback

Try / catch

ext, err := fetchExtension(opts)
if err != nil {
    if errors.Is(err, errNoContent) {
        // render last cached HTML instead of an empty panel
        return widget.lastGoodExtension, nil
    }
    return extension{}, err
}

Prevention

When it happens

Trigger: http.DefaultClient.Do failing: unreachable host, DNS name not resolving, self-signed certificate rejected, server dropping the connection.

Common situations: Extension server down or moved; internal DNS not resolvable from where glance runs; self-signed TLS cert (Go rejects unless trusted); firewalled port; extension endpoint behind VPN that is off.

Related errors


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