def __call__(self, key, path="/", limit=None, time=None, reset=100000):
        with self.lock:
            t = _time.time()
            p = "/" + path.strip("/")
            r = self.cache.get((key, p))   
            # Reset the cache if too large (e.g., 1M+ IP addresses).
            if reset and reset < len(self.cache) and reset > self._rowcount:
                self.reset()
            # Unknown key (apply default limit / time rate).
            if r is None and key is not None and limit is not None and time is not None:
                self.cache[(key, p)] = r = (0, limit, time, t)
            # Unknown key (apply root key, if any).
            if r is None and p != "/":
                self.cache.get((key, "/"))
            if r is None:
                raise RateLimitForbidden
            # Limit reached within time frame (raise error).
            elif r[0] >= r[1] and r[2] > t - r[3]:
                raise RateLimitExceeded
            # Limit reached out of time frame (reset count).
            elif r[0] >= r[1]:
                self.cache[(key, p)] = (1, r[1], r[2], t)
            # Limit not reached (increment count).
            elif r[0] <  r[1]:
                self.cache[(key, p)] = (r[0] + 1, r[1], r[2], r[3])
        #print(self.cache.get((key, path)))

#### ROUTER ########################################################################################
# The @app.route(path) decorator registers each URL path handler in Application.router.
HTML GET handler.
dataset/ETHPy150Open clips/pattern/pattern/server/__init__.py/RateLimit.__call__--crossover with--dataset/ETHPy150Open Sagelt/dungeon-world-codex/handlers/monster.py/ProductCreateHandler.get