python: Fixed exception masking bug in ashd-wsgi.
[ashd.git] / python3 / ashd / perf.py
1 import collections
2 try:
3     import pdm.perf
4 except:
5     pdm = None
6
7 reqstat = {}
8
9 if pdm:
10     statistics = pdm.perf.staticdir()
11     statistics["req"] = pdm.perf.valueattr(reqstat)
12     requests = pdm.perf.eventobj()
13
14     class reqstart(pdm.perf.startevent):
15         def __init__(self, env):
16             super(reqstart, self).__init__()
17             self.method = env.get("REQUEST_METHOD")
18             self.uri = env.get("REQUEST_URI")
19             self.host = env.get("HTTP_HOST")
20
21     class reqfinish(pdm.perf.finishevent):
22         def __init__(self, start, aborted, status):
23             super(reqfinish, self).__init__(start, aborted)
24             self.status = status
25
26 class request(object):
27     def __init__(self, env):
28         self.resp = None
29         if pdm:
30             self.startev = reqstart(env)
31             requests.notify(self.startev)
32
33     def response(self, resp):
34         self.resp = resp
35
36     def finish(self, aborted):
37         key = None
38         status = None
39         try:
40             if len(self.resp) > 0:
41                 status = self.resp[0]
42                 if isinstance(status, collections.ByteString):
43                     status = status.decode("latin-1")
44                 else:
45                     status = str(status)
46                 p = status.find(" ")
47                 if p < 0:
48                     key = status
49                 else:
50                     key = status[:p]
51         except:
52             pass
53         reqstat[key] = reqstat.setdefault(key, 0) + 1
54         if pdm:
55             requests.notify(reqfinish(self.startev, aborted, status))
56
57     def __enter__(self):
58         return self
59     
60     def __exit__(self, *excinfo):
61         self.finish(bool(excinfo[0]))
62         return False