apitest/util/scripts/recording.py

120 lines
4.1 KiB
Python

# coding:utf-8
"""
@author: 井松
@contact: 529548204@qq.com
@file: recording.py
@time: 2022/1/6 15:41
"""
import os
import yaml
from mitmproxy.http import HTTPFlow
from mitmproxy import ctx
from config.confManage import dir_manage, host_manage
from scripts import root_path
import logging
from scripts.log import Log
from scripts.mkDir import mk_dir
Log()
Host = host_manage("${host_HB}$")
class Counter:
def __init__(self, host):
self.re = {}
self.num = 0
self.path = root_path
self.host = host
def response(self, flow: HTTPFlow):
mk_dir(self.path + dir_manage("${test_suite}$") + dir_manage("${recording_dir}$"))
case = dict()
case["data"] = data = {}
if flow.request.host == self.host.split(":")[0]:
headers = flow.request.headers
u = flow.request.path.split("?")
case["method"] = flow.request.method
if case["method"] == "GET" or case["method"] == "DELETE":
if "Content-Type" in headers.keys():
case["headers"]["Content-Type"] = headers["Content-Type"]
else:
if len(u) > 1:
data["param"] = u[1]
elif case["method"] == "POST" or case["method"] == "PUT":
if "application/json" in headers["Content-Type"]:
data["param"] = flow.request.json()
if "ETag" not in flow.response.headers.keys():
self.re = {}
self.num = self.num + 1
# url根据?截断
name = u[0].replace("/", "_")[1:] + flow.request.method
self.re[name] = detail = {}
detail["name"] = name
detail["token"] = "Authorization"
detail["order"] = self.num
detail["case"] = [case]
detail["file"] = False
case["info"] = name
case["host"] = "host" # 可参数化
case["address"] = u[0]
case["relevance"] = None
case["headers"] = {}
case["headers"] = dict(headers)
data["file"] = None
data["param"] = None
data["urlparam"] = None
case["assert"] = asserting = {}
asserting["jsonpath"] = None
# asserting["jsonpath"] = [{
# "path": "$.code",
# "value": 0,
# "asserttype": "=="
# }]
asserting["sqlassert"] = None
asserting["time"] = 2
asserting["code"] = 200
path = self.path + dir_manage("${test_suite}$") + dir_manage("${recording_dir}$") + "/" + case[
"address"]
if "form-data" not in str(flow.request.content):
self.yaml_cases(path, path + detail[
"name"] + ".yml", self.re)
# print(flow.request.data)
# print(str(flow.request.data.content))
print(self.re)
# if "Content-Type" not in flow.response.headers.keys():
# print(flow.request.method)
# print("====================================================================================")
# return self.re
#
# def response(self, flow: HTTPFlow):
# print(flow.response)
# print(flow.request)
@staticmethod
def yaml_cases(casepath, filename, data):
if not os.path.exists(casepath):
os.makedirs(casepath)
with open(filename, "w", encoding="utf-8") as f:
yaml.dump(data, f)
# f.write()
# yaml.dump(data, f, Dumper=yaml.RoundTripDumper, allow_unicode=True)
# def response(self, flow: HTTPFlow):
# if flow.request.host == "dashboard.finsiot.com":
# print(flow.response.json())
addons = [
Counter(Host)
]
if __name__ == '__main__':
# os.system("mitmdump -p 4444")
os.system("mitmdump -p 4444 -s ./recording.py -q")
# os.system("mitmweb -p 4444 -s ./recording.py -q")
# os.system("")