grpc-ecosystem/grpc-gateway · error

no field path

Error message

no field path

What it means

Returned by populateFieldValueFromPath (reached via runtime.PopulateFieldFromPath / Parse) when the fieldPath slice is empty, i.e. there is no field name to populate on the message. It guards against calling the field-population logic with nothing to do.

Source

Thrown at runtime/query.go:107

		if i == len(fieldPath)-1 {
			break
		}

		// Only singular message fields are allowed
		if fieldDesc.Message() == nil || fieldDesc.Cardinality() == protoreflect.Repeated {
			return fieldPath
		}

		// Get the nested message
		msgValue = msgValue.Get(fieldDesc).Message()
	}

	return newFieldPath
}

func populateFieldValueFromPath(msgValue protoreflect.Message, fieldPath []string, values []string) error {
	if len(fieldPath) < 1 {
		return errors.New("no field path")
	}
	if len(values) < 1 {
		return errors.New("no value provided")
	}

	var fieldDescriptor protoreflect.FieldDescriptor
	for i, fieldName := range fieldPath {
		fields := msgValue.Descriptor().Fields()

		// Get field by name
		fieldDescriptor = fields.ByName(protoreflect.Name(fieldName))
		if fieldDescriptor == nil {
			fieldDescriptor = fields.ByJSONName(fieldName)
			if fieldDescriptor == nil {
				// We're not returning an error here because this could just be
				// an extra query parameter that isn't part of the request.
				grpclog.Infof("field not found in %q: %q", msgValue.Descriptor().FullName(), strings.Join(fieldPath, "."))
				return nil

View on GitHub (pinned to a58a4436a3)

Solutions

  1. Ensure the field path string passed to PopulateFieldFromPath is non-empty and well-formed (dot-separated, e.g. "user.id")
  2. Guard the call site: skip population when the path is empty instead of forwarding it
  3. Fix the config/template that produced a blank field name

Example fix

// before
if err := runtime.PopulateFieldFromPath(msg, urlPath, fieldPath); err != nil {...}
// after
if fieldPath != "" {
    if err := runtime.PopulateFieldFromPath(msg, urlPath, fieldPath); err != nil {...}
}
Defensive patterns

Strategy: validation

Validate before calling

if fieldPath == "" {
    return nil // skip: nothing to populate
}
for _, part := range strings.Split(fieldPath, ".") {
    if part == "" {
        return fmt.Errorf("invalid field path %q", fieldPath)
    }
}

Type guard

func isValidFieldPath(p string) bool {
    return p != "" && !strings.HasPrefix(p, ".") && !strings.HasSuffix(p, ".") && !strings.Contains(p, "..")
}

Try / catch

if err := runtime.PopulateFieldFromPath(msg, urlPath, fieldPath); err != nil {
    return fmt.Errorf("populate %q: %w", fieldPath, err)
}

Prevention

When it happens

Trigger: Calling runtime.PopulateFieldFromPath(msg, urlPath, "") with an empty field path string, or Parse/query parsing producing a zero-length fieldPath before populateFieldValueFromPath is invoked.

Common situations: Custom query-parameter or HTTP-body mapping code splitting an empty path string; config-driven field mappings where a field name key is missing/blank; template variables that resolve to empty strings.

Related errors


AI-assisted analysis of grpc-ecosystem/grpc-gateway@a58a4436a3 (2026-09-02). Data as JSON: /api/errors/b4b23c12661627de. Report an issue: GitHub.