Пример #1
0
 def cycle(self, master, content):
     f = tflow.tflow(req=tutils.treq(content=content))
     master.addons.handle_lifecycle("clientconnect", f.client_conn)
     for i in eventsequence.iterate(f):
         master.addons.handle_lifecycle(*i)
     master.addons.handle_lifecycle("clientdisconnect", f.client_conn)
     return f
Пример #2
0
    async def load_flow(self, f):
        """
        Loads a flow and links websocket & handshake flows
        """

        if isinstance(f, http.HTTPFlow):
            self._change_reverse_host(f)
            if 'websocket' in f.metadata:
                self.waiting_flows.append(f)

        if isinstance(f, websocket.WebSocketFlow):
            hfs = [
                hf for hf in self.waiting_flows
                if hf.id == f.metadata['websocket_handshake']
            ]
            if hfs:
                hf = hfs[0]
                f.handshake_flow = hf
                self.waiting_flows.remove(hf)
                self._change_reverse_host(f.handshake_flow)
            else:
                # this will fail - but at least it will load the remaining flows
                f.handshake_flow = http.HTTPFlow(None, None)

        f.reply = controller.DummyReply()
        for e, o in eventsequence.iterate(f):
            await self.addons.handle_lifecycle(e, o)
Пример #3
0
 async def cycle(self, master, content):
     f = tflow.tflow(req=tutils.treq(content=content))
     layer = mock.Mock("mitmproxy.proxy.protocol.base.Layer")
     layer.client_conn = f.client_conn
     layer.reply = controller.DummyReply()
     await master.addons.handle_lifecycle("clientconnect", layer)
     for i in eventsequence.iterate(f):
         await master.addons.handle_lifecycle(*i)
     await master.addons.handle_lifecycle("clientdisconnect", layer)
     return f
Пример #4
0
 def cycle(self, addon, f):
     """
         Cycles the flow through the events for the flow. Stops if a reply
         is taken (as in flow interception).
     """
     f.reply._state = "start"
     for evt, arg in eventsequence.iterate(f):
         self.master.addons.invoke_addon(addon, evt, arg)
         if f.reply.state == "taken":
             return
def test_http_flow(resp, err):
    f = tflow.tflow(resp=resp, err=err)
    i = eventsequence.iterate(f)
    assert next(i) == ("requestheaders", f)
    assert next(i) == ("request", f)
    if resp:
        assert next(i) == ("responseheaders", f)
        assert next(i) == ("response", f)
    if err:
        assert next(i) == ("error", f)
Пример #6
0
 def cycle(self, master, content):
     f = tflow.tflow(req=tutils.treq(content=content))
     layer = mock.Mock("mitmproxy.proxy.protocol.base.Layer")
     layer.client_conn = f.client_conn
     layer.reply = controller.DummyReply()
     master.addons.handle_lifecycle("clientconnect", layer)
     for i in eventsequence.iterate(f):
         master.addons.handle_lifecycle(*i)
     master.addons.handle_lifecycle("clientdisconnect", layer)
     return f
Пример #7
0
def test_http_flow(resp, err):
    f = tflow.tflow(resp=resp, err=err)
    i = eventsequence.iterate(f)
    assert isinstance(next(i), layers.http.HttpRequestHeadersHook)
    assert isinstance(next(i), layers.http.HttpRequestHook)
    if resp:
        assert isinstance(next(i), layers.http.HttpResponseHeadersHook)
        assert isinstance(next(i), layers.http.HttpResponseHook)
    if err:
        assert isinstance(next(i), layers.http.HttpErrorHook)
Пример #8
0
def test_http_flow(resp, err):
    f = tflow.tflow(resp=resp, err=err)
    i = eventsequence.iterate(f)
    assert next(i) == ("requestheaders", f)
    assert next(i) == ("request", f)
    if resp:
        assert next(i) == ("responseheaders", f)
        assert next(i) == ("response", f)
    if err:
        assert next(i) == ("error", f)
Пример #9
0
 def run_once(self, command, flows):
     try:
         sc = Script(command)
     except ValueError as e:
         raise ValueError(str(e))
     sc.load_script()
     for f in flows:
         for evt, o in eventsequence.iterate(f):
             sc.run(evt, o)
     sc.done()
     return sc
