mitmproxy is a free and open source interactive HTTPS proxy. This is a quick reference cheat sheet to the mitmproxy.
| Option | Example | Description | 
|---|---|---|
| -p | mitmproxy -p 8001 | Start proxy on port 8001 | 
| -m | mitmproxy -p 8001 -m reverse:http://127.0.0.1:4000 | Reverse proxy on port 8001 to port 4000 | 
| -w | mitmproxy -p 8001 -w traffic.mitm | Stream flows to file as they arrive | 
| -r | mitmproxy -r traffic.mitm | Read flows from file | 
| -C | mitmproxy -C traffic.mitm | Replay client requests from a saved file | 
| -S | mitmproxy -S traffic.mitm | Replay server responses from a saved file | 
| -s | mitmproxy -s myScript.py | Execute a script | 
| -h | mitmproxy -h | mitmproxy quick help | 
        k                 Ctrl b
        ▲                   ▲▲
        │                   ││
h ◀ ─── + ─── ▶ l           ││ page
        │                   ││
        ▼                   ▼▼
        j             Ctrl f / Space 
| - | - | 
|---|---|
| h,j,k,l | Left, Down, Up, Right | 
| Ctrlb | Page up | 
| Space/Ctrlf | Page down | 
| g/G | Go to beginning / end | 
| Arrows | Up, Down, Left, Right | 
Command Syntax:
:export.clip format flow
Example:
| Description | Command Example | 
|---|---|
| 1. Copy as a curl command | :export.clip curl @focus | 
| 2. Copy as a httpie | :export.clip httpie @focus | 
| 2. Copy as a raw | :export.clip raw @focus | 
| 2. Copy as a raw HTTP request | :export.clip raw_request @focus | 
| 2. Copy as a raw HTTP response | :export.clip raw_response @focus | 
Export a flow to the system clipboard.
Command Syntax:
:export.file format flow path
Example:
| Description | Command Example | 
|---|---|
| 1. Export to /tmp/a.curl | :export.file curl @focus /tmp/a.curl | 
| 2. Export to /tmp/a.httpie | :export.file httpie @focus /tmp/a.httpie | 
| 2. Export to /tmp/a.raw | :export.file raw @focus  /tmp/a.raw | 
| 2. Export to /tmp/a.request | :export.file raw_request @focus /tmp/a.request | 
| 2. Export to /tmp/a.response | :export.file raw_response @focus /tmp/a.response | 
Export a flow to the system clipboard.
| - | - | 
|---|---|
| q | Back / Exit | 
| z | Clear flow list | 
| : | Command prompt | 
| E | View event log | 
| O | View options | 
| r | Replay this flow | 
| Tab | Next | 
| Enter | Select | 
| - | - | 
|---|---|
| - | Cycle to next layout | 
| ? | View help | 
| B | Start an attached browser | 
| C | View commands | 
| I | Toggle intercept | 
| K | View key bindings | 
| P | View flow details | 
| Q | Exit immediately | 
| W | Stream to file | 
| i | Set intercept | 
| Ctrlright | Focus next layout pane | 
| Shifttab | Focus next layout pane | 
| - | - | 
|---|---|
| A | Resume all intercepted flows | 
| D | Duplicate flow | 
| F | Set focus follow | 
| L | Load flows from file | 
| M | Toggle viewing marked flows | 
| S | Start server replay | 
| U | Un-set all marks | 
| V | Revert changes to this flow | 
| X | Kill this flow | 
| Z | Purge all flows not showing | 
| a | Resume this intercepted flow | 
| b | Save response body to file | 
| d | Delete flow from view | 
| e | Export this flow to file | 
| f | Set view filter | 
| m | Toggle mark on this flow | 
| n | Create a new flow | 
| o | Set flow list order | 
| r | Replay this flow | 
| v | Reverse flow list order | 
| w | Save listed flows to file | 
| | | Run a script on this flow | 
| Ctrll | Send cuts to clipboard | 
| - | - | 
|---|---|
| f | Set view filter (on flow view page) | 
The regex are Python-style, it can be specified as quoted strings
| - | - | 
|---|---|
| ! | unary not | 
| & | and | 
| | | or | 
| (...) | grouping | 
| - | - | 
|---|---|
| ~a | Match asset in response: CSS, Javascript, Flash, images. | 
| ~bregex | Body | 
| ~bqregex | Request body | 
| ~bsregex | Response body | 
| ~cint | HTTP response code | 
| ~dregex | Domain | 
| ~dstregex | Match destination address | 
| ~e | Match error | 
| ~hregex | Header | 
| ~hqregex | Request header | 
| ~hsregex | Response header | 
| ~http | Match HTTP flows | 
| ~mregex | Method | 
| ~marked | Match marked flows | 
| ~q | Match request with no response | 
| ~s | Match response | 
| ~srcregex | Match source address | 
| ~tregex | Content-type header | 
| ~tcp | Match TCP flows | 
| ~tqregex | Request Content-Type header | 
| ~tsregex | Response Content-Type header | 
| ~uregex | URL | 
| ~websocket | Match WebSocket flows (and HTTP-WebSocket handshake flows) | 
Expressions
| - | - | 
|---|---|
| @all      | All flows | 
| @focus    | The currently focused flow | 
| @shown    | All flows currently shown | 
| @hidden   | All flows currently hidden | 
| @marked   | All marked flows | 
| @unmarked | All unmarked flows | 
mitmproxy has a set of convenient flow selectors that operate on the current view
URL containing "google.com"
google\.com
Requests whose body contains the string "test"
~q ~b test
Anything but requests with a text/html content type:
!(~q & ~t "text/html")
Replace entire GET string in a request (quotes required to make it work):
":~q ~m GET:.*:/replacement.html"
from mitmproxy import http
def request(flow: http.HTTPFlow) -> None:
    if flow.request.pretty_url == "http://example.com/path":
        flow.response = http.HTTPResponse.make(
            200,  # (optional) status code
            b"Hello World",  # (optional) content
            {"Content-Type": "text/html"}  # (optional) headers
        )
Send a reply from the proxy without sending any data to the remote server
class AddHeader:
    def __init__(self):
        self.num = 0
    def response(self, flow):
        self.num = self.num + 1
        flow.response.headers["count"] = str(self.num)
addons = [
    AddHeader()
]
Add an HTTP header to each response