cloudflare/cloudflared · error

expected string found %T for %s

Error message

expected string found %T for %s

What it means

Type-mismatch error in configFileSettings.String: the named config-file setting exists but is not a string in the parsed YAML (e.g. an int or bool). The typed accessor returns the zero string plus this error rather than coercing the value.

Source

Thrown at config/configuration.go:317

	return 0, nil
}

func (c *configFileSettings) Float64(name string) (float64, error) {
	if raw, ok := c.Settings[name]; ok {
		if v, ok := raw.(float64); ok {
			return v, nil
		}
		return 0, fmt.Errorf("expected float found %T for %s", raw, name)
	}
	return 0, nil
}

func (c *configFileSettings) String(name string) (string, error) {
	if raw, ok := c.Settings[name]; ok {
		if v, ok := raw.(string); ok {
			return v, nil
		}
		return "", fmt.Errorf("expected string found %T for %s", raw, name)
	}
	return "", nil
}

func (c *configFileSettings) StringSlice(name string) ([]string, error) {
	if raw, ok := c.Settings[name]; ok {
		if slice, ok := raw.([]interface{}); ok {
			strSlice := make([]string, len(slice))
			for i, v := range slice {
				str, ok := v.(string)
				if !ok {
					return nil, fmt.Errorf("expected string, found %T for %v", i, v)
				}
				strSlice[i] = str
			}
			return strSlice, nil
		}
		return nil, fmt.Errorf("expected string slice found %T for %s", raw, name)

View on GitHub (pinned to 2253eeeb25)

Solutions

  1. Quote the value in the config file so it parses as a string (hostname: "example.com").
  2. Fix the key name if the wrong setting is being requested.
  3. At the call site, use the typed getter matching the actual type shown in %T and convert explicitly.

Example fix

// before (config.yml)
protocol: 2
// after
protocol: "h2mux"
Defensive patterns

Strategy: validation

Validate before calling

// Go
typeAssertString := func(v interface{}) (string, bool) { s, ok := v.(string); return s, ok }

Type guard

func asString(v interface{}) (string, bool) { s, ok := v.(string); return s, ok }

Try / catch

s, err := settings.String("hostname")
if err != nil {
    log.Printf("'hostname' must be a quoted string: %v", err)
    return err
}

Prevention

When it happens

Trigger: Calling String(name) on a setting stored as an int, bool, or slice — e.g. `hostname: 8080` or a boolean flag read as a string.

Common situations: YAML unquoted values that look numeric or boolean (port: 8080, enabled: true) but are consumed as strings; keys confused between sections of the config.

Related errors


AI-assisted analysis of cloudflare/cloudflared@2253eeeb25 (2026-09-06). Data as JSON: /api/errors/63e2fdabc7c2feac. Report an issue: GitHub.