alibaba/canal · error · RuntimeException
requestPost(Https) remote error, request : {}, statusCode={}
Error message
requestPost(Https) remote error, request : {}, statusCode={} What it means
Thrown by postIgnoreCerf() (HTTPS POST with certificate bypass) when the remote server returns a non-200 status code. The message includes the curl-equivalent request, the statusCode, but NOT the response body (unlike error 426 which includes it). This is the inner throw inside the try block.
Source
Thrown at parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/rds/HttpHelper.java:239
parameters.add(nameValuePair);
}
httpPost.setEntity(new UrlEncodedFormEntity(parameters, Charset.forName("UTF-8")));
HttpClientContext context = HttpClientContext.create();
context.setRequestConfig(config);
context.setCookieStore(cookieStore);
response = httpClient.execute(httpPost, context);
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == HttpStatus.SC_OK) {
long end = System.currentTimeMillis();
long cost = end - start;
printCurlRequest(url, cookieStore, params, cost);
return EntityUtils.toString(response.getEntity());
} else {
long end = System.currentTimeMillis();
long cost = end - start;
String curlRequest = getCurlRequest(url, cookieStore, params, cost);
throw new RuntimeException("requestPost(Https) remote error, request : " + curlRequest
+ ", statusCode=" + statusCode + "");
}
} catch (Throwable t) {
long end = System.currentTimeMillis();
long cost = end - start;
String curlRequest = getCurlRequest(url, cookieStore, params, cost);
throw new RuntimeException("requestPost(Https) remote error, request : " + curlRequest, t);
} finally {
if (response != null) {
try {
response.close();
} catch (IOException e) {
}
}
if (httpPost != null) {
httpPost.releaseConnection();
}
}View on GitHub (pinned to 87be50e876)
Solutions
- Since the response body is NOT in the message, enable debug/warn logging to capture printCurlRequest output and manually reproduce with curl to see the response body.
- Verify the CookieStore has valid, non-expired cookies if authentication is cookie-based.
- Check that all required POST parameters are present in the params map.
- If statusCode is 5xx or 429, retry with exponential backoff.
Defensive patterns
Strategy: try-catch
Try / catch
try {
String result = HttpHelper.post(httpsUrl, cookieStore, params, timeout);
} catch (RuntimeException e) {
// The statusCode is in the message but response body is NOT included.
// Reproduce with curl (from logs) to see the response body.
String curlCmd = extractCurlFromMessage(e.getMessage());
} Prevention
- Log the curl-equivalent request string at WARN level for debugging (the code does this via printCurlRequest).
- Ensure cookies are refreshed if using session-based auth.
- Validate all required POST parameters are in the params map.
When it happens
Trigger: Calling HttpHelper.post(url, cookieStore, params, timeout) with an https:// URL that gets a non-200 response. The post() method delegates to postIgnoreCerf() for HTTPS URLs. The response body is consumed but not included in the error message — only the status code is reported.
Common situations: RDS login/authentication endpoint returning 401/403 when cookie is expired or invalid; POST parameters are malformed or missing required fields; RDS API rate limiting via 429; server-side errors (5xx) during RDS binlog download request submission.
Related errors
- requestPost remote error, request : {}, statusCode={};{}
- requestPost(Https) remote error, request : {}
- requestPost remote error, request : {}
- requestPost remote error, request : {}
- requestGet remote error, request : {}
AI-assisted analysis of alibaba/canal@87be50e876 (2026-08-14).
Data as JSON: /api/errors/cd13a3aeba25c656.
Report an issue: GitHub.