{"record":{"id":"e5d8ce4cbbf17722","repo":"MHSanaei/3x-ui","slug":"vmess-decode-w","errorCode":null,"errorMessage":"vmess decode: %w","messagePattern":"vmess decode: %w","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"internal/util/link/outbound.go","lineNumber":142,"sourceCode":"\tcase strings.HasPrefix(link, \"wireguard://\"), strings.HasPrefix(link, \"wg://\"):\n\t\treturn parseWireguard(link)\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unsupported link scheme\")\n\t}\n}\n\n// --- vmess ---\n\nfunc parseVmess(link string) (*ParseResult, error) {\n\tb64 := strings.TrimPrefix(link, \"vmess://\")\n\t// vmess:// base64(json)\n\traw, err := base64.StdEncoding.DecodeString(padBase64(b64))\n\tif err != nil {\n\t\t// Some providers use raw URL-safe\n\t\traw, err = base64.RawURLEncoding.DecodeString(b64)\n\t}\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"vmess decode: %w\", err)\n\t}\n\tvar j map[string]any\n\tif err := json.Unmarshal(raw, &j); err != nil {\n\t\treturn nil, fmt.Errorf(\"vmess json: %w\", err)\n\t}\n\n\tidentity := vmessIdentity(j)\n\n\tnetwork := getString(j, \"net\", \"tcp\")\n\tsecurity := \"none\"\n\tif tls, _ := j[\"tls\"].(string); tls == \"tls\" {\n\t\tsecurity = \"tls\"\n\t}\n\tstream := buildStream(network, security)\n\n\t// Map known fields (best effort, matching frontend parser coverage)\n\tswitch network {\n\tcase \"ws\":","sourceCodeStart":124,"sourceCodeEnd":160,"githubUrl":"https://github.com/MHSanaei/3x-ui/blob/ad32144c42455696ea9f14e12168beac3e25f5d2/internal/util/link/outbound.go#L124-L160","documentation":"Returned by parseVmess when the base64 payload after vmess:// decodes with neither padded StdEncoding nor RawURLEncoding. VMess share links carry base64(JSON); providers emit at least three variants (padded, unpadded, URL-safe), and this parser tries both before giving up. Everything before the JSON stage, so no protocol state is involved.","triggerScenarios":"A vmess:// link whose payload is plain JSON (not base64); payload corrupted by URL-transport (spaces, +→%2B mishandling); missing padding combined with -/_ mixed into a single string; copy-paste truncation cutting the payload mid-base64.","commonSituations":"Links copied out of messengers/webpages where the base64 got percent-decoded or truncated; providers emitting base64 with newlines; homegrown generators that forget padding AND use URL-safe alphabet while the parser only tolerates one deviation at a time.","solutions":["Re-copy the full link from the source client and check it was not truncated (vmess payloads are long).","Validate the payload yourself: strip 'vmess://', then try base64.RawURLEncoding and base64.StdEncoding with padding restored — if both fail, the payload is not base64 at all.","If the payload is raw JSON, re-encode it to base64 or parse the JSON directly.","Regenerate the link from the originating client rather than hand-repairing it."],"exampleFix":"// before\nraw, err := base64.StdEncoding.DecodeString(b64)\n\n// after: tolerate all three common vmess encodings\ns := strings.Map(func(r rune) rune {\n    if r == '\\n' || r == '\\r' || r == ' ' { return -1 }\n    return r\n}, b64)\nraw, err := base64.StdEncoding.DecodeString(padBase64(s))\nif err != nil {\n    raw, err = base64.RawURLEncoding.DecodeString(s)\n}","handlingStrategy":"validation","validationCode":"func isBase64ishPayload(link string) bool {\n    s := strings.TrimPrefix(link, \"vmess://\")\n    s = strings.Map(func(r rune) rune {\n        if r == '\\n' || r == '\\r' || r == ' ' { return -1 }\n        return r\n    }, s)\n    _, err1 := base64.StdEncoding.DecodeString(padBase64(s))\n    _, err2 := base64.RawURLEncoding.DecodeString(s)\n    return err1 == nil || err2 == nil\n}","typeGuard":null,"tryCatchPattern":"if _, err := link.ParseOutbound(l); err != nil {\n    if strings.Contains(err.Error(), \"vmess decode\") {\n        // payload is not base64: log the link, skip it, request a fresh copy from the provider\n    }\n}","preventionTips":["Copy vmess links whole — they are long and truncate easily.","Strip whitespace/newlines from payloads before parsing.","Reject links whose payload is plain JSON (not base64)."],"tags":["parsing","proxy-links","vmess","base64"],"backgroundTag":null,"analyzedSha":"ad32144c42455696ea9f14e12168beac3e25f5d2","analyzedAt":"2026-08-15T11:13:23.905Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}