|
# Events 列表: https://docs.mitmproxy.org/stable/api/events.html |
|
# Flow 结构体定义: https://docs.mitmproxy.org/stable/api/mitmproxy/http.html#HTTPFlow |
|
|
|
import json |
|
|
|
|
|
class HTTPLog(object): |
|
def __init__(self): |
|
""" |
|
用来表示一条 http log |
|
""" |
|
|
|
# 自行根据需要来调整下述字段 |
|
self.method: str = "" |
|
self.url: str = "" |
|
self.request_headers = {} |
|
self.request_body: str = "" |
|
|
|
# 可以自行根据定义来扩展下述字段 |
|
self.status_code: int = 0 |
|
self.response_headers = {} |
|
self.response_body: str = "" |
|
|
|
def update_by_request(self, request): |
|
""" |
|
Request 定义: https://docs.mitmproxy.org/stable/api/mitmproxy/http.html#Request |
|
""" |
|
self.method = request.method |
|
self.url = request.url |
|
# https://docs.mitmproxy.org/stable/api/mitmproxy/http.html#Headers.items |
|
self.request_headers = list(request.headers.items(multi=True)) |
|
try: |
|
self.request_body = request.text |
|
except ValueError: |
|
pass |
|
|
|
def update_by_response(self, response): |
|
""" |
|
Response 定义: https://docs.mitmproxy.org/stable/api/mitmproxy/http.html#Response |
|
""" |
|
self.status_code = response.status_code |
|
# https://docs.mitmproxy.org/stable/api/mitmproxy/http.html#Headers.items |
|
self.response_headers = list(response.headers.items(multi=True)) |
|
try: |
|
self.response_body = response.text |
|
except ValueError: |
|
pass |
|
|
|
def update_by_http_flow(self, http_flow): |
|
self.update_by_request(http_flow.request) |
|
self.update_by_response(http_flow.response) |
|
|
|
def to_json(self): |
|
data = { |
|
"method": self.method, |
|
"url": self.url, |
|
"request_headers": self.request_headers, |
|
"request_body": self.request_body |
|
} |
|
if self.status_code != 0: # has response |
|
data.update({ |
|
"has_response": True, |
|
"status_code": self.status_code, |
|
"response_headers": self.response_headers, |
|
"response_body": self.response_body |
|
}) |
|
else: |
|
data.update({ |
|
"has_response": False |
|
}) |
|
return data |
|
|
|
|
|
class APTPLogger(object): |
|
""" |
|
自定义的 mitmproxy Addon, 用于记录请求响应 |
|
""" |
|
|
|
def __init__(self): |
|
# 容器里的路径 |
|
self.log_file = open("/home/mitmproxy/.mitmproxy/test-http.log", "w+b") |
|
|
|
def response(self, flow): |
|
""" |
|
详见: https://docs.mitmproxy.org/stable/api/events.html#HTTPEvents.response |
|
""" |
|
|
|
log = HTTPLog() |
|
log.update_by_http_flow(flow) |
|
self.write_to(log) |
|
|
|
def error(self, flow): |
|
""" |
|
详见: https://docs.mitmproxy.org/stable/api/events.html#HTTPEvents.error |
|
使用该 event 记录 request, 无 response |
|
""" |
|
log = HTTPLog() |
|
log.update_by_request(flow.request) |
|
# no response when error happened |
|
self.write_to(log) |
|
|
|
def write_to(self, log_entry: HTTPLog): |
|
""" |
|
FIXME |
|
这里只是作为一个简单的演示 |
|
可以自行将 log 发往想要的地方 |
|
""" |
|
data = log_entry.to_json() |
|
result = json.dumps(data, ensure_ascii=False, ) |
|
self.log_file.write(result.encode("utf-8", errors="ignore")) |
|
self.log_file.write(b"\n") |
|
self.log_file.flush() |
|
|
|
|
|
addons = [APTPLogger()] |