glanceapp/glance · error

creating authentication request

Error message

creating authentication request: %v

What it means

Returned by fetchPiholeSessionID when http.NewRequest("POST", instanceURL+"/api/auth", ...) fails before any network I/O. NewRequest fails only on an unparseable URL: unsupported scheme, control characters in the URL, or a malformed host — so this almost always means the configured URL string itself is broken.

Solutions

  1. Inspect the widget's url value for typos, missing scheme, spaces, or bad interpolation.
  2. Always include the scheme: http://pihole.local or https://...
  3. Quote the URL in YAML if it contains special characters.
  4. Test with url.Parse in Go or simply curl the same string.

Example fix

# before
url: pihole.local:80

# after
url: http://pihole.local:80
Defensive patterns

Strategy: validation

Validate before calling

u, err := url.Parse(widget.URL)
if err != nil || (u.Scheme != "http" && u.Scheme != "https") || u.Host == "" {
    return fmt.Errorf("dns-stats: url must be a valid http(s) URL, got %q", widget.URL)
}

Prevention

When it happens

Trigger: url containing spaces or control characters, a scheme like ftp:// or missing entirely (no http://), or a password/URL concatenation producing invalid characters in the request line.

Common situations: YAML value with a trailing space or unquoted special characters; copy-pasted URL missing the scheme; environment-variable-substituted URL that rendered empty or malformed.

Understand the failure class

Related errors


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

Appendix: source

Thrown at internal/glance/widget-dns-stats.go:623

				PercentBlocked: int(float64(d.Count) / float64(statsResponse.Queries.Blocked) * 100),
			})
		}

		sort.Slice(domains, func(a, b int) bool {
			return domains[a].PercentBlocked > domains[b].PercentBlocked
		})
		stats.TopBlockedDomains = domains[:min(len(domains), 5)]
	}

	return stats, sessionID, ternary(partialContent, errPartialContent, nil)
}

func fetchPiholeSessionID(instanceURL string, client *http.Client, password string) (string, error) {
	requestBody := []byte(`{"password":"` + password + `"}`)

	request, err := http.NewRequest("POST", instanceURL+"/api/auth", bytes.NewBuffer(requestBody))
	if err != nil {
		return "", fmt.Errorf("creating authentication request: %v", err)
	}
	request.Header.Set("Content-Type", "application/json")

	response, err := client.Do(request)
	if err != nil {
		return "", fmt.Errorf("sending authentication request: %v", err)
	}
	defer response.Body.Close()

	body, err := io.ReadAll(response.Body)
	if err != nil {
		return "", fmt.Errorf("reading authentication response: %v", err)
	}

	var jsonResponse struct {
		Session struct {
			SID     string `json:"sid"`
			Message string `json:"message"`

View on GitHub (pinned to 91324e8de7)