XX-net/XX-Net · error · GAE_Exception

602

602

Error message

ip not support GAE

What it means

GAE_Exception 602 raised when the responding server is not a Google frontend: the Server header lacks 'gws'/'Google Frontend'/'GFE', or status is 403/405. The IP connects but cannot serve GAE, so the worker is closed and the IP is effectively rejected for GAE use.

Source

Thrown at code/default/gae_proxy/local/gae_handler.py:361

            xlog.warning('APPID %r out of Quota, remove it. %s',
                         appid, response.ssl_sock.ip_str)
            front.appid_manager.report_out_of_quota(appid)
            # google_ip.report_connect_closed(response.ssl_sock.ip_str, "out of quota")
            response.worker.close("appid out of quota:%s" % appid)
            raise GAE_Exception(604, "appid out of quota:%s" % appid)

        server_type = response.getheader(b"Server", b"")
        if (b"gws" not in server_type and b"Google Frontend" not in server_type and b"GFE" not in server_type) or \
                response.status == 403 or response.status == 405:

            # some ip can connect, and server type can be gws
            # but can't use as GAE server
            # so we need remove it immediately

            xlog.warn("IP:%s not support GAE, headers:%s status:%d", response.ssl_sock.ip_str, response.headers,
                      response.status)
            response.worker.close("ip not support GAE")
            raise GAE_Exception(602, "ip not support GAE")

        response.gps = response.getheader(b"x-server", b"")

        if response.status > 300:
            raise GAE_Exception(605, "status:%d" % response.status)

        if response.status != 200:
            xlog.warn("GAE %s appid:%s status:%d", response.ssl_sock.ip_str,
                      appid, response.status)

        return response
    except GAE_Exception as e:
        if e.error_code not in (600, 603, 604) and hasattr(response, "ssl_sock"):
            front.ip_manager.recheck_ip(response.ssl_sock.ip_str, first_report=False)
        raise e


def request_gae_proxy(method, url, headers, body, timeout=None):

View on GitHub (pinned to cfa5bc17b6)

Solutions

  1. Let the IP manager rescan / remove bad IPs; restart XX-Net to trigger re-scanning
  2. Verify the IP actually belongs to Google (whois / curl to https://ip)
  3. Update XX-Net — IP evaluation logic improves over versions
  4. Use a cleaner network path (different ISP route, VPN) if hijacking is systematic
Defensive patterns

Strategy: retry

Try / catch

try:
    resp = request_gae_proxy(...)
except GAE_Exception as e:
    if e.code == 602:  # non-Google server; retry picks another IP
        report_bad_ip_current()
        resp = request_gae_proxy(...)
    else:
        raise

Prevention

When it happens

Trigger: request_gae_proxy landing on a non-Google server (hijacked IP, wrong scan result), or a Google IP that refuses the GAE app path with 403/405. The check runs on every response's Server header.

Common situations: DNS poisoning / IP hijack returning a captive portal, CDN or other service occupying the IP, GFW interference, IP ranges reassigned away from Google.

Related errors


AI-assisted analysis of XX-net/XX-Net@cfa5bc17b6 (2026-08-27). Data as JSON: /api/errors/7562f9bf8fccd046. Report an issue: GitHub.