{"record":{"id":"c6dd9dbc47c852e0","repo":"apache/seatunnel","slug":"get-returned-empty-body-null-empty-skip-this","errorCode":null,"errorMessage":"GET {} returned empty body (null/empty). Skip this node.","messagePattern":"GET (.+?) returned empty body \\(null/empty\\)\\. Skip this node\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/rest/service/LogService.java","lineNumber":97,"sourceCode":"                                        .get();\n            } catch (Exception e) {\n                log.warn(\"Failed to get HTTP port from member {}, skip.\", member.getAddress(), e);\n                continue;\n            }\n\n            String url = \"http://\" + host + \":\" + nodeHttpPort + contextPath;\n            String logUrl = url + REST_URL_GET_ALL_LOG_NAME;\n\n            String allName =\n                    httpConfig.isEnableBasicAuth()\n                            ? sendGet(\n                                    logUrl,\n                                    httpConfig.getBasicAuthUsername(),\n                                    httpConfig.getBasicAuthPassword())\n                            : sendGet(logUrl);\n\n            if (StringUtils.isBlank(allName)) {\n                log.warn(\"GET {} returned empty body (null/empty). Skip this node.\", logUrl);\n                continue;\n            }\n\n            if (log.isDebugEnabled()) {\n                log.debug(\"Request: {} , Result: {}\", url, allName);\n            }\n            ArrayNode jsonNodes = JsonUtils.parseArray(allName);\n\n            final String nodeId = host + \":\" + nodeHttpPort;\n            jsonNodes.forEach(\n                    jsonNode -> {\n                        String fileName = jsonNode.asText();\n                        if (StringUtils.isNotBlank(jobId) && !fileName.contains(jobId)) {\n                            return;\n                        }\n                        allLogNameList.add(\n                                new Tuple3<>(\n                                        nodeId, url + REST_URL_LOGS + \"/\" + fileName, fileName));","sourceCodeStart":79,"sourceCodeEnd":115,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/rest/service/LogService.java#L79-L115","documentation":"After obtaining a member's HTTP port, LogService issues GET logUrl to fetch that node's log file name list. If the response body is null or blank it logs this warning and skips the node, so the aggregated log-name listing omits that node instead of failing.","triggerScenarios":"Calling the all-log-names REST endpoint when a member's log-name HTTP route returns an empty body: remote REST endpoint erroring silently, auth misconfigured so the response is empty, proxy stripping body, or the node has no resolvable log directory.","commonSituations":"Basic-auth credentials mismatched between nodes so sendGetWithCredentials gets an empty/401 body; reverse proxy or TLS termination swallowing the response; log path not configured on that node (related to errorIndex 3718/3719).","solutions":["Check basic-auth username/password configuration matches across all nodes (httpConfig).","Curl the logUrl directly from the failing node to see status code/body and fix the remote endpoint.","Verify log4j2/log path is configured on that node so the log-name endpoint can list files.","Inspect intermediate proxies/load balancers that may drop empty or error responses."],"exampleFix":"// before (mismatched auth)\n// httpConfig.username=\"admin\"; httpConfig.password=\"wrong\"\n// after\n// httpConfig.username=\"admin\"; httpConfig.password=\"correct-from-config\"","handlingStrategy":"validation","validationCode":"// before calling the remote endpoint, verify auth and URL\n// if (StringUtils.isBlank(httpConfig.getBasicAuthUsername()) || StringUtils.isBlank(logUrl)) {\n//     failFast(\"missing auth or url\");\n// }\n// HttpResponse resp = sendGet(logUrl);\n// if (resp.status() != 200) { handle(resp.status()); }","typeGuard":null,"tryCatchPattern":"try {\n    String body = sendGet(logUrl);\n    if (StringUtils.isBlank(body)) { log.warn(\"Empty body from {}\", logUrl); return; }\n} catch (IOException e) {\n    log.warn(\"Request to {} failed\", logUrl, e);\n}","preventionTips":["Synchronize basic-auth credentials across all nodes","Verify log path configuration on every node","Curl endpoints directly per node to validate before cluster-wide calls"],"tags":["http","rest-api","empty-response","cluster-logs"],"backgroundTag":"empty-response-body","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}