{"record":{"id":"5f37299fa8c87a8a","repo":"HKUDS/Vibe-Trading","slug":"invalid-base64-payload","errorCode":null,"errorMessage":"invalid base64 payload","messagePattern":"invalid base64 payload","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"agent/src/utils/media_decode.py","lineNumber":57,"sourceCode":"        The path of the decoded file.\n\n    Raises:\n        FileSizeExceeded: If decoded data exceeds ``max_bytes``.\n        ValueError: If the URL is malformed or uses an unsupported MIME type.\n    \"\"\"\n    match = _DATA_URL_RE.match(data_url)\n    if not match:\n        raise ValueError(\"expected data:<mime>;base64,<payload>\")\n    mime = match.group(1).strip().lower()\n    ext = _EXT_BY_MIME.get(mime)\n    if not ext:\n        raise ValueError(f\"unsupported data URL MIME type: {mime}\")\n\n    payload = match.group(3).strip()\n    try:\n        decoded = base64.b64decode(payload, validate=True)\n    except (binascii.Error, ValueError) as exc:\n        raise ValueError(\"invalid base64 payload\") from exc\n\n    if max_bytes and len(decoded) > max_bytes:\n        raise FileSizeExceeded(f\"decoded media exceeds {max_bytes} bytes\")\n\n    output_dir.mkdir(parents=True, exist_ok=True)\n    path = output_dir / f\"{uuid.uuid4().hex}{ext}\"\n    path.write_bytes(decoded)\n    return path\n","sourceCodeStart":39,"sourceCodeEnd":66,"githubUrl":"https://github.com/HKUDS/Vibe-Trading/blob/80ffdda44c5c4db0dd84d70e051cca591cea67df/agent/src/utils/media_decode.py#L39-L66","documentation":"save_base64_data_url decodes the payload with base64.b64decode(payload, validate=True), which rejects any non-alphabet characters. binascii.Error (or ValueError) from the decoder is re-raised as ValueError('invalid base64 payload'), preserving the original as __cause__.","triggerScenarios":"Payloads containing URL-safe characters ('-','_') instead of standard base64, missing '=' padding, embedded newlines/whitespace in the middle, corrupted transfer truncating the string, or '+' or '/' mangled to spaces by URL form encoding.","commonSituations":"Base64 passed through a query string unescaped ( '+' becomes ' '), URL-safe base64 from another library, JSON truncation of very large payloads, or copy-paste artifacts (smart quotes, ellipses).","solutions":["Validate/normalize the payload: strip whitespace, restore padding with '=' to a multiple of 4","If the source uses URL-safe alphabet, translate '-_' to '+/' before passing","Send base64 in the request body (not query params) so '+' survives transport","Check payload length % 4 == 0 before calling"],"exampleFix":"# before\npath = save_base64_data_url(data_url, out_dir)  # URL-safe base64 payload\n\n# after\nimport re\nheader, _, payload = data_url.partition(',')\npayload = payload.strip().replace('-', '+').replace('_', '/')\npayload += '=' * (-len(payload) % 4)\npath = save_base64_data_url(f\"{header},{payload}\", out_dir)","handlingStrategy":"validation","validationCode":"import base64\n\ndef is_valid_base64_payload(data_url: str) -> bool:\n    payload = data_url.split(\",\", 1)[1].strip() if \",\" in data_url else \"\"\n    if not payload or len(payload) % 4 != 0:\n        return False\n    try:\n        base64.b64decode(payload, validate=True)\n        return True\n    except Exception:\n        return False","typeGuard":"def is_standard_base64(payload: str) -> bool:\n    import re\n    p = payload.strip()\n    return bool(re.fullmatch(r\"[A-Za-z0-9+/]+={0,2}\", p)) and len(p) % 4 == 0","tryCatchPattern":"try:\n    path = save_base64_data_url(data_url, out_dir)\nexcept ValueError as e:\n    if str(e) == \"invalid base64 payload\":\n        return reject_attachment(\"attachment data corrupted in transit\")\n    raise","preventionTips":["Transport base64 in JSON bodies, never in URL query strings","Normalize URL-safe base64 ('-_' -> '+/') and restore '=' padding before sending","Add a checksum (e.g. SHA-256) alongside large payloads to detect truncation"],"tags":["base64","decoding","media","validation"],"backgroundTag":"invalid-base64-encoding","analyzedSha":"80ffdda44c5c4db0dd84d70e051cca591cea67df","analyzedAt":"2026-08-28T12:46:38.989Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}