diff options
author | Maximilian Hils <git@maximilianhils.com> | 2016-05-10 14:03:14 -0600 |
---|---|---|
committer | Maximilian Hils <git@maximilianhils.com> | 2016-05-19 22:07:56 -0700 |
commit | 43c52054241d8743996e8fd5321db93ada37a7b1 (patch) | |
tree | 56142e110c5a14a40b2579a742c4a0d6ce676fb5 /mitmproxy/flow.py | |
parent | 395b11d288c917d4ec2c65d8f9a1562a0b525780 (diff) | |
download | mitmproxy-43c52054241d8743996e8fd5321db93ada37a7b1.tar.gz mitmproxy-43c52054241d8743996e8fd5321db93ada37a7b1.tar.bz2 mitmproxy-43c52054241d8743996e8fd5321db93ada37a7b1.zip |
mimtdump: add basic support for tcp flows
Diffstat (limited to 'mitmproxy/flow.py')
-rw-r--r-- | mitmproxy/flow.py | 61 |
1 files changed, 53 insertions, 8 deletions
diff --git a/mitmproxy/flow.py b/mitmproxy/flow.py index ccedd1d4..1d05d4bb 100644 --- a/mitmproxy/flow.py +++ b/mitmproxy/flow.py @@ -3,7 +3,6 @@ """ from __future__ import absolute_import -import traceback from abc import abstractmethod, ABCMeta import hashlib import sys @@ -18,12 +17,13 @@ from typing import List, Optional, Set from netlib import wsgi, odict from netlib.exceptions import HttpException from netlib.http import Headers, http1, cookies +from netlib.utils import clean_bin from . import controller, tnetstring, filt, script, version, flow_format_compat from .onboarding import app from .proxy.config import HostMatcher from .protocol.http_replay import RequestReplayThread from .exceptions import Kill, FlowReadException -from .models import ClientConnection, ServerConnection, HTTPFlow, HTTPRequest, FLOW_TYPES +from .models import ClientConnection, ServerConnection, HTTPFlow, HTTPRequest, FLOW_TYPES, TCPFlow from collections import defaultdict @@ -900,6 +900,17 @@ class FlowMaster(controller.ServerMaster): self.handle_response(f) if f.error: self.handle_error(f) + elif isinstance(f, TCPFlow): + messages = f.messages + f.messages = [] + f.reply = controller.DummyReply() + self.handle_tcp_open(f) + while messages: + f.messages.append(messages.pop(0)) + self.handle_tcp_message(f) + if f.error: + self.handle_tcp_error(f) + self.handle_tcp_close(f) else: raise NotImplementedError() @@ -1087,18 +1098,52 @@ class FlowMaster(controller.ServerMaster): self.add_event('"{}" reloaded.'.format(s.filename), 'info') return ok - def handle_tcp_message(self, m): - self.run_script_hook("tcp_message", m) - m.reply() + def handle_tcp_open(self, flow): + self.state.add_flow(flow) + self.run_script_hook("tcp_open", flow) + flow.reply() + + def handle_tcp_message(self, flow): + self.run_script_hook("tcp_message", flow) + message = flow.messages[-1] + direction = "->" if message.from_client else "<-" + self.add_event("{client} {direction} tcp {direction} {server}".format( + client=repr(flow.client_conn.address), + server=repr(flow.server_conn.address), + direction=direction, + ), "info") + self.add_event(clean_bin(message.content), "debug") + flow.reply() + + def handle_tcp_error(self, flow): + if self.stream: + self.stream.add(flow) + self.add_event("Error in TCP connection to {}: {}".format( + repr(flow.server_conn.address), + flow.error + ), "info") + self.run_script_hook("tcp_error", flow) + flow.reply() + + def handle_tcp_close(self, flow): + self.state.delete_flow(flow) + if self.stream: + self.stream.add(flow) + self.run_script_hook("tcp_close", flow) + flow.reply() def shutdown(self): super(FlowMaster, self).shutdown() # Add all flows that are still active if self.stream: - for i in self.state.flows: - if not i.response: - self.stream.add(i) + for flow in self.state.flows: + # FIXME: We actually need to keep track of which flows are still active. + if isinstance(flow, HTTPFlow) and not flow.response: + self.stream.add(flow) + if isinstance(flow, TCPFlow): + # (assuming mitmdump only, this must be still active) + self.stream.add(flow) self.stop_stream() self.unload_scripts() |