docmirror/dev-sidecar · warning
【fakeServer stream error - ${hostname}:${port}】
Error message
【fakeServer stream error - ${hostname}:${port}】 What it means
A log.warn from the per-stream error handler on HTTP/2 sessions of the fake MITM server. Individual h2 streams (requests) that fail — e.g. reset by the client (RST_STREAM), protocol errors, or aborted downloads — are logged here so the proxy keeps serving instead of throwing. The message is per-request, not per-server.
Source
Thrown at packages/mitmproxy/src/lib/proxy/tls/FakeServersCenter.js:194
// 三个 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)
log.error(`自动兼容程序:${err.code},现设置为启用ssl: ${hostname}:${port}, ssl = true`)
}
}
})View on GitHub (pinned to 7710cd56cc)
Solutions
- Ignore if browsing works — stream errors from canceled requests are expected
- If a specific site consistently fails, look at the following err object in server.log to identify the stream error code
- Retry the failing request; transient resets often self-heal
- If persistent, try forcing HTTP/1.1 for that domain or check for mitm/intercept rules mangling the response
Defensive patterns
Strategy: retry
Try / catch
stream.on('error', (err) => {
if (err.code === 'ERR_HTTP2_STREAM_ERROR' || err.code === 'ECONNRESET') {
log.debug('h2 stream aborted by client; safe to ignore')
return
}
log.warn('unexpected h2 stream error', err)
}) Prevention
- Treat canceled navigation mid-download as normal — don't alert on every stream warn
- If one site streams errors consistently, test it with HTTP/1.1 or outside the proxy
- Keep mitmproxy updated: h2 stream handling fixes land in newer versions
- Review server.log error codes (RST_STREAM, ERR_HTTP2_PROTOCOL_ERROR) to spot real protocol issues
When it happens
Trigger: Any h2 request/stream on the fake server for hostname:port errors: client cancels a download, RST_STREAM on navigation away, request aborted before response completes, or protocol-level violation after the session was established.
Common situations: User navigates away mid-download (ERR_ABORTED equivalents), page loads canceled by the browser, video streams interrupted; very common and normally harmless during normal browsing through the proxy.
Related errors
- 【fakeServer session 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/992a9af0c8245171.
Report an issue: GitHub.