Пример #10
0
    async def load_flow(self, f):
        """
        Loads a flow
        """

        if isinstance(f, http.HTTPFlow):
            self._change_reverse_host(f)

        f.reply = controller.DummyReply()
        for e in eventsequence.iterate(f):
            await self.addons.handle_lifecycle(e)
Пример #11
0
 def run_once(self, command, flows):
     try:
         sc = Script(command)
     except ValueError as e:
         raise ValueError(str(e))
     sc.load_script()
     for f in flows:
         for evt, o in eventsequence.iterate(f):
             sc.run(evt, o)
     sc.done()
     return sc
Пример #12
0
 async def cycle(self, master, content):
     f = tflow.tflow(req=tutils.treq(content=content))
     layer = mock.Mock("mitmproxy.proxy.protocol.base.Layer")
     layer.client_conn = f.client_conn
     layer.reply = controller.DummyReply()
     await master.addons.handle_lifecycle(
         server_hooks.ClientConnectedHook(layer))
     for e in eventsequence.iterate(f):
         await master.addons.handle_lifecycle(e)
     await master.addons.handle_lifecycle(
         server_hooks.ClientDisconnectedHook(layer))
     return f
Пример #13
0
def test_tcp_flow(err):
    f = tflow.ttcpflow(err=err)
    i = eventsequence.iterate(f)
    assert next(i) == ("tcp_start", f)
    assert len(f.messages) == 0
    assert next(i) == ("tcp_message", f)
    assert len(f.messages) == 1
    assert next(i) == ("tcp_message", f)
    assert len(f.messages) == 2
    if err:
        assert next(i) == ("tcp_error", f)
    assert next(i) == ("tcp_end", f)
Пример #14
0
 def load_flow(self, f):
     """
     Loads a flow
     """
     if isinstance(f, http.HTTPFlow):
         if self.server and self.options.mode == "reverse":
             f.request.host = self.server.config.upstream_server.address[0]
             f.request.port = self.server.config.upstream_server.address[1]
             f.request.scheme = self.server.config.upstream_server.scheme
     f.reply = controller.DummyReply()
     for e, o in eventsequence.iterate(f):
         getattr(self, e)(o)
Пример #15
0
 async def cycle(self, addon, f):
     """
         Cycles the flow through the events for the flow. Stops if the flow
         is intercepted.
     """
     for evt in eventsequence.iterate(f):
         await self.master.addons.invoke_addon(
             addon,
             evt
         )
         if f.intercepted:
             return
Пример #16
0
 def load_flow(self, f):
     """
     Loads a flow
     """
     if isinstance(f, http.HTTPFlow):
         if self.server and self.options.mode.startswith("reverse:"):
             f.request.host = self.server.config.upstream_server.address[0]
             f.request.port = self.server.config.upstream_server.address[1]
             f.request.scheme = self.server.config.upstream_server.scheme
     f.reply = controller.DummyReply()
     for e, o in eventsequence.iterate(f):
         self.addons.handle_lifecycle(e, o)
Пример #17
0
 def cycle(self, addon, f):
     """
         Cycles the flow through the events for the flow. Stops if a reply
         is taken (as in flow interception).
     """
     f.reply._state = "handled"
     for evt, arg in eventsequence.iterate(f):
         h = getattr(addon, evt, None)
         if h:
             h(arg)
             if f.reply.state == "taken":
                 return
Пример #18
0
 def cycle(self, addon, f):
     """
         Cycles the flow through the events for the flow. Stops if a reply
         is taken (as in flow interception).
     """
     f.reply._state = "start"
     for evt, arg in eventsequence.iterate(f):
         h = getattr(addon, evt, None)
         if h:
             h(arg)
             if f.reply.state == "taken":
                 return
Пример #19
0
def test_websocket_flow(err):
    f = tflow.twebsocketflow(err=err)
    i = eventsequence.iterate(f)
    assert next(i) == ("websocket_start", f)
    assert len(f.messages) == 0
    assert next(i) == ("websocket_message", f)
    assert len(f.messages) == 1
    assert next(i) == ("websocket_message", f)
    assert len(f.messages) == 2
    if err:
        assert next(i) == ("websocket_error", f)
    assert next(i) == ("websocket_end", f)
