docmirror/dev-sidecar · warning
【fakeServer session error - ${hostname}:${port}】
Error message
【fakeServer session error - ${hostname}:${port}】 What it means
This is a log.warn emitted from an HTTP/2 'session' error handler on the fake (MITM) TLS server for the given hostname:port. The library attaches these handlers specifically to prevent uncaught exceptions from breaking the proxy; the message records that an h2 session ended with an error, not that the proxy crashed.
Source
Thrown at packages/mitmproxy/src/lib/proxy/tls/FakeServersCenter.js:190
}
this.upgradeHandler(req, socket, head, ssl)
})
// 三个 error 事件
fakeServer.on('error', (e) => {
log.error(`【fakeServer error - ${hostname}:${port}】\r\n----- error -----\r\n`, e)
if (!isListening) {
reject(e)
}
})
// HTTP/2 会话错误:协议违规、帧错误等
fakeServer.on('sessionError', (err, session) => {
log.error(`【fakeServer sessionError - ${hostname}:${port}】`, err)
})
// HTTP/2 会话建立:绑定流错误监听,避免未捕获异常
fakeServer.on('session', (session) => {
session.on('error', (err) => {
log.warn(`【fakeServer session error - ${hostname}:${port}】`, err)
})
session.on('stream', (stream) => {
stream.on('error', (err) => {
log.warn(`【fakeServer stream error - ${hostname}:${port}】`, err)
})
})
})
fakeServer.on('clientError', (err, _socket) => {
// log.error(`【fakeServer clientError - ${hostname}:${port}】\r\n----- error -----\r\n`, err, '\r\n----- socket -----\r\n', socket)
log.error(`【fakeServer clientError - ${hostname}:${port}】\r\n`, err)
// 自动兼容程序:1
if (port !== 443 && port !== 80) {
if (ssl === true && err.code && err.code.startsWith('ERR_SSL_')) {
compatible.setConnectSsl(hostname, port, false)
log.error(`自动兼容程序:SSL异常,现设置为禁用ssl: ${hostname}:${port}, ssl = false`)
} else if (ssl === false && err.code === 'HPE_INVALID_METHOD') {
compatible.setConnectSsl(hostname, port, true)View on GitHub (pinned to 7710cd56cc)
Solutions
- Treat as diagnostic noise unless the target site fails: it usually reflects the client closing the connection
- If errors correlate with site failures, check the err detail in server.log for codes like ECONNRESET vs cert errors
- Disable HTTP/2 for that domain (force HTTP/1.1 via intercept config) if h2 handling is problematic
- Ensure the root CA cert is properly installed — repeated session errors can stem from TLS trust failures
Defensive patterns
Strategy: retry
Try / catch
target.on('error', (err) => {
if (err.code === 'ECONNRESET' || err.code === 'ERR_HTTP2_SESSION_ERROR') {
log.debug('h2 session closed by peer, retrying...')
return retryRequest()
}
throw err
}) Prevention
- Expect session errors from browsers' speculative preconnects — filter ECONNRESET noise in monitoring
- Install the dev-sidecar root CA correctly to avoid TLS-driven session failures
- Force HTTP/1.1 for domains with problematic h2 behavior via intercept config
- Shut down the proxy gracefully (DevSidecar.api.shutdown()) so open h2 sessions close cleanly
When it happens
Trigger: A client connects via HTTP/2 to the MITM fake server and the h2 session errors — typically ECONNRESET/socket hang up when the client (browser or app) closes the connection abruptly mid-session, or a TLS/h2 negotiation failure after connect.
Common situations: Browser preconnect speculative connections torn down before use; mobile clients aggressively recycling connections; server shutdown while sessions are open (seen during shutdown()); flaky networks dropping connections.
Related errors
- 【fakeServer stream error - ${hostname}:${port}】
- 域名 ${rOptions.hostname} 在dns中未配置,但使用了 sni: ${rOptions.server
AI-assisted analysis of docmirror/dev-sidecar@7710cd56cc (2026-08-31).
Data as JSON: /api/errors/61077b5b4527ec7f.
Report an issue: GitHub.