{
 "recorded_at": "2026-10-10T12:49:57Z",
 "python": "3.14.4",
 "platform": "Linux-7.0.0-30-generic-x86_64-with-glibc2.43",
 "versions": {
  "curl_cffi": "0.16.3",
  "libcurl": "libcurl/8.21.0-IMPERSONATE BoringSSL zlib/1.3.1 brotli/1.2.0 zstd/1.5.7 libidn2/2.3.7 nghttp2/1.63.0 ngtcp2/1.20.0 nghttp3/1.15.0",
  "cffi": "2.1.1",
  "certifi": "2026.7.22"
 },
 "ports": {
  "http_target": 8080,
  "https_target": 8443,
  "jobs_target": 8081,
  "proxy": 8888,
  "proxy_b": 8889,
  "proxy_c": 8890,
  "socks": 1080,
  "socks_failing": 1081
 },
 "hosts": "127.0.0.2 dnsprobe.example",
 "lab_common": "\"\"\"Shared pieces of the curl_cffi proxy lab cases: the loopback fixture URLs and two helpers that\nprint what a call returned or raised. Every case file starts with `from lab_common import *`.\n\"\"\"\nimport os\n\nfrom curl_cffi.requests.exceptions import ConnectionError, ProxyError\n\nHTTP_URL = \"http://127.0.0.1:8080/\"\nHTTPS_URL = \"https://127.0.0.1:8443/\"\nPROBE_HTTP_URL = \"http://dnsprobe.example:8080/\"  # the lab hosts entry maps dnsprobe.example to 127.0.0.2\nPROBE_HTTPS_URL = \"https://dnsprobe.example:8443/\"\nJOBS_URL = \"http://127.0.0.1:8081/jobs\"  # loses the response to the first POST of each body\nCLOSED_HTTP_URL = \"http://127.0.0.1:9/\"  # nothing listens on port 9\nCLOSED_HTTPS_URL = \"https://127.0.0.1:9/\"\n\nPROXY = \"http://127.0.0.1:8888\"  # wants user / pass\nPROXY_AUTH = \"http://user:pass@127.0.0.1:8888\"\nPROXY_WRONG = \"http://user:wrong@127.0.0.1:8888\"\nPROXY_B_AUTH = \"http://user:pass@127.0.0.1:8889\"  # second proxy, same credentials\nPROXY_C_HOSTPORT = \"127.0.0.1:8890\"  # third proxy, password p@ss:w/rd\nPROXY_CLOSED = \"http://127.0.0.1:9\"\nSOCKS = \"socks5://127.0.0.1:1080\"\nSOCKS_H = \"socks5h://127.0.0.1:1080\"\nSOCKS_FAILING = \"socks5://127.0.0.1:1081\"  # answers every request with reply code 1\nSOCKS_CLOSED = \"socks5://127.0.0.1:9\"\n\nCA = os.environ[\"LAB_CA\"]  # the lab certificate, written by run_lab.py\n\n\ndef show(response):\n    print(\n        f\"RESPONSE status_code={response.status_code} ok={response.ok} url={response.url} \"\n        f\"body={response.text.strip()!r} proxy_authenticate={response.headers.get('Proxy-Authenticate')!r}\",\n        flush=True,\n    )\n\n\ndef show_error(error):\n    kind = type(error)\n    print(f\"EXCEPTION {kind.__module__}.{kind.__qualname__}: {error}\", flush=True)\n    code = getattr(error, \"code\", None)\n    response = getattr(error, \"response\", None)\n    print(\n        f\"DETAIL code={None if code is None else int(code)} \"\n        f\"is_ProxyError={isinstance(error, ProxyError)} is_ConnectionError={isinstance(error, ConnectionError)} \"\n        f\"is_OSError={isinstance(error, OSError)} \"\n        f\"response={type(response).__name__} response_status_code={getattr(response, 'status_code', None)!r}\",\n        flush=True,\n    )\n",
 "cases": [
  {
   "case": "https_no_credentials",
   "env": {},
   "command": "python https_no_credentials.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTPS_URL, proxy=PROXY, verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "EXCEPTION curl_cffi.requests.exceptions.ConnectionError: Failed to perform, curl: (7) CONNECT tunnel failed, response 407. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.",
    "DETAIL code=7 is_ProxyError=False is_ConnectionError=True is_OSError=True response=Response response_status_code=0"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "missing",
     "header_names": [
      "Host",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "https_no_credentials_impersonate",
   "env": {},
   "command": "python https_no_credentials_impersonate.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTPS_URL, proxy=PROXY, impersonate=\"chrome\", verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "EXCEPTION curl_cffi.requests.exceptions.ConnectionError: Failed to perform, curl: (7) CONNECT tunnel failed, response 407. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.",
    "DETAIL code=7 is_ProxyError=False is_ConnectionError=True is_OSError=True response=Response response_status_code=0"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "missing",
     "header_names": [
      "Host",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "https_wrong_password",
   "env": {},
   "command": "python https_wrong_password.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTPS_URL, proxy=PROXY_WRONG, verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "EXCEPTION curl_cffi.requests.exceptions.ConnectionError: Failed to perform, curl: (7) CONNECT tunnel failed, response 407. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.",
    "DETAIL code=7 is_ProxyError=False is_ConnectionError=True is_OSError=True response=Response response_status_code=0"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "wrong",
     "header_names": [
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "https_no_credentials_proxies_dict",
   "env": {},
   "command": "python https_no_credentials_proxies_dict.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTPS_URL, proxies={\"https\": PROXY}, verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "EXCEPTION curl_cffi.requests.exceptions.ConnectionError: Failed to perform, curl: (7) CONNECT tunnel failed, response 407. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.",
    "DETAIL code=7 is_ProxyError=False is_ConnectionError=True is_OSError=True response=Response response_status_code=0"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "missing",
     "header_names": [
      "Host",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "https_no_credentials_session",
   "env": {},
   "command": "python https_no_credentials_session.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    with requests.Session(impersonate=\"chrome\", proxy=PROXY, verify=CA) as session:\n        show(session.get(HTTPS_URL))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "EXCEPTION curl_cffi.requests.exceptions.ConnectionError: Failed to perform, curl: (7) CONNECT tunnel failed, response 407. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.",
    "DETAIL code=7 is_ProxyError=False is_ConnectionError=True is_OSError=True response=Response response_status_code=0"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "missing",
     "header_names": [
      "Host",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "https_credentials",
   "env": {},
   "command": "python https_credentials.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTPS_URL, proxy=PROXY_AUTH, verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=https://127.0.0.1:8443/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "ok",
     "header_names": [
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "https_credentials_impersonate",
   "env": {},
   "command": "python https_credentials_impersonate.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTPS_URL, proxy=PROXY_AUTH, impersonate=\"chrome\", verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=https://127.0.0.1:8443/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "ok",
     "header_names": [
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "https_credentials_proxies_dict",
   "env": {},
   "command": "python https_credentials_proxies_dict.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTPS_URL, proxies={\"http\": PROXY_AUTH, \"https\": PROXY_AUTH}, verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=https://127.0.0.1:8443/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "ok",
     "header_names": [
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "https_credentials_proxies_dict_impersonate",
   "env": {},
   "command": "python https_credentials_proxies_dict_impersonate.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTPS_URL, proxies={\"http\": PROXY_AUTH, \"https\": PROXY_AUTH}, impersonate=\"chrome\", verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=https://127.0.0.1:8443/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "ok",
     "header_names": [
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "https_credentials_proxy_auth",
   "env": {},
   "command": "python https_credentials_proxy_auth.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTPS_URL, proxy=PROXY, proxy_auth=(\"user\", \"pass\"), verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=https://127.0.0.1:8443/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "ok",
     "header_names": [
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "https_credentials_session_impersonate",
   "env": {},
   "command": "python https_credentials_session_impersonate.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    with requests.Session(impersonate=\"chrome\", proxy=PROXY_AUTH, verify=CA) as session:\n        show(session.get(HTTPS_URL))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=https://127.0.0.1:8443/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "ok",
     "header_names": [
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "https_credentials_session_proxies_dict",
   "env": {},
   "command": "python https_credentials_session_proxies_dict.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    with requests.Session(proxies={\"http\": PROXY_AUTH, \"https\": PROXY_AUTH}, verify=CA) as session:\n        show(session.get(HTTPS_URL))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=https://127.0.0.1:8443/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "ok",
     "header_names": [
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "password_percent_encoded",
   "env": {},
   "command": "python password_percent_encoded.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTPS_URL, proxy=f\"http://user:p%40ss%3Aw%2Frd@{PROXY_C_HOSTPORT}\", verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=https://127.0.0.1:8443/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8890,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "ok",
     "header_names": [
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "password_not_encoded",
   "env": {},
   "command": "python password_not_encoded.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTPS_URL, proxy=f\"http://user:p@ss:w/rd@{PROXY_C_HOSTPORT}\", verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "EXCEPTION curl_cffi.requests.exceptions.ProxyError: Failed to perform, curl: (5) Unsupported proxy syntax in 'http://user:p@ss:w/rd@127.0.0.1:8890': Port number was not a decimal number between 0 and 65535. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.",
    "DETAIL code=5 is_ProxyError=True is_ConnectionError=False is_OSError=True response=Response response_status_code=0"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "password_special_proxy_auth",
   "env": {},
   "command": "python password_special_proxy_auth.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTPS_URL, proxy=f\"http://{PROXY_C_HOSTPORT}\", proxy_auth=(\"user\", \"p@ss:w/rd\"), verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=https://127.0.0.1:8443/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8890,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "ok",
     "header_names": [
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "proxy_and_proxies_together",
   "env": {},
   "command": "python proxy_and_proxies_together.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTPS_URL, proxy=PROXY_AUTH, proxies={\"https\": PROXY_AUTH}, verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "EXCEPTION builtins.TypeError: Cannot specify both 'proxy' and 'proxies'",
    "DETAIL code=None is_ProxyError=False is_ConnectionError=False is_OSError=False response=NoneType response_status_code=None"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "https_proxy_port_closed",
   "env": {},
   "command": "python https_proxy_port_closed.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTPS_URL, proxy=PROXY_CLOSED, verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "EXCEPTION curl_cffi.requests.exceptions.ConnectionError: Failed to perform, curl: (7) Failed to connect to 127.0.0.1:8443 over proxy 127.0.0.1 after 0 ms: Could not connect to server. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.",
    "DETAIL code=7 is_ProxyError=False is_ConnectionError=True is_OSError=True response=Response response_status_code=0"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "https_target_port_closed_no_proxy",
   "env": {},
   "command": "python https_target_port_closed_no_proxy.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(CLOSED_HTTPS_URL, verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "EXCEPTION curl_cffi.requests.exceptions.ConnectionError: Failed to perform, curl: (7) Failed to connect to 127.0.0.1:9 after 0 ms: Could not connect to server. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.",
    "DETAIL code=7 is_ProxyError=False is_ConnectionError=True is_OSError=True response=Response response_status_code=0"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "https_target_port_closed_through_proxy",
   "env": {},
   "command": "python https_target_port_closed_through_proxy.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(CLOSED_HTTPS_URL, proxy=PROXY_AUTH, verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "EXCEPTION curl_cffi.requests.exceptions.ConnectionError: Failed to perform, curl: (7) CONNECT tunnel failed, response 502. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.",
    "DETAIL code=7 is_ProxyError=False is_ConnectionError=True is_OSError=True response=Response response_status_code=0"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:9",
     "auth": "ok",
     "header_names": [
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "https_http_scheme_for_socks_port",
   "env": {},
   "command": "python https_http_scheme_for_socks_port.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTPS_URL, proxy=\"http://127.0.0.1:1080\", verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "EXCEPTION curl_cffi.requests.exceptions.ProxyError: Failed to perform, curl: (56) Proxy CONNECT aborted. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.",
    "DETAIL code=56 is_ProxyError=True is_ConnectionError=False is_OSError=True response=Response response_status_code=0"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [
    "NOT_SOCKS5 first_bytes=b'CONNECT 127.0.0.1:8443 H'"
   ],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "https_https_scheme_for_http_proxy",
   "env": {},
   "command": "python https_https_scheme_for_http_proxy.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTPS_URL, proxy=\"https://user:pass@127.0.0.1:8888\", verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "EXCEPTION curl_cffi.requests.exceptions.SSLError: Failed to perform, curl: (35) TLS connect error: error:100000f7:SSL routines:OPENSSL_internal:WRONG_VERSION_NUMBER. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.",
    "DETAIL code=35 is_ProxyError=False is_ConnectionError=True is_OSError=True response=Response response_status_code=0"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "not_http",
     "first_bytes": "1603010200010001"
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "proxy_host_does_not_resolve",
   "env": {},
   "command": "python proxy_host_does_not_resolve.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTPS_URL, proxy=\"http://user:pass@proxy.invalid:8080\", verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "EXCEPTION curl_cffi.requests.exceptions.ProxyError: Failed to perform, curl: (5) Could not resolve proxy: proxy.invalid. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.",
    "DETAIL code=5 is_ProxyError=True is_ConnectionError=False is_OSError=True response=Response response_status_code=0"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "http_no_credentials",
   "env": {},
   "command": "python http_no_credentials.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTP_URL, proxy=PROXY))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=407 ok=False url=http://127.0.0.1:8080/ body='' proxy_authenticate='Basic realm=\"lab\"'"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "GET",
     "target": "http://127.0.0.1:8080/",
     "auth": "missing",
     "header_names": [
      "Accept-Encoding",
      "Host",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "http_no_credentials_impersonate",
   "env": {},
   "command": "python http_no_credentials_impersonate.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTP_URL, proxy=PROXY, impersonate=\"chrome\"))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=407 ok=False url=http://127.0.0.1:8080/ body='' proxy_authenticate='Basic realm=\"lab\"'"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "GET",
     "target": "http://127.0.0.1:8080/",
     "auth": "missing",
     "header_names": [
      "Accept",
      "Accept-Encoding",
      "Accept-Language",
      "Connection",
      "HTTP2-Settings",
      "Host",
      "Proxy-Connection",
      "Sec-Fetch-Dest",
      "Sec-Fetch-Mode",
      "Sec-Fetch-Site",
      "Sec-Fetch-User",
      "Upgrade",
      "Upgrade-Insecure-Requests",
      "User-Agent",
      "sec-ch-ua",
      "sec-ch-ua-mobile",
      "sec-ch-ua-platform"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "http_wrong_password",
   "env": {},
   "command": "python http_wrong_password.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTP_URL, proxy=PROXY_WRONG))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=407 ok=False url=http://127.0.0.1:8080/ body='' proxy_authenticate='Basic realm=\"lab\"'"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "GET",
     "target": "http://127.0.0.1:8080/",
     "auth": "wrong",
     "header_names": [
      "Accept-Encoding",
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "http_no_credentials_raise_for_status",
   "env": {},
   "command": "python http_no_credentials_raise_for_status.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    response = requests.get(HTTP_URL, proxy=PROXY)\n    show(response)\n    response.raise_for_status()\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=407 ok=False url=http://127.0.0.1:8080/ body='' proxy_authenticate='Basic realm=\"lab\"'",
    "EXCEPTION curl_cffi.requests.exceptions.HTTPError: HTTP Error 407: Proxy Authentication Required",
    "DETAIL code=0 is_ProxyError=False is_ConnectionError=False is_OSError=True response=Response response_status_code=407"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "GET",
     "target": "http://127.0.0.1:8080/",
     "auth": "missing",
     "header_names": [
      "Accept-Encoding",
      "Host",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "http_credentials",
   "env": {},
   "command": "python http_credentials.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTP_URL, proxy=PROXY_AUTH))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://127.0.0.1:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "GET",
     "target": "http://127.0.0.1:8080/",
     "auth": "ok",
     "header_names": [
      "Accept-Encoding",
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "http_credentials_impersonate",
   "env": {},
   "command": "python http_credentials_impersonate.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTP_URL, proxy=PROXY_AUTH, impersonate=\"chrome\"))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://127.0.0.1:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "GET",
     "target": "http://127.0.0.1:8080/",
     "auth": "ok",
     "header_names": [
      "Accept",
      "Accept-Encoding",
      "Accept-Language",
      "Connection",
      "HTTP2-Settings",
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection",
      "Sec-Fetch-Dest",
      "Sec-Fetch-Mode",
      "Sec-Fetch-Site",
      "Sec-Fetch-User",
      "Upgrade",
      "Upgrade-Insecure-Requests",
      "User-Agent",
      "sec-ch-ua",
      "sec-ch-ua-mobile",
      "sec-ch-ua-platform"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "http_proxies_dict_https_key_only",
   "env": {},
   "command": "python http_proxies_dict_https_key_only.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTP_URL, proxies={\"https\": PROXY_AUTH}))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://127.0.0.1:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "http_proxy_port_closed",
   "env": {},
   "command": "python http_proxy_port_closed.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTP_URL, proxy=PROXY_CLOSED))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "EXCEPTION curl_cffi.requests.exceptions.ConnectionError: Failed to perform, curl: (7) Failed to connect to 127.0.0.1:9 over proxy 127.0.0.1 after 0 ms: Could not connect to server. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.",
    "DETAIL code=7 is_ProxyError=False is_ConnectionError=True is_OSError=True response=Response response_status_code=0"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "socks5_http_hostname",
   "env": {},
   "command": "python socks5_http_hostname.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(PROBE_HTTP_URL, proxy=SOCKS))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://dnsprobe.example:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [
    "CONNECT atyp=IPv4 dest=127.0.0.2:8080"
   ],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "socks5h_http_hostname",
   "env": {},
   "command": "python socks5h_http_hostname.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(PROBE_HTTP_URL, proxy=SOCKS_H))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://dnsprobe.example:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [
    "CONNECT atyp=DOMAIN dest=dnsprobe.example:8080"
   ],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "socks5_https_hostname",
   "env": {},
   "command": "python socks5_https_hostname.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(PROBE_HTTPS_URL, proxy=SOCKS, verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=https://dnsprobe.example:8443/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [
    "CONNECT atyp=IPv4 dest=127.0.0.2:8443"
   ],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "socks5h_https_hostname",
   "env": {},
   "command": "python socks5h_https_hostname.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(PROBE_HTTPS_URL, proxy=SOCKS_H, verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=https://dnsprobe.example:8443/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [
    "CONNECT atyp=DOMAIN dest=dnsprobe.example:8443"
   ],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "socks5_https_hostname_impersonate",
   "env": {},
   "command": "python socks5_https_hostname_impersonate.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(PROBE_HTTPS_URL, proxy=SOCKS, impersonate=\"chrome\", verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=https://dnsprobe.example:8443/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [
    "CONNECT atyp=IPv4 dest=127.0.0.2:8443"
   ],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "socks5h_https_hostname_impersonate",
   "env": {},
   "command": "python socks5h_https_hostname_impersonate.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(PROBE_HTTPS_URL, proxy=SOCKS_H, impersonate=\"chrome\", verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=https://dnsprobe.example:8443/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [
    "CONNECT atyp=DOMAIN dest=dnsprobe.example:8443"
   ],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "socks5h_proxies_dict",
   "env": {},
   "command": "python socks5h_proxies_dict.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(PROBE_HTTP_URL, proxies={\"http\": SOCKS_H, \"https\": SOCKS_H}))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://dnsprobe.example:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [
    "CONNECT atyp=DOMAIN dest=dnsprobe.example:8080"
   ],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "socks5_general_failure",
   "env": {},
   "command": "python socks5_general_failure.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTP_URL, proxy=SOCKS_FAILING))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "EXCEPTION curl_cffi.requests.exceptions.ProxyError: Failed to perform, curl: (97) cannot complete SOCKS5 connection to 127.0.0.1. (1). See https://curl.se/libcurl/c/libcurl-errors.html first for more details.",
    "DETAIL code=97 is_ProxyError=True is_ConnectionError=False is_OSError=True response=Response response_status_code=0"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [],
   "failing_socks_log": [
    "CONNECT atyp=IPv4 dest=127.0.0.1:8080"
   ],
   "target_log": []
  },
  {
   "case": "socks5_general_failure_https",
   "env": {},
   "command": "python socks5_general_failure_https.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTPS_URL, proxy=SOCKS_FAILING, verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "EXCEPTION curl_cffi.requests.exceptions.ProxyError: Failed to perform, curl: (97) cannot complete SOCKS5 connection to 127.0.0.1. (1). See https://curl.se/libcurl/c/libcurl-errors.html first for more details.",
    "DETAIL code=97 is_ProxyError=True is_ConnectionError=False is_OSError=True response=Response response_status_code=0"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [],
   "failing_socks_log": [
    "CONNECT atyp=IPv4 dest=127.0.0.1:8443"
   ],
   "target_log": []
  },
  {
   "case": "socks5_destination_refused",
   "env": {},
   "command": "python socks5_destination_refused.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(CLOSED_HTTP_URL, proxy=SOCKS))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "EXCEPTION curl_cffi.requests.exceptions.ProxyError: Failed to perform, curl: (97) cannot complete SOCKS5 connection to 127.0.0.1. (5). See https://curl.se/libcurl/c/libcurl-errors.html first for more details.",
    "DETAIL code=97 is_ProxyError=True is_ConnectionError=False is_OSError=True response=Response response_status_code=0"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [
    "CONNECT atyp=IPv4 dest=127.0.0.1:9"
   ],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "socks5_port_closed",
   "env": {},
   "command": "python socks5_port_closed.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTP_URL, proxy=SOCKS_CLOSED))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "EXCEPTION curl_cffi.requests.exceptions.ConnectionError: Failed to perform, curl: (7) Failed to connect to 127.0.0.1:8080 over proxy 127.0.0.1 after 0 ms: Could not connect to server. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.",
    "DETAIL code=7 is_ProxyError=False is_ConnectionError=True is_OSError=True response=Response response_status_code=0"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "socks5_scheme_for_http_proxy_port",
   "env": {},
   "command": "python socks5_scheme_for_http_proxy_port.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTP_URL, proxy=\"socks5://127.0.0.1:8888\"))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "EXCEPTION curl_cffi.requests.exceptions.ProxyError: Failed to perform, curl: (97) Received invalid version in initial SOCKS5 response.. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.",
    "DETAIL code=97 is_ProxyError=True is_ConnectionError=False is_OSError=True response=Response response_status_code=0"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "not_http",
     "first_bytes": "050100"
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_upper_http_proxy_http_url",
   "env": {
    "HTTP_PROXY": "http://user:pass@127.0.0.1:8888"
   },
   "command": "python env_upper_http_proxy_http_url.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTP_URL))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://127.0.0.1:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_lower_http_proxy_http_url",
   "env": {
    "http_proxy": "http://user:pass@127.0.0.1:8888"
   },
   "command": "python env_lower_http_proxy_http_url.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTP_URL))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://127.0.0.1:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "GET",
     "target": "http://127.0.0.1:8080/",
     "auth": "ok",
     "header_names": [
      "Accept-Encoding",
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_upper_http_proxy_https_url",
   "env": {
    "HTTP_PROXY": "http://user:pass@127.0.0.1:8888"
   },
   "command": "python env_upper_http_proxy_https_url.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTPS_URL, verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=https://127.0.0.1:8443/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_lower_http_proxy_https_url",
   "env": {
    "http_proxy": "http://user:pass@127.0.0.1:8888"
   },
   "command": "python env_lower_http_proxy_https_url.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTPS_URL, verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=https://127.0.0.1:8443/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_upper_https_proxy_https_url",
   "env": {
    "HTTPS_PROXY": "http://user:pass@127.0.0.1:8888"
   },
   "command": "python env_upper_https_proxy_https_url.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTPS_URL, verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=https://127.0.0.1:8443/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "ok",
     "header_names": [
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_lower_https_proxy_https_url",
   "env": {
    "https_proxy": "http://user:pass@127.0.0.1:8888"
   },
   "command": "python env_lower_https_proxy_https_url.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTPS_URL, verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=https://127.0.0.1:8443/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "ok",
     "header_names": [
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_upper_https_proxy_http_url",
   "env": {
    "HTTPS_PROXY": "http://user:pass@127.0.0.1:8888"
   },
   "command": "python env_upper_https_proxy_http_url.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTP_URL))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://127.0.0.1:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_upper_all_proxy_http_url",
   "env": {
    "ALL_PROXY": "http://user:pass@127.0.0.1:8888"
   },
   "command": "python env_upper_all_proxy_http_url.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTP_URL))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://127.0.0.1:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "GET",
     "target": "http://127.0.0.1:8080/",
     "auth": "ok",
     "header_names": [
      "Accept-Encoding",
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_lower_all_proxy_http_url",
   "env": {
    "all_proxy": "http://user:pass@127.0.0.1:8888"
   },
   "command": "python env_lower_all_proxy_http_url.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTP_URL))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://127.0.0.1:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "GET",
     "target": "http://127.0.0.1:8080/",
     "auth": "ok",
     "header_names": [
      "Accept-Encoding",
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_upper_all_proxy_https_url",
   "env": {
    "ALL_PROXY": "http://user:pass@127.0.0.1:8888"
   },
   "command": "python env_upper_all_proxy_https_url.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTPS_URL, verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=https://127.0.0.1:8443/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "ok",
     "header_names": [
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_upper_http_proxy_impersonate",
   "env": {
    "HTTP_PROXY": "http://user:pass@127.0.0.1:8888"
   },
   "command": "python env_upper_http_proxy_impersonate.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTP_URL, impersonate=\"chrome\"))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://127.0.0.1:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_lower_http_proxy_impersonate",
   "env": {
    "http_proxy": "http://user:pass@127.0.0.1:8888"
   },
   "command": "python env_lower_http_proxy_impersonate.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTP_URL, impersonate=\"chrome\"))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://127.0.0.1:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "GET",
     "target": "http://127.0.0.1:8080/",
     "auth": "ok",
     "header_names": [
      "Accept",
      "Accept-Encoding",
      "Accept-Language",
      "Connection",
      "HTTP2-Settings",
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection",
      "Sec-Fetch-Dest",
      "Sec-Fetch-Mode",
      "Sec-Fetch-Site",
      "Sec-Fetch-User",
      "Upgrade",
      "Upgrade-Insecure-Requests",
      "User-Agent",
      "sec-ch-ua",
      "sec-ch-ua-mobile",
      "sec-ch-ua-platform"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_lower_http_proxy_no_credentials",
   "env": {
    "http_proxy": "http://127.0.0.1:8888"
   },
   "command": "python env_lower_http_proxy_no_credentials.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTP_URL))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=407 ok=False url=http://127.0.0.1:8080/ body='' proxy_authenticate='Basic realm=\"lab\"'"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "GET",
     "target": "http://127.0.0.1:8080/",
     "auth": "missing",
     "header_names": [
      "Accept-Encoding",
      "Host",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_upper_https_proxy_no_credentials",
   "env": {
    "HTTPS_PROXY": "http://127.0.0.1:8888"
   },
   "command": "python env_upper_https_proxy_no_credentials.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTPS_URL, verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "EXCEPTION curl_cffi.requests.exceptions.ConnectionError: Failed to perform, curl: (7) CONNECT tunnel failed, response 407. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.",
    "DETAIL code=7 is_ProxyError=False is_ConnectionError=True is_OSError=True response=Response response_status_code=0"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "missing",
     "header_names": [
      "Host",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_lower_http_proxy_upper_no_proxy",
   "env": {
    "http_proxy": "http://user:pass@127.0.0.1:8888",
    "NO_PROXY": "127.0.0.1"
   },
   "command": "python env_lower_http_proxy_upper_no_proxy.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTP_URL))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://127.0.0.1:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_lower_http_proxy_lower_no_proxy",
   "env": {
    "http_proxy": "http://user:pass@127.0.0.1:8888",
    "no_proxy": "127.0.0.1"
   },
   "command": "python env_lower_http_proxy_lower_no_proxy.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTP_URL))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://127.0.0.1:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_no_proxy_with_proxy_argument",
   "env": {
    "NO_PROXY": "127.0.0.1"
   },
   "command": "python env_no_proxy_with_proxy_argument.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTP_URL, proxy=PROXY_AUTH))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://127.0.0.1:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_lower_http_proxy_proxy_argument_wins",
   "env": {
    "http_proxy": "http://127.0.0.1:8888"
   },
   "command": "python env_lower_http_proxy_proxy_argument_wins.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTP_URL, proxy=PROXY_B_AUTH))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://127.0.0.1:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8889,
     "event": "request",
     "method": "GET",
     "target": "http://127.0.0.1:8080/",
     "auth": "ok",
     "header_names": [
      "Accept-Encoding",
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_lower_http_proxy_trust_env_false",
   "env": {
    "http_proxy": "http://user:pass@127.0.0.1:8888"
   },
   "command": "python env_lower_http_proxy_trust_env_false.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    with requests.Session(trust_env=False) as session:\n        show(session.get(HTTP_URL))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://127.0.0.1:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "GET",
     "target": "http://127.0.0.1:8080/",
     "auth": "ok",
     "header_names": [
      "Accept-Encoding",
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_upper_https_proxy_trust_env_false",
   "env": {
    "HTTPS_PROXY": "http://user:pass@127.0.0.1:8888"
   },
   "command": "python env_upper_https_proxy_trust_env_false.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    with requests.Session(trust_env=False, verify=CA) as session:\n        show(session.get(HTTPS_URL))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=https://127.0.0.1:8443/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "ok",
     "header_names": [
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_lower_http_proxy_proxy_empty_string",
   "env": {
    "http_proxy": "http://user:pass@127.0.0.1:8888"
   },
   "command": "python env_lower_http_proxy_proxy_empty_string.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTP_URL, proxy=\"\"))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://127.0.0.1:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "GET",
     "target": "http://127.0.0.1:8080/",
     "auth": "ok",
     "header_names": [
      "Accept-Encoding",
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_lower_http_proxy_proxies_all_empty",
   "env": {
    "http_proxy": "http://user:pass@127.0.0.1:8888"
   },
   "command": "python env_lower_http_proxy_proxies_all_empty.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTP_URL, proxies={\"all\": \"\"}))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://127.0.0.1:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_upper_https_proxy_proxies_all_empty",
   "env": {
    "HTTPS_PROXY": "http://user:pass@127.0.0.1:8888"
   },
   "command": "python env_upper_https_proxy_proxies_all_empty.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTPS_URL, proxies={\"all\": \"\"}, verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=https://127.0.0.1:8443/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_lower_http_proxy_session_proxies_all_empty",
   "env": {
    "http_proxy": "http://user:pass@127.0.0.1:8888"
   },
   "command": "python env_lower_http_proxy_session_proxies_all_empty.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    with requests.Session(proxies={\"all\": \"\"}) as session:\n        show(session.get(HTTP_URL))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://127.0.0.1:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_lower_http_proxy_curl_options_noproxy",
   "env": {
    "http_proxy": "http://user:pass@127.0.0.1:8888"
   },
   "command": "python env_lower_http_proxy_curl_options_noproxy.py",
   "code": "from curl_cffi import CurlOpt, requests\nfrom lab_common import *\n\ntry:\n    with requests.Session(curl_options={CurlOpt.NOPROXY: \"*\"}) as session:\n        show(session.get(HTTP_URL))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://127.0.0.1:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_lower_http_proxy_request_curl_options_noproxy",
   "env": {
    "http_proxy": "http://user:pass@127.0.0.1:8888"
   },
   "command": "python env_lower_http_proxy_request_curl_options_noproxy.py",
   "code": "from curl_cffi import CurlOpt, requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTP_URL, curl_options={CurlOpt.NOPROXY: \"*\"}))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://127.0.0.1:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_upper_https_proxy_request_curl_options_noproxy",
   "env": {
    "HTTPS_PROXY": "http://user:pass@127.0.0.1:8888"
   },
   "command": "python env_upper_https_proxy_request_curl_options_noproxy.py",
   "code": "from curl_cffi import CurlOpt, requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTPS_URL, curl_options={CurlOpt.NOPROXY: \"*\"}, verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=https://127.0.0.1:8443/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_no_proxy_with_proxy_argument_https",
   "env": {
    "NO_PROXY": "127.0.0.1"
   },
   "command": "python env_no_proxy_with_proxy_argument_https.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTPS_URL, proxy=PROXY_AUTH, verify=CA))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=https://127.0.0.1:8443/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "env_no_proxy_with_proxy_argument_curl_options",
   "env": {
    "NO_PROXY": "127.0.0.1"
   },
   "command": "python env_no_proxy_with_proxy_argument_curl_options.py",
   "code": "from curl_cffi import CurlOpt, requests\nfrom lab_common import *\n\ntry:\n    show(requests.get(HTTP_URL, proxy=PROXY_AUTH, curl_options={CurlOpt.NOPROXY: \"\"}))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://127.0.0.1:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "GET",
     "target": "http://127.0.0.1:8080/",
     "auth": "ok",
     "header_names": [
      "Accept-Encoding",
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "async_https_credentials_impersonate",
   "env": {},
   "command": "python async_https_credentials_impersonate.py",
   "code": "import asyncio\n\nfrom curl_cffi import AsyncSession\nfrom lab_common import *\n\n\nasync def main():\n    async with AsyncSession(impersonate=\"chrome\", proxy=PROXY_AUTH, verify=CA) as session:\n        show(await session.get(HTTPS_URL))\n\n\ntry:\n    asyncio.run(main())\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=https://127.0.0.1:8443/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "ok",
     "header_names": [
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "async_https_no_credentials",
   "env": {},
   "command": "python async_https_no_credentials.py",
   "code": "import asyncio\n\nfrom curl_cffi import AsyncSession\nfrom lab_common import *\n\n\nasync def main():\n    async with AsyncSession(impersonate=\"chrome\", proxy=PROXY, verify=CA) as session:\n        show(await session.get(HTTPS_URL))\n\n\ntry:\n    asyncio.run(main())\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "EXCEPTION curl_cffi.requests.exceptions.ConnectionError: Failed to perform, curl: (7) CONNECT tunnel failed, response 407. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.",
    "DETAIL code=7 is_ProxyError=False is_ConnectionError=True is_OSError=True response=Response response_status_code=0"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "missing",
     "header_names": [
      "Host",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "async_https_request_proxy_no_credentials",
   "env": {},
   "command": "python async_https_request_proxy_no_credentials.py",
   "code": "import asyncio\n\nfrom curl_cffi import AsyncSession\nfrom lab_common import *\n\n\nasync def main():\n    async with AsyncSession(verify=CA) as session:\n        show(await session.get(HTTPS_URL, proxy=PROXY))\n\n\ntry:\n    asyncio.run(main())\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "EXCEPTION curl_cffi.requests.exceptions.ConnectionError: Failed to perform, curl: (7) CONNECT tunnel failed, response 407. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.",
    "DETAIL code=7 is_ProxyError=False is_ConnectionError=True is_OSError=True response=Response response_status_code=0"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "missing",
     "header_names": [
      "Host",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "async_http_no_credentials",
   "env": {},
   "command": "python async_http_no_credentials.py",
   "code": "import asyncio\n\nfrom curl_cffi import AsyncSession\nfrom lab_common import *\n\n\nasync def main():\n    async with AsyncSession(proxy=PROXY) as session:\n        show(await session.get(HTTP_URL))\n\n\ntry:\n    asyncio.run(main())\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=407 ok=False url=http://127.0.0.1:8080/ body='' proxy_authenticate='Basic realm=\"lab\"'"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "GET",
     "target": "http://127.0.0.1:8080/",
     "auth": "missing",
     "header_names": [
      "Accept-Encoding",
      "Host",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "async_http_credentials",
   "env": {},
   "command": "python async_http_credentials.py",
   "code": "import asyncio\n\nfrom curl_cffi import AsyncSession\nfrom lab_common import *\n\n\nasync def main():\n    async with AsyncSession(proxy=PROXY_AUTH) as session:\n        show(await session.get(HTTP_URL))\n\n\ntry:\n    asyncio.run(main())\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://127.0.0.1:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "GET",
     "target": "http://127.0.0.1:8080/",
     "auth": "ok",
     "header_names": [
      "Accept-Encoding",
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "async_socks5_hostname",
   "env": {},
   "command": "python async_socks5_hostname.py",
   "code": "import asyncio\n\nfrom curl_cffi import AsyncSession\nfrom lab_common import *\n\n\nasync def main():\n    async with AsyncSession(proxy=SOCKS) as session:\n        show(await session.get(PROBE_HTTP_URL))\n\n\ntry:\n    asyncio.run(main())\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://dnsprobe.example:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [
    "CONNECT atyp=IPv4 dest=127.0.0.2:8080"
   ],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "async_socks5h_hostname",
   "env": {},
   "command": "python async_socks5h_hostname.py",
   "code": "import asyncio\n\nfrom curl_cffi import AsyncSession\nfrom lab_common import *\n\n\nasync def main():\n    async with AsyncSession(proxy=SOCKS_H) as session:\n        show(await session.get(PROBE_HTTP_URL))\n\n\ntry:\n    asyncio.run(main())\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://dnsprobe.example:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [
    "CONNECT atyp=DOMAIN dest=dnsprobe.example:8080"
   ],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "async_socks5_general_failure",
   "env": {},
   "command": "python async_socks5_general_failure.py",
   "code": "import asyncio\n\nfrom curl_cffi import AsyncSession\nfrom lab_common import *\n\n\nasync def main():\n    async with AsyncSession(proxy=SOCKS_FAILING) as session:\n        show(await session.get(HTTP_URL))\n\n\ntry:\n    asyncio.run(main())\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "EXCEPTION curl_cffi.requests.exceptions.ProxyError: Failed to perform, curl: (97) cannot complete SOCKS5 connection to 127.0.0.1. (1). See https://curl.se/libcurl/c/libcurl-errors.html first for more details.",
    "DETAIL code=97 is_ProxyError=True is_ConnectionError=False is_OSError=True response=Response response_status_code=0"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [],
   "failing_socks_log": [
    "CONNECT atyp=IPv4 dest=127.0.0.1:8080"
   ],
   "target_log": []
  },
  {
   "case": "async_https_no_credentials_retry_2",
   "env": {},
   "command": "python async_https_no_credentials_retry_2.py",
   "code": "import asyncio\n\nfrom curl_cffi import AsyncSession\nfrom lab_common import *\n\n\nasync def main():\n    async with AsyncSession(proxy=PROXY, verify=CA, retry=2) as session:\n        show(await session.get(HTTPS_URL))\n\n\ntry:\n    asyncio.run(main())\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "EXCEPTION curl_cffi.requests.exceptions.ConnectionError: Failed to perform, curl: (7) CONNECT tunnel failed, response 407. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.",
    "DETAIL code=7 is_ProxyError=False is_ConnectionError=True is_OSError=True response=Response response_status_code=0"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "missing",
     "header_names": [
      "Host",
      "Proxy-Connection"
     ]
    },
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "missing",
     "header_names": [
      "Host",
      "Proxy-Connection"
     ]
    },
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "missing",
     "header_names": [
      "Host",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "async_env_upper_http_proxy_http_url",
   "env": {
    "HTTP_PROXY": "http://user:pass@127.0.0.1:8888"
   },
   "command": "python async_env_upper_http_proxy_http_url.py",
   "code": "import asyncio\n\nfrom curl_cffi import AsyncSession\nfrom lab_common import *\n\n\nasync def main():\n    async with AsyncSession() as session:\n        show(await session.get(HTTP_URL))\n\n\ntry:\n    asyncio.run(main())\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://127.0.0.1:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "async_env_lower_http_proxy_http_url",
   "env": {
    "http_proxy": "http://user:pass@127.0.0.1:8888"
   },
   "command": "python async_env_lower_http_proxy_http_url.py",
   "code": "import asyncio\n\nfrom curl_cffi import AsyncSession\nfrom lab_common import *\n\n\nasync def main():\n    async with AsyncSession() as session:\n        show(await session.get(HTTP_URL))\n\n\ntry:\n    asyncio.run(main())\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=200 ok=True url=http://127.0.0.1:8080/ body='lab target ok' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "GET",
     "target": "http://127.0.0.1:8080/",
     "auth": "ok",
     "header_names": [
      "Accept-Encoding",
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "https_no_credentials_retry_2",
   "env": {},
   "command": "python https_no_credentials_retry_2.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    with requests.Session(proxy=PROXY, verify=CA, retry=2) as session:\n        show(session.get(HTTPS_URL))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "EXCEPTION curl_cffi.requests.exceptions.ConnectionError: Failed to perform, curl: (7) CONNECT tunnel failed, response 407. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.",
    "DETAIL code=7 is_ProxyError=False is_ConnectionError=True is_OSError=True response=Response response_status_code=0"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "missing",
     "header_names": [
      "Host",
      "Proxy-Connection"
     ]
    },
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "missing",
     "header_names": [
      "Host",
      "Proxy-Connection"
     ]
    },
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "missing",
     "header_names": [
      "Host",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": []
  },
  {
   "case": "post_lost_response",
   "env": {},
   "command": "python post_lost_response.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    show(requests.post(JOBS_URL, data=\"job-default\", proxy=PROXY_AUTH))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "EXCEPTION curl_cffi.requests.exceptions.ConnectionError: Failed to perform, curl: (52) Empty reply from server. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.",
    "DETAIL code=52 is_ProxyError=False is_ConnectionError=True is_OSError=True response=Response response_status_code=0"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "POST",
     "target": "http://127.0.0.1:8081/jobs",
     "auth": "ok",
     "header_names": [
      "Accept-Encoding",
      "Content-Length",
      "Content-Type",
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": [
    {
     "method": "POST",
     "path": "/jobs",
     "body": "job-default",
     "answered": false
    }
   ]
  },
  {
   "case": "post_lost_response_retry_1",
   "env": {},
   "command": "python post_lost_response_retry_1.py",
   "code": "from curl_cffi import requests\nfrom lab_common import *\n\ntry:\n    with requests.Session(proxy=PROXY_AUTH, retry=1) as session:\n        show(session.post(JOBS_URL, data=\"job-retried\"))\nexcept Exception as error:\n    show_error(error)",
   "exit_code": 0,
   "stdout": [
    "RESPONSE status_code=201 ok=True url=http://127.0.0.1:8081/jobs body='created job-retried' proxy_authenticate=None"
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "POST",
     "target": "http://127.0.0.1:8081/jobs",
     "auth": "ok",
     "header_names": [
      "Accept-Encoding",
      "Content-Length",
      "Content-Type",
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    },
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "POST",
     "target": "http://127.0.0.1:8081/jobs",
     "auth": "ok",
     "header_names": [
      "Accept-Encoding",
      "Content-Length",
      "Content-Type",
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [],
   "target_log": [
    {
     "method": "POST",
     "path": "/jobs",
     "body": "job-retried",
     "answered": false
    },
    {
     "method": "POST",
     "path": "/jobs",
     "body": "job-retried",
     "answered": true
    }
   ]
  },
  {
   "case": "handler",
   "env": {},
   "command": "python handler.py",
   "code": "import re\n\nfrom curl_cffi import requests\nfrom curl_cffi.requests.exceptions import ConnectionError, ProxyError\nfrom lab_common import CA, CLOSED_HTTPS_URL, HTTP_URL, HTTPS_URL, PROXY, PROXY_AUTH, PROXY_CLOSED, SOCKS_FAILING\n\nCONNECT_STATUS = re.compile(r\"CONNECT tunnel failed, response (\\d{3})\")\n\n\nclass ProxyFailure(Exception):\n    pass\n\n\ndef fetch(session, url):\n    try:\n        response = session.get(url)\n    except ProxyError as error:\n        raise ProxyFailure(f\"proxy error, curl {error.code}\") from error\n    except ConnectionError as error:\n        rejected = CONNECT_STATUS.search(str(error))\n        if error.code == 7 and rejected:\n            raise ProxyFailure(f\"proxy answered CONNECT with {rejected[1]}\") from error\n        raise\n    if response.status_code == 407:\n        raise ProxyFailure(\"proxy answered 407\")\n    return response\n\n\nfor label, url, proxy in [\n    (\"https, credentials ok\", HTTPS_URL, PROXY_AUTH),\n    (\"https, no credentials\", HTTPS_URL, PROXY),\n    (\"http, no credentials\", HTTP_URL, PROXY),\n    (\"https, target port closed\", CLOSED_HTTPS_URL, PROXY_AUTH),\n    (\"https, SOCKS failure\", HTTPS_URL, SOCKS_FAILING),\n    (\"https, proxy port closed\", HTTPS_URL, PROXY_CLOSED),\n]:\n    try:\n        with requests.Session(impersonate=\"chrome\", proxy=proxy, verify=CA) as session:\n            print(f\"HANDLER {label}: status {fetch(session, url).status_code}\", flush=True)\n    except Exception as error:\n        print(f\"HANDLER {label}: {type(error).__name__}: {error}\", flush=True)",
   "exit_code": 0,
   "stdout": [
    "HANDLER https, credentials ok: status 200",
    "HANDLER https, no credentials: ProxyFailure: proxy answered CONNECT with 407",
    "HANDLER http, no credentials: ProxyFailure: proxy answered 407",
    "HANDLER https, target port closed: ProxyFailure: proxy answered CONNECT with 502",
    "HANDLER https, SOCKS failure: ProxyFailure: proxy error, curl 97",
    "HANDLER https, proxy port closed: ConnectionError: Failed to perform, curl: (7) Failed to connect to 127.0.0.1:8443 over proxy 127.0.0.1 after 0 ms: Could not connect to server. See https://curl.se/libcurl/c/libcurl-errors.html first for more details."
   ],
   "stderr": [],
   "proxy_log": [
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "ok",
     "header_names": [
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    },
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:8443",
     "auth": "missing",
     "header_names": [
      "Host",
      "Proxy-Connection"
     ]
    },
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "GET",
     "target": "http://127.0.0.1:8080/",
     "auth": "missing",
     "header_names": [
      "Accept",
      "Accept-Encoding",
      "Accept-Language",
      "Connection",
      "HTTP2-Settings",
      "Host",
      "Proxy-Connection",
      "Sec-Fetch-Dest",
      "Sec-Fetch-Mode",
      "Sec-Fetch-Site",
      "Sec-Fetch-User",
      "Upgrade",
      "Upgrade-Insecure-Requests",
      "User-Agent",
      "sec-ch-ua",
      "sec-ch-ua-mobile",
      "sec-ch-ua-platform"
     ]
    },
    {
     "proxy_port": 8888,
     "event": "request",
     "method": "CONNECT",
     "target": "127.0.0.1:9",
     "auth": "ok",
     "header_names": [
      "Host",
      "Proxy-Authorization",
      "Proxy-Connection"
     ]
    }
   ],
   "socks_log": [],
   "failing_socks_log": [
    "CONNECT atyp=IPv4 dest=127.0.0.1:8443"
   ],
   "target_log": []
  }
 ]
}