Пример #20
0
 def load_flow(self, f):
     """
     Loads a flow
     """
     if isinstance(f, http.HTTPFlow):
         if self.options.mode.startswith("reverse:"):
             _, upstream_spec = server_spec.parse_with_mode(self.options.mode)
             f.request.host, f.request.port = upstream_spec.address
             f.request.scheme = upstream_spec.scheme
     f.reply = controller.DummyReply()
     for e, o in eventsequence.iterate(f):
         self.addons.handle_lifecycle(e, o)
Пример #21
0
def test_tcp_flow(err):
    f = tflow.ttcpflow(err=err)
    i = eventsequence.iterate(f)
    assert next(i) == ("tcp_start", f)
    assert len(f.messages) == 0
    assert next(i) == ("tcp_message", f)
    assert len(f.messages) == 1
    assert next(i) == ("tcp_message", f)
    assert len(f.messages) == 2
    if err:
        assert next(i) == ("tcp_error", f)
    assert next(i) == ("tcp_end", f)
Пример #22
0
 def load_flow(self, f):
     """
     Loads a flow
     """
     if isinstance(f, http.HTTPFlow):
         if self.options.mode.startswith("reverse:"):
             _, upstream_spec = server_spec.parse_with_mode(self.options.mode)
             f.request.host, f.request.port = upstream_spec.address
             f.request.scheme = upstream_spec.scheme
     f.reply = controller.DummyReply()
     for e, o in eventsequence.iterate(f):
         self.addons.handle_lifecycle(e, o)
Пример #23
0
 def load_flow(self, f):
     """
     Loads a flow
     """
     if isinstance(f, http.HTTPFlow):
         if self.server and self.options.mode.startswith("reverse:"):
             f.request.host = self.server.config.upstream_server.address[0]
             f.request.port = self.server.config.upstream_server.address[1]
             f.request.scheme = self.server.config.upstream_server.scheme
     f.reply = controller.DummyReply()
     for e, o in eventsequence.iterate(f):
         self.addons.handle_lifecycle(e, o)
Пример #24
0
 def load_flow(self, f):
     """
     Loads a flow
     """
     if isinstance(f, http.HTTPFlow):
         if self.server and self.options.mode == "reverse":
             f.request.host = self.server.config.upstream_server.address[0]
             f.request.port = self.server.config.upstream_server.address[1]
             f.request.scheme = self.server.config.upstream_server.scheme
     f.reply = controller.DummyReply()
     for e, o in eventsequence.iterate(f):
         getattr(self, e)(o)
Пример #25
0
def test_tcp_flow(err):
    f = tflow.ttcpflow(err=err)
    i = eventsequence.iterate(f)
    assert isinstance(next(i), layers.tcp.TcpStartHook)
    assert len(f.messages) == 0
    assert isinstance(next(i), layers.tcp.TcpMessageHook)
    assert len(f.messages) == 1
    assert isinstance(next(i), layers.tcp.TcpMessageHook)
    assert len(f.messages) == 2
    if err:
        assert isinstance(next(i), layers.tcp.TcpErrorHook)
    else:
        assert isinstance(next(i), layers.tcp.TcpEndHook)
Пример #26
0
 def script_run(self, flows: typing.Sequence[flow.Flow], path: mtypes.Path) -> None:
     """
         Run a script on the specified flows. The script is loaded with
         default options, and all lifecycle events for each flow are
         simulated.
     """
     try:
         s = Script(path, False)
         for f in flows:
             for evt, arg in eventsequence.iterate(f):
                 ctx.master.addons.invoke_addon(s, evt, arg)
     except exceptions.OptionsError as e:
         script_error_handler(path, e, msg=str(e))
Пример #27
0
 def script_run(self, flows: typing.Sequence[flow.Flow],
                path: mtypes.Path) -> None:
     """
         Run a script on the specified flows. The script is loaded with
         default options, and all lifecycle events for each flow are
         simulated.
     """
     try:
         s = Script(path, False)
         for f in flows:
             for evt, arg in eventsequence.iterate(f):
                 ctx.master.addons.invoke_addon(s, evt, arg)
     except exceptions.OptionsError as e:
         script_error_handler(path, e, msg=str(e))
