#!/usr/bin/env python """ This example builds on mitmproxy's base proxying infrastructure to implement functionality similar to the "sticky cookies" option. This is at a lower level than the Flow mechanism, so we're dealing directly with request and response objects. """ import os from libmproxy import controller, proxy from libmproxy.proxy.server import ProxyServer class StickyMaster(controller.Master): def __init__(self, server): controller.Master.__init__(self, server) self.stickyhosts = {} def run(self): try: return controller.Master.run(self) except KeyboardInterrupt: self.shutdown() def handle_request(self, msg): hid = (msg.host, msg.port) if msg.headers["cookie"]: self.stickyhosts[hid] = msg.headers["cookie"] elif hid in self.stickyhosts: msg.headers["cookie"] = self.stickyhosts[hid] msg.reply() def handle_response(self, msg): hid = (msg.request.host, msg.request.port) if msg.headers["set-cookie"]: self.stickyhosts[hid] = msg.headers["set-cookie"] msg.reply() config = proxy.ProxyConfig( ca_file = os.path.expanduser("~/.mitmproxy/mitmproxy-ca.pem") ) server = ProxyServer(config, 8080) m = StickyMaster(server) m.run()