atagen

matrix-rust-sdk

public
Star0
Watch0
ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk.git

Blame: contrib/mitmproxy/failures.py

7ff8adafe9e4atagen2026-10-22 12:30 UTC1
"""
7ff8adafe9e4atagen2026-10-22 12:30 UTC2
A mitmproxy script that introduces certain request failures in a deterministic
7ff8adafe9e4atagen2026-10-22 12:30 UTC3
way.
7ff8adafe9e4atagen2026-10-22 12:30 UTC4
7ff8adafe9e4atagen2026-10-22 12:30 UTC5
Used mainly for Matrix style requests.
7ff8adafe9e4atagen2026-10-22 12:30 UTC6
7ff8adafe9e4atagen2026-10-22 12:30 UTC7
To run execute it with mitmproxy:
7ff8adafe9e4atagen2026-10-22 12:30 UTC8
7ff8adafe9e4atagen2026-10-22 12:30 UTC9
    >>> mitmproxy -s failures.py`
7ff8adafe9e4atagen2026-10-22 12:30 UTC10
7ff8adafe9e4atagen2026-10-22 12:30 UTC11
"""
7ff8adafe9e4atagen2026-10-22 12:30 UTC12
import time
7ff8adafe9e4atagen2026-10-22 12:30 UTC13
import json
7ff8adafe9e4atagen2026-10-22 12:30 UTC14
import random
7ff8adafe9e4atagen2026-10-22 12:30 UTC15
7ff8adafe9e4atagen2026-10-22 12:30 UTC16
from mitmproxy import http
7ff8adafe9e4atagen2026-10-22 12:30 UTC17
from mitmproxy.script import concurrent
7ff8adafe9e4atagen2026-10-22 12:30 UTC18
7ff8adafe9e4atagen2026-10-22 12:30 UTC19
REQUEST_COUNT = 0
7ff8adafe9e4atagen2026-10-22 12:30 UTC20
7ff8adafe9e4atagen2026-10-22 12:30 UTC21
7ff8adafe9e4atagen2026-10-22 12:30 UTC22
def timeout(flow):
7ff8adafe9e4atagen2026-10-22 12:30 UTC23
    timeout = 60 if "sync" in flow.request.pretty_url else 30
7ff8adafe9e4atagen2026-10-22 12:30 UTC24
    time.sleep(timeout)
7ff8adafe9e4atagen2026-10-22 12:30 UTC25
    return None
7ff8adafe9e4atagen2026-10-22 12:30 UTC26
7ff8adafe9e4atagen2026-10-22 12:30 UTC27
7ff8adafe9e4atagen2026-10-22 12:30 UTC28
# A map holding our failure modes.
7ff8adafe9e4atagen2026-10-22 12:30 UTC29
# The keys are just descriptive names for the failure mode while the values
7ff8adafe9e4atagen2026-10-22 12:30 UTC30
# hold a tuple containing a function that may or may not create a failure and
7ff8adafe9e4atagen2026-10-22 12:30 UTC31
# the probability weight at which rate this failure should be triggered.
7ff8adafe9e4atagen2026-10-22 12:30 UTC32
#
7ff8adafe9e4atagen2026-10-22 12:30 UTC33
# The method should return an http.Response if it should modify the
7ff8adafe9e4atagen2026-10-22 12:30 UTC34
# response or None if the response should be passed as is.
7ff8adafe9e4atagen2026-10-22 12:30 UTC35
FAILURES = {
7ff8adafe9e4atagen2026-10-22 12:30 UTC36
    "Success": (lambda x: None, 50),
7ff8adafe9e4atagen2026-10-22 12:30 UTC37
    "Gateway error":
7ff8adafe9e4atagen2026-10-22 12:30 UTC38
    (lambda _: http.Response.make(500, b"Gateway error"), 20),
7ff8adafe9e4atagen2026-10-22 12:30 UTC39
    "Limit exceeded": (lambda _: http.Response.make(
7ff8adafe9e4atagen2026-10-22 12:30 UTC40
        429,
7ff8adafe9e4atagen2026-10-22 12:30 UTC41
        json.dumps({
7ff8adafe9e4atagen2026-10-22 12:30 UTC42
            "errcode": "M_LIMIT_EXCEEDED",
7ff8adafe9e4atagen2026-10-22 12:30 UTC43
            "error": "Too many requests",
7ff8adafe9e4atagen2026-10-22 12:30 UTC44
            "retry_after_ms": 2000
7ff8adafe9e4atagen2026-10-22 12:30 UTC45
        })), 20),
7ff8adafe9e4atagen2026-10-22 12:30 UTC46
    "Timeout error": (timeout, 10)
7ff8adafe9e4atagen2026-10-22 12:30 UTC47
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC48
7ff8adafe9e4atagen2026-10-22 12:30 UTC49
7ff8adafe9e4atagen2026-10-22 12:30 UTC50
@concurrent
7ff8adafe9e4atagen2026-10-22 12:30 UTC51
def request(flow):
7ff8adafe9e4atagen2026-10-22 12:30 UTC52
    global FAILURES
7ff8adafe9e4atagen2026-10-22 12:30 UTC53
7ff8adafe9e4atagen2026-10-22 12:30 UTC54
    weights = [weight for (_, weight) in FAILURES.values()]
7ff8adafe9e4atagen2026-10-22 12:30 UTC55
    failure = random.choices(list(FAILURES), weights=weights)[0]
7ff8adafe9e4atagen2026-10-22 12:30 UTC56
    failure_func, _ = FAILURES[failure]
7ff8adafe9e4atagen2026-10-22 12:30 UTC57
7ff8adafe9e4atagen2026-10-22 12:30 UTC58
    response = failure_func(flow)
7ff8adafe9e4atagen2026-10-22 12:30 UTC59
7ff8adafe9e4atagen2026-10-22 12:30 UTC60
    if response:
7ff8adafe9e4atagen2026-10-22 12:30 UTC61
        flow.response = response