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

  1. Treat as diagnostic noise unless the target site fails: it usually reflects the client closing the connection
  2. If errors correlate with site failures, check the err detail in server.log for codes like ECONNRESET vs cert errors
  3. Disable HTTP/2 for that domain (force HTTP/1.1 via intercept config) if h2 handling is problematic
  4. 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

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


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