mitmproxyを使う

http(s)通信の内容を覗くのに、Windowsだと「Fiddler」を使っていたけど、
Macでも覗きたい。
なので、Mac向けのツールを探す。

「Charles」がよさげなのだけど、有料なので30分で動作がとまってしまう。
無料なツールで「mitmproxy」がつかえそう。

1. インストール
ぐぐってインストール

$ mitmproxy --version
Mitmproxy version: 2.0.2 (release version)
Python version: 3.6.3
Platform: Darwin-16.7.0-x86_64-i386-64bit
SSL version: OpenSSL 1.1.0f 25 May 2017
Mac version: 10.12.6 ('', '', '') x86_64

2. 起動
「test_script.py」にpythonスクリプトを書く

$ mitmproxy -s test_script.py

3. スクリプト

# -*- coding: utf-8 -*-
from mitmproxy import http
from mitmproxy import ctx


#################################################
# リクエストの改ざん
def request(flow:http.HTTPFlow):
    # methodを指定
    if flow.request.method == "POST":
        ###
        # APIのアクセス先URLを一部変更する
        if "/api/test/rel" in flow.request.url:
            # URLを置換
            flow.request.url = flow.request.url.replace("/dev","/test")
            ctx.log.info(flow.request.url)

        ###
        # formデータの変更(または追加)
        if "/api/test2/" in flow.request.url:
            # formに存在していれば変更、なければ追加
            flow.request.urlencoded_form["hogehoge"] = "piyo"
    elif flow.request.method == "GET":
        if "/api/test3" in flow.request.url:
            # クエリストリングの書き換え or 追加
            flow.request.query["hogehoge"] = "10"

#################################################
# レスポンスの改ざん
def response(flow: http.HTTPFlow):
    if flow.request.method == "POST":
        if "/api/test4" in flow.request.url:
            flow.response.status_code = 500;
        elif "/api/test5" in flow.request.url:
            flow.response.status_code = 408;
        else:
            flow.response.content = b" " # 空になる