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

  1. Ignore if browsing works — stream errors from canceled requests are expected
  2. If a specific site consistently fails, look at the following err object in server.log to identify the stream error code
  3. Retry the failing request; transient resets often self-heal
  4. 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

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


AI-assisted analysis of docmirror/dev-sidecar@7710cd56cc (2026-08-31). Data as JSON: /api/errors/992a9af0c8245171. Report an issue: GitHub.