{"record":{"id":"808ee7166b7344ff","repo":"quarkusio/quarkus","slug":"expected-a-base64-encoded-byte-array-got-text","errorCode":null,"errorMessage":"Expected a base64 encoded byte array, got: ${text}","messagePattern":"Expected a base64 encoded byte array, got: (.+?)","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"extensions/devui/runtime/src/main/java/io/quarkus/devui/runtime/DevUIRecorder.java","lineNumber":57,"sourceCode":"@Recorder\npublic class DevUIRecorder {\n    private static final Logger LOG = Logger.getLogger(DevUIRecorder.class);\n\n    public void initializeJsonRpcCodec(BeanContainer beanContainer) {\n        JsonRpcRouter jsonRpcRouter = beanContainer.beanInstance(JsonRpcRouter.class);\n        jsonRpcRouter.initializeCodec(createVertxJsonMapper());\n    }\n\n    public static JsonMapper createVertxJsonMapper() {\n        JsonMapper.Factory factory = JsonMapper.Factory.deploymentLinker().createLink(\n                DevConsoleManager.getGlobal(DevJsonRpcRecorder.DEV_MANAGER_GLOBALS_JSON_MAPPER_FACTORY));\n        return factory.create(new JsonTypeAdapter<>(JsonObject.class, JsonObject::getMap, JsonObject::new),\n                new JsonTypeAdapter<>(JsonArray.class, JsonArray::getList, JsonArray::new),\n                new JsonTypeAdapter<>(Buffer.class, buffer -> BASE64_ENCODER.encodeToString(buffer.getBytes()), text -> {\n                    try {\n                        return Buffer.buffer(BASE64_DECODER.decode(text));\n                    } catch (IllegalArgumentException e) {\n                        throw new IllegalArgumentException(\"Expected a base64 encoded byte array, got: \" + text, e);\n                    }\n                }));\n    }\n\n    public void shutdownTask(ShutdownContext shutdownContext, String devUIBasePath) {\n        shutdownContext.addShutdownTask(new DeleteDirectoryRunnable(devUIBasePath));\n    }\n\n    public Handler<RoutingContext> devUIWebSocketHandler() {\n        return new DevUIWebSocketHandler();\n    }\n\n    public Handler<RoutingContext> uiHandler(String finalDestination,\n            String path,\n            List<FileSystemStaticHandler.StaticWebRootConfiguration> webRootConfigurations,\n            ShutdownContext shutdownContext) {\n\n        WebJarStaticHandler handler = new WebJarStaticHandler(finalDestination, path, webRootConfigurations);","sourceCodeStart":39,"sourceCodeEnd":75,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/devui/runtime/src/main/java/io/quarkus/devui/runtime/DevUIRecorder.java#L39-L75","documentation":"DevUIRecorder.createVertxJsonMapper installs a JSON type adapter mapping vert.x Buffer to a base64-encoded string. When decoding incoming text back into a Buffer, a non-base64 string causes IllegalArgumentException, which is rethrown with 'Expected a base64 encoded byte array, got: <text>'. This means the JSON-RPC client sent something that is not valid base64 where a Buffer was expected.","triggerScenarios":"A Dev UI JSON-RPC call passing a plain string, hex, or data-URI (e.g. 'data:...;base64,...') where a Buffer/base64 byte array parameter is expected; called via initializeJsonRpcCodec.","commonSituations":"Front-end code sending raw text or a data URL instead of stripping the prefix and base64-encoding the payload; corrupted payloads from hand-rolled JSON-RPC clients.","solutions":["Send the payload as proper base64 (Base64.getEncoder().encodeToString(bytes))","Strip any 'data:...;base64,' prefix before sending","Decode/validate client-side first (e.g. atob or Buffer.from with 'base64' and strict check)"],"exampleFix":"// before\nrpc.call('sendBuffer', { data: fileText });\n// after\nrpc.call('sendBuffer', { data: btoa(unescape(encodeURIComponent(fileText))) });","handlingStrategy":"try-catch","validationCode":"// client side\nconst b64 = /^([A-Za-z0-9+/=\\r\\n]+)$/;\nif (!b64.test(payload)) throw new Error(\"payload must be plain base64\");","typeGuard":null,"tryCatchPattern":"try { rpc.call('method', { data: payload }); }\ncatch (e) {\n  if (String(e.message).startsWith('Expected a base64 encoded byte array')) {\n    // re-encode payload as base64 and retry once\n  } else { throw e; }\n}","preventionTips":["Always base64-encode binary payloads before JSON-RPC calls","Strip data-URI prefixes before sending","Validate with a base64 regex client-side"],"tags":["devui","json-rpc","base64","vertx"],"backgroundTag":"invalid-base64-payload","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}