Пример #28
0
def test_websocket_flow(err):
    f = tflow.twebsocketflow(err=err)
    i = eventsequence.iterate(f)
    assert next(i) == ("websocket_start", f)
    assert len(f.messages) == 0
    assert next(i) == ("websocket_message", f)
    assert len(f.messages) == 1
    assert next(i) == ("websocket_message", f)
    assert len(f.messages) == 2
    assert next(i) == ("websocket_message", f)
    assert len(f.messages) == 3
    if err:
        assert next(i) == ("websocket_error", f)
    assert next(i) == ("websocket_end", f)
Пример #29
0
 def cycle(self, addon, f):
     """
         Cycles the flow through the events for the flow. Stops if a reply
         is taken (as in flow interception).
     """
     f.reply._state = "start"
     for evt, arg in eventsequence.iterate(f):
         self.master.addons.invoke_addon(
             addon,
             evt,
             arg
         )
         if f.reply.state == "taken":
             return
Пример #30
0
def test_websocket_flow(err):
    f = tflow.twebsocketflow(err=err)
    i = eventsequence.iterate(f)
    assert isinstance(next(i), layers.websocket.WebsocketStartHook)
    assert len(f.messages) == 0
    assert isinstance(next(i), layers.websocket.WebsocketMessageHook)
    assert len(f.messages) == 1
    assert isinstance(next(i), layers.websocket.WebsocketMessageHook)
    assert len(f.messages) == 2
    assert isinstance(next(i), layers.websocket.WebsocketMessageHook)
    assert len(f.messages) == 3
    if err:
        assert isinstance(next(i), layers.websocket.WebsocketErrorHook)
    else:
        assert isinstance(next(i), layers.websocket.WebsocketEndHook)
Пример #31
0
    async def load_flow(self, f):
        """
        Loads a flow
        """

        if isinstance(f, http.HTTPFlow):
            if self.options.mode.startswith("reverse:"):
                # When we load flows in reverse proxy mode, we adjust the target host to
                # the reverse proxy destination for all flows we load. This makes it very
                # easy to replay saved flows against a different host.
                _, upstream_spec = server_spec.parse_with_mode(self.options.mode)
                f.request.host, f.request.port = upstream_spec.address
                f.request.scheme = upstream_spec.scheme

        for e in eventsequence.iterate(f):
            await self.addons.handle_lifecycle(e)
Пример #32
0
 def script_run(self, flows: typing.Sequence[flow.Flow], path: str) -> None:
     """
         Run a script on the specified flows. The script is loaded with
         default options, and all lifecycle events for each flow are
         simulated.
     """
     try:
         s = Script(path)
         l = addonmanager.Loader(ctx.master)
         ctx.master.addons.invoke_addon(s, "load", l)
         ctx.master.addons.invoke_addon(s, "configure", ctx.options.keys())
         # Script is loaded on the first tick
         ctx.master.addons.invoke_addon(s, "tick")
         for f in flows:
             for evt, arg in eventsequence.iterate(f):
                 ctx.master.addons.invoke_addon(s, evt, arg)
     except exceptions.OptionsError as e:
         raise exceptions.CommandError("Error running script: %s" % e) from e
Пример #33
0
 def script_run(self, flows: typing.Sequence[flow.Flow], path: str) -> None:
     """
         Run a script on the specified flows. The script is loaded with
         default options, and all lifecycle events for each flow are
         simulated.
     """
     try:
         s = Script(path)
         l = addonmanager.Loader(ctx.master)
         ctx.master.addons.invoke_addon(s, "load", l)
         ctx.master.addons.invoke_addon(s, "configure", ctx.options.keys())
         # Script is loaded on the first tick
         ctx.master.addons.invoke_addon(s, "tick")
         for f in flows:
             for evt, arg in eventsequence.iterate(f):
                 ctx.master.addons.invoke_addon(s, evt, arg)
     except exceptions.OptionsError as e:
         raise exceptions.CommandError("Error running script: %s" % e) from e
