alibaba/canal · error · RuntimeException

requestPost(Https) remote error, request : {}

Error message

requestPost(Https) remote error, request : {}

What it means

Thrown by the catch (Throwable t) block in getIgnoreCerf() as an outer wrapper for ANY exception during the HTTPS GET. Note: the message incorrectly says 'requestPost(Https)' even though this method performs a GET — this is a copy-paste bug in the source. The original exception is attached as the cause and a curl-equivalent string is included.

Source

Thrown at parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/rds/HttpHelper.java:173

                .setSocketTimeout(timeout)
                .build();
            httpGet = new HttpGet(uri);
            HttpClientContext context = HttpClientContext.create();
            context.setRequestConfig(config);
            response = httpClient.execute(httpGet, context);
            int statusCode = response.getStatusLine().getStatusCode();
            if (statusCode == HttpStatus.SC_OK) {
                return EntityUtils.toString(response.getEntity());
            } else {
                String errorMsg = EntityUtils.toString(response.getEntity());
                throw new RuntimeException("requestGet remote error, url=" + uri.toString() + ", code=" + statusCode
                                           + ", error msg=" + errorMsg);
            }
        } 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 {
            long end = System.currentTimeMillis();
            long cost = end - start;
            printCurlRequest(url, null, null, cost);
            if (response != null) {
                try {
                    response.close();
                } catch (IOException e) {
                }
            }
            if (httpGet != null) {
                httpGet.releaseConnection();
            }
        }
    }

    private static String postIgnoreCerf(String url, CookieStore cookieStore, Map<String, String> params, int timeout) {
        long start = System.currentTimeMillis();

View on GitHub (pinned to 87be50e876)

Solutions

  1. Look at the cause exception to find the real failure — do not be misled by the 'requestPost' text, this is actually a GET operation.
  2. If cause is SSLException, ensure the JVM supports the TLS version required by RDS (TLSv1.2).
  3. If cause is SocketTimeoutException, increase the timeout parameter.
  4. If the cause is the inner RuntimeException (error 422), address the non-200 response per error 422 solutions.
Defensive patterns

Strategy: retry

Validate before calling

// Validate URL is reachable before calling
URI uri = new URI(httpsUrl);
if (uri.getHost() == null || uri.getHost().isEmpty()) {
    throw new IllegalArgumentException("Invalid RDS URL: " + httpsUrl);
}

Try / catch

try {
    String result = HttpHelper.get(httpsUrl, timeout);
} catch (RuntimeException e) {
    Throwable cause = e.getCause() != null ? e.getCause() : e;
    // Note: message says 'requestPost' but this is actually a GET — do not be misled
    if (cause instanceof javax.net.ssl.SSLException) {
        // TLS issue
    }
}

Prevention

When it happens

Trigger: Any Throwable during getIgnoreCerf(): the inner non-200 status throw (error 422), SSL handshake failure despite certificate bypass, connection timeout, socket read timeout, or network unreachable. The misleading 'requestPost' label can cause confusion during debugging.

Common situations: HTTPS connection timeout to RDS endpoint; TLS version mismatch (server requires TLSv1.2+ but client default is lower); firewall blocking outbound 443; transient network blips during RDS binlog file listing.

Related errors


AI-assisted analysis of alibaba/canal@87be50e876 (2026-08-14). Data as JSON: /api/errors/b9222707189ecf69. Report an issue: GitHub.