| 15 | |
| 16 | |
| 17 | class JavaAgentHandler(socketserver.BaseRequestHandler): |
| 18 | |
| 19 | def read_bytes(self, n): |
| 20 | r = b'' |
| 21 | while len(r) < n: |
| 22 | r += self.request.recv(n - len(r)) |
| 23 | return r |
| 24 | |
| 25 | def read_string(self): |
| 26 | length, = struct.unpack(">H", self.read_bytes(2)) |
| 27 | return self.request.recv(length).decode('utf-8') |
| 28 | |
| 29 | def read_entry(self): |
| 30 | return self.read_string(), self.read_string() |
| 31 | |
| 32 | def handle(self): |
| 33 | key = self.read_string() |
| 34 | |
| 35 | if not compare_digest(key, self.server.key): |
| 36 | logging.warning("Client provided wrong key") |
| 37 | self.request.close() |
| 38 | return |
| 39 | |
| 40 | while True: |
| 41 | r = self.read_bytes(4) |
| 42 | nentries, = struct.unpack('>I', r) |
| 43 | rdata = dict() |
| 44 | for i in range(nentries): |
| 45 | k, v = self.read_entry() |
| 46 | rdata[k] = v |
| 47 | |
| 48 | # emulate conn entry, no nested array support |
| 49 | rdata['conn'] = { |
| 50 | 'l': {'ip': rdata['localAddr'], 'port': int(rdata['localPort'])}, |
| 51 | 'r': {'ip': rdata['remoteAddr'], 'port': int(rdata['remotePort'])} |
| 52 | } |
| 53 | logging.debug('Received request from Java agent: %s', rdata) |
| 54 | |
| 55 | def rhandle(data): |
| 56 | logging.debug('Sending response to Java agent: %s', data) |
| 57 | p = struct.pack('>I', len(data)) |
| 58 | for k, v in data.items(): |
| 59 | ke = str(k).encode('utf-8') |
| 60 | ve = str(v).encode('utf-8') |
| 61 | p += struct.pack('>H', len(ke)) + ke |
| 62 | p += struct.pack('>H', len(ve)) + ve |
| 63 | self.request.sendall(p) |
| 64 | |
| 65 | self.server.handler(rdata, rhandle) |
| 66 | |
| 67 | |
| 68 | class JavaAgentServer(socketserver.ThreadingMixIn, socketserver.TCPServer): |
nothing calls this directly
no outgoing calls
no test coverage detected