{"record":{"id":"bab41bbe42f6b724","repo":"XX-net/XX-Net","slug":"login-session-server-is-down-try-get-new-server","errorCode":null,"errorMessage":"login session server is down, try get new server.","messagePattern":"login session server is down, try get new server\\.","errorType":"console","errorClass":null,"httpStatus":521,"severity":"error","filePath":"code/default/x_tunnel/local/proxy_session.py","lineNumber":423,"sourceCode":"                                               self.session_id,\n                                               g.config.max_payload, g.config.send_delay, g.config.windows_size,\n                                               int(g.config.windows_ack), g.config.resend_timeout, g.config.ack_delay)\n                upload_data_head += struct.pack(\"<H\", len(g.config.login_account)) + utils.to_bytes(g.config.login_account)\n                upload_data_head += struct.pack(\"<H\", len(g.config.login_password)) + utils.to_bytes(g.config.login_password)\n                extra_info = self.get_login_extra_info()\n                upload_data_head += struct.pack(\"<H\", len(extra_info)) + utils.to_bytes(extra_info)\n\n                upload_post_data = encrypt_data(upload_data_head)\n\n                content, status, response = g.http_client.request(method=\"POST\", host=g.server_host, path=\"/data\",\n                                                                  data=upload_post_data,\n                                                                  timeout=g.config.network_timeout)\n\n                time_cost = time.time() - start_time\n\n                if status == 521:\n                    g.last_api_error = \"session server is down.\"\n                    xlog.warn(\"login session server is down, try get new server.\")\n                    g.server_host = None\n                    return False\n\n                if status != 200:\n                    g.last_api_error = \"session server login fail:%r\" % status\n                    xlog.warn(\"login session fail, status:%r\", status)\n                    continue\n\n                if len(content) < 6:\n                    g.last_api_error = \"session server protocol fail, login res len:%d\" % len(content)\n                    xlog.error(\"login data len:%d fail\", len(content))\n                    continue\n\n                info = decrypt_data(content)\n                magic, protocol_version, pack_type, res, message_len = struct.unpack(\"<cBBBH\", info[:6])\n                message = info[6:]\n                if isinstance(message, memoryview):\n                    message = message.tobytes()","sourceCodeStart":405,"sourceCodeEnd":441,"githubUrl":"https://github.com/XX-net/XX-Net/blob/cfa5bc17b67676e467f37ec50766127e0ab5f0aa/code/default/x_tunnel/local/proxy_session.py#L405-L441","documentation":"login_session received HTTP 521 from the X-Tunnel session API. 521 is Cloudflare's 'Web server is down' status, meaning the origin session server is offline. The code records g.last_api_error, clears g.server_host so a new server will be resolved, and returns False so the caller (start) retries with a different host.","triggerScenarios":"POST to the login/session API returns 521 — the currently selected session server behind Cloudflare is unreachable.","commonSituations":"Transient outage of the session server, server blocked/taken down, regional Cloudflare issues; commonly resolves by rotating to another server host.","solutions":["Let the client retry — start() will resolve a new server via g.server_host = None and re-login","Check X-Tunnel status pages/community for known outages","If persistent, verify DNS/Cloudflare reachability from the client network; adjust available server list"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"# rely on client rotation: g.server_host = None triggers new server resolution before next login","typeGuard":null,"tryCatchPattern":"while not session.start():\n    time.sleep(backoff); backoff = min(backoff*2, 300)  # rotates server each failure","preventionTips":["Let the client rotate session servers on 521 instead of pinning one host","Add backoff to avoid hammering a down server"],"tags":["x-tunnel","http-521","login","cloudflare","server-down"],"backgroundTag":"upstream-server-down","analyzedSha":"cfa5bc17b67676e467f37ec50766127e0ab5f0aa","analyzedAt":"2026-08-27T19:28:28.225Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}