{"record":{"id":"27913820dcb46098","repo":"alibaba/Sentinel","slug":"invalid-request","errorCode":null,"errorMessage":"Invalid request","messagePattern":"Invalid request","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterConfigService.java","lineNumber":58,"sourceCode":"import com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerTransportConfig;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\n/**\n * @author Eric Zhao\n * @since 1.4.0\n */\n@Service\npublic class ClusterConfigService {\n\n    @Autowired\n    private SentinelApiClient sentinelApiClient;\n    @Autowired\n    private AppManagement appManagement;\n\n    public CompletableFuture<Void> modifyClusterClientConfig(ClusterClientModifyRequest request) {\n        if (notClientRequestValid(request)) {\n            throw new IllegalArgumentException(\"Invalid request\");\n        }\n        String app = request.getApp();\n        String ip = request.getIp();\n        int port = request.getPort();\n        return sentinelApiClient.modifyClusterClientConfig(app, ip, port, request.getClientConfig())\n            .thenCompose(v -> sentinelApiClient.modifyClusterMode(ip, port, ClusterStateManager.CLUSTER_CLIENT));\n    }\n\n    private boolean notClientRequestValid(/*@NonNull */ ClusterClientModifyRequest request) {\n        ClusterClientConfig config = request.getClientConfig();\n        return config == null || StringUtil.isEmpty(config.getServerHost())\n            || config.getServerPort() == null || config.getServerPort() <= 0\n            || config.getRequestTimeout() == null || config.getRequestTimeout() <= 0;\n    }\n\n    public CompletableFuture<Void> modifyClusterServerConfig(ClusterServerModifyRequest request) {\n        ServerTransportConfig transportConfig = request.getTransportConfig();\n        ServerFlowConfig flowConfig = request.getFlowConfig();","sourceCodeStart":40,"sourceCodeEnd":76,"githubUrl":"https://github.com/alibaba/Sentinel/blob/a3f40ba8e900c8489bd520274739f17235a7721c/sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterConfigService.java#L40-L76","documentation":"ClusterConfigService.modifyClusterClientConfig (Sentinel dashboard) pushes a token-client config to a selected machine. It validates that the embedded ClusterClientConfig has a non-empty serverHost and positive serverPort/requestTimeout; otherwise it throws IllegalArgumentException('Invalid request') before any network call.","triggerScenarios":"POST to the dashboard cluster client config endpoint where request.clientConfig is null, serverHost is blank, or serverPort/requestTimeout is null or <= 0.","commonSituations":"Dashboard 'Token Client' form submitted with empty server host/port; API callers posting a ClusterClientModifyRequest JSON with missing clientConfig block; reverse-proxy stripping request body fields.","solutions":["Fill in the token server host, port (>0), and request timeout (>0) in the cluster client assignment form/payload.","Verify the JSON body actually contains clientConfig with serverHost, serverPort, requestTimeout — check for typos or wrong casing.","If driving the API programmatically, build ClusterClientConfig with all three fields before calling modifyClusterClientConfig."],"exampleFix":"// before\nClusterClientModifyRequest req = new ClusterClientModifyRequest();\nreq.setClientConfig(new ClusterClientConfig()); // host/port unset\nclusterConfigService.modifyClusterClientConfig(req);\n\n// after\nClusterClientConfig cfg = new ClusterClientConfig();\ncfg.setServerHost(\"10.0.0.1\");\ncfg.setServerPort(18730);\ncfg.setRequestTimeout(10);\nreq.setClientConfig(cfg);\nclusterConfigService.modifyClusterClientConfig(req);","handlingStrategy":"validation","validationCode":"ClusterClientConfig cfg = request.getClientConfig();\nboolean valid = cfg != null\n    && !StringUtil.isEmpty(cfg.getServerHost())\n    && cfg.getServerPort() != null && cfg.getServerPort() > 0\n    && cfg.getRequestTimeout() != null && cfg.getRequestTimeout() > 0;\nif (!valid) {\n    return ResponseEntity.badRequest().body(\"clientConfig requires serverHost, serverPort>0, requestTimeout>0\");\n}\nclusterConfigService.modifyClusterClientConfig(request);","typeGuard":"boolean isClientRequestValid(ClusterClientModifyRequest r) {\n    ClusterClientConfig c = r.getClientConfig();\n    return c != null && StringUtil.isNotBlank(c.getServerHost())\n        && c.getServerPort() != null && c.getServerPort() > 0\n        && c.getRequestTimeout() != null && c.getRequestTimeout() > 0;\n}","tryCatchPattern":null,"preventionTips":["Mirror the service's own notClientRequestValid check in your controller/frontend so users get field-level errors.","Require all three clientConfig fields in the form before enabling submit."],"tags":["sentinel","cluster","dashboard","validation"],"backgroundTag":null,"analyzedSha":"a3f40ba8e900c8489bd520274739f17235a7721c","analyzedAt":"2026-08-14T11:10:30.678Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}