Пример #34
0
def test_websocket_flow():
    f = tflow.twebsocketflow()
    i = eventsequence.iterate(f)

    assert isinstance(next(i), layers.http.HttpRequestHeadersHook)
    assert isinstance(next(i), layers.http.HttpRequestHook)
    assert isinstance(next(i), layers.http.HttpResponseHeadersHook)
    assert isinstance(next(i), layers.http.HttpResponseHook)

    assert isinstance(next(i), layers.websocket.WebsocketStartHook)
    assert len(f.websocket.messages) == 0
    assert isinstance(next(i), layers.websocket.WebsocketMessageHook)
    assert len(f.websocket.messages) == 1
    assert isinstance(next(i), layers.websocket.WebsocketMessageHook)
    assert len(f.websocket.messages) == 2
    assert isinstance(next(i), layers.websocket.WebsocketMessageHook)
    assert len(f.websocket.messages) == 3
    assert isinstance(next(i), layers.websocket.WebsocketEndHook)
Пример #35
0
    def load_flow(self, f):
        """
        Loads a flow and links websocket & handshake flows
        """

        if isinstance(f, http.HTTPFlow):
            self._change_reverse_host(f)
            if 'websocket' in f.metadata:
                self.waiting_flows.append(f)

        if isinstance(f, websocket.WebSocketFlow):
            hf = [hf for hf in self.waiting_flows if hf.id == f.metadata['websocket_handshake']][0]
            f.handshake_flow = hf
            self.waiting_flows.remove(hf)
            self._change_reverse_host(f.handshake_flow)

        f.reply = controller.DummyReply()
        for e, o in eventsequence.iterate(f):
            self.addons.handle_lifecycle(e, o)
Пример #36
0
 def script_run(self, flows: typing.Sequence[flow.Flow],
                path: mtypes.Path) -> None:
     """
         Run a script on the specified flows. The script is configured with
         the current options and all lifecycle events for each flow are
         simulated. Note that the load event is not invoked.
     """
     if not os.path.isfile(path):
         ctx.log.error('No such script: %s' % path)
         return
     mod = load_script(path)
     if mod:
         with addonmanager.safecall():
             ctx.master.addons.invoke_addon(mod, "running")
             ctx.master.addons.invoke_addon(mod, "configure",
                                            ctx.options.keys())
             for f in flows:
                 for evt, arg in eventsequence.iterate(f):
                     ctx.master.addons.invoke_addon(mod, evt, arg)
Пример #37
0
    def load_flow(self, f):
        """
        Loads a flow and links websocket & handshake flows
        """

        if isinstance(f, http.HTTPFlow):
            self._change_reverse_host(f)
            if 'websocket' in f.metadata:
                self.waiting_flows.append(f)

        if isinstance(f, websocket.WebSocketFlow):
            hf = [hf for hf in self.waiting_flows if hf.id == f.metadata['websocket_handshake']][0]
            f.handshake_flow = hf
            self.waiting_flows.remove(hf)
            self._change_reverse_host(f.handshake_flow)

        f.reply = controller.DummyReply()
        for e, o in eventsequence.iterate(f):
            self.addons.handle_lifecycle(e, o)
Пример #38
0
 def script_run(self, flows: typing.Sequence[flow.Flow], path: mtypes.Path) -> None:
     """
         Run a script on the specified flows. The script is configured with
         the current options and all lifecycle events for each flow are
         simulated. Note that the load event is not invoked.
     """
     if not os.path.isfile(path):
         ctx.log.error('No such script: %s' % path)
         return
     mod = load_script(path)
     if mod:
         with addonmanager.safecall():
             ctx.master.addons.invoke_addon(mod, "running")
             ctx.master.addons.invoke_addon(
                 mod,
                 "configure",
                 ctx.options.keys()
             )
             for f in flows:
                 for evt, arg in eventsequence.iterate(f):
                     ctx.master.addons.invoke_addon(mod, evt, arg)
Пример #39
0
def test_invalid():
    with pytest.raises(TypeError):
        next(eventsequence.iterate(42))
Пример #40
0
def test_invalid():
    with pytest.raises(TypeError):
        next(eventsequence.iterate(42))