aboutsummaryrefslogtreecommitdiffstats
path: root/libpathod/log.py
blob: 67898dd189f7c9391cb84920cb24332d21911bd2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import netlib.utils
import netlib.tcp
import netlib.http


class Log:
    def __init__(self, fp, hex, rfile, wfile):
        self.lines = []
        self.fp = fp
        self.suppressed = False
        self.hex = hex
        self.rfile, self.wfile = rfile, wfile

    def __enter__(self):
        if self.wfile:
            self.wfile.start_log()
        if self.rfile:
            self.rfile.start_log()
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        wlog = self.wfile.get_log() if self.wfile else None
        rlog = self.rfile.get_log() if self.rfile else None
        if self.suppressed or not self.fp:
            return
        if wlog:
            self("Bytes written:")
            self.dump(wlog, self.hex)
        if rlog:
            self("Bytes read:")
            self.dump(rlog, self.hex)
        if exc_type == netlib.tcp.NetLibTimeout:
            self("Timeout")
        elif exc_type in (
            netlib.tcp.NetLibDisconnect,
            netlib.http.HttpErrorConnClosed
        ):
            self("Disconnected")
        elif exc_type == netlib.http.HttpError:
            self("HTTP Error: %s" % exc_value.message)
        self.fp.write("\n".join(self.lines))
        self.fp.write("\n")
        self.fp.flush()

    def suppress(self):
        self.suppressed = True

    def dump(self, data, hexdump):
        if hexdump:
            for line in netlib.utils.hexdump(data):
                self("\t%s %s %s" % line)
        else:
            for i in netlib.utils.cleanBin(data).split("\n"):
                self("\t%s" % i)

    def __call__(self, line):
        self.lines.append(line)