{"record":{"id":"6cf2deccb580ad60","repo":"apache/beam","slug":"xlangx-registerexpansionforurn-q-q-error-v","errorCode":null,"errorMessage":"xlangx.RegisterExpansionForUrn(%q,%q) error: %v","messagePattern":"xlangx\\.RegisterExpansionForUrn\\(%q,%q\\) error: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"sdks/go/pkg/beam/core/runtime/xlangx/registry.go","lineNumber":199,"sourceCode":"\nfunc validateNamespace(namespace string) error {\n\tif strings.Contains(namespace, Separator) {\n\t\treturn fmt.Errorf(\"invalid namespace, provide a different one: %q contains the separator %q\", namespace, Separator)\n\t}\n\tif _, ok := restricted[namespace]; ok {\n\t\treturn fmt.Errorf(\"invalide namespace, provide a different one: %q is a restricted namespace\", namespace)\n\t}\n\treturn nil\n}\n\n// RegisterOverrideForUrn instructs using expansionAddr for CrossLanguage\n// transforms with urn. expansionAddr should either be registered with an\n// Expansion handler, or an Expansion service address.\nfunc (r *registry) RegisterOverrideForUrn(urn, expansionAddr string) error {\n\tr.mu.Lock()\n\tdefer r.mu.Unlock()\n\tif err := r.validateAddr(expansionAddr); err != nil {\n\t\treturn fmt.Errorf(\"xlangx.RegisterExpansionForUrn(%q,%q) error: %v\", urn, expansionAddr, err)\n\t}\n\tr.urnOverrides[urn] = expansionAddr\n\treturn nil\n}\n\nfunc (r *registry) validateAddr(expansionAddr string) error {\n\tu, err := url.Parse(expansionAddr)\n\tif err == nil && u.Scheme != \"\" && u.Host != \"\" {\n\t\t// This is likely a URL, so allow it.\n\t\treturn nil\n\t}\n\t// Otherwise, let's check that we have a handler registered.\n\tns, _ := parseAddr(expansionAddr)\n\tif _, ok := r.handlers[ns]; !ok {\n\t\treturn fmt.Errorf(\"expansionAddr %q trying to use unregistered namespace: %q\", expansionAddr, ns)\n\t}\n\treturn nil\n}","sourceCodeStart":181,"sourceCodeEnd":217,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/go/pkg/beam/core/runtime/xlangx/registry.go#L181-L217","documentation":"registry.RegisterOverrideForUrn maps a transform URN to a fixed expansion address. The address must pass validateAddr (it must look like a registered handler namespace or a host:port service address); otherwise it is wrapped as \"xlangx.RegisterExpansionForUrn(%q,%q) error\". This guards against URN overrides pointing at addresses the resolver can never use.","triggerScenarios":"Calling xlangx.RegisterOverrideForUrn(urn, addr) where addr is neither a valid handler namespace nor a valid host:port expansion service address (e.g. empty, malformed URL, missing port, unknown scheme).","commonSituations":"Config-file expansion addresses missing the port; passing \"localhost\" without a port; typos in the address; using a namespace that was never registered with RegisterHandler.","solutions":["Pass a valid host:port, e.g. \"localhost:8097\", matching the running expansion service.","Ensure any namespace used as the address is registered via RegisterHandler first.","Print/inspect the wrapped err to see which validateAddr rule failed.","Validate the address format in config loading before calling RegisterOverrideForUrn."],"exampleFix":"// before\nerr := xlangx.RegisterOverrideForUrn(urn, \"localhost\")\n// after\nerr := xlangx.RegisterOverrideForUrn(urn, \"localhost:8097\")","handlingStrategy":"validation","validationCode":"if _, _, err := net.SplitHostPort(expansionAddr); err != nil {\n    return fmt.Errorf(\"expansion address %q must be host:port\", expansionAddr)\n}","typeGuard":null,"tryCatchPattern":"if err := xlangx.RegisterOverrideForUrn(urn, addr); err != nil {\n    return fmt.Errorf(\"configuring expansion override for %s -> %s: %w\", urn, addr, err)\n}","preventionTips":["Always include a port in expansion service addresses","Confirm handler namespaces used as addresses are registered first","Validate expansion address config at load time"],"tags":["go","validation","address","xlang"],"backgroundTag":"invalid-url-format","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-20T03:17:13.778Z"}