| 29 | def CreateFileHandlerClass(root_dirs, verbose): |
| 30 | class FileHandler(SocketServer.BaseRequestHandler): |
| 31 | def handle(self): |
| 32 | data = self.request.recv(1024); |
| 33 | while data[-1] != "\0": |
| 34 | data += self.request.recv(1024); |
| 35 | |
| 36 | filename = data[0:-1] |
| 37 | |
| 38 | try: |
| 39 | filename = os.path.abspath(filename) |
| 40 | |
| 41 | if not any(filename.startswith(root) for root in root_dirs): |
| 42 | raise Exception("{} not in roots {}".format(filename, root_dirs)) |
| 43 | if not os.path.isfile(filename): |
| 44 | raise Exception("{} is not a file".format(filename)) |
| 45 | |
| 46 | if verbose: |
| 47 | sys.stdout.write("Serving {}\r\n".format(os.path.relpath(filename))) |
| 48 | |
| 49 | with open(filename) as f: |
| 50 | contents = f.read(); |
| 51 | self.request.sendall(struct.pack("!i", len(contents))) |
| 52 | self.request.sendall(contents) |
| 53 | |
| 54 | except Exception as e: |
| 55 | if verbose: |
| 56 | sys.stderr.write( |
| 57 | "Request failed ({})\n".format(e).replace('\n','\r\n')) |
| 58 | self.request.sendall(struct.pack("!i", -1)) |
| 59 | |
| 60 | return FileHandler |
| 61 | |