hyb
2025-12-23 7e5db3a16b423ec4a43459805e277979bcac7db5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# -*- coding: utf-8 -*-
"""
@File    : record.py
@Time    : 2023/9/7 19:10
@Author  : geekbing
@LastEditTime : -
@LastEditors : -
@Description : 流量录制->生成case功能
"""
import json
import re
 
from backend.utils.redis_manager import RedisHelper
from apps.schema.request import RequestInfo
 
 
class Recorder:
    def request(self, flow):
        flow.request.headers["X-Forwarded-For"] = flow.client_conn.address[0]
 
    async def response(self, flow):
        if (
            "47.119.28.171" in flow.request.url
            or flow.request.method.lower() == "options"
            or flow.request.url.endswith(("js", "css", "ttf", "jpg", "svg", "gif"))
        ):
            # 如果是options请求,js等url直接拒绝
            return
        addr = flow.client_conn.address[0]
        record = RedisHelper.get_address_record(addr)
        if not record:
            return
        data = json.loads(record)
        user_id = data.get("user_id", "")
        pattern = re.compile(data.get("regex"))
        if re.findall(pattern, flow.request.url):
            # 说明已开启录制开关,记录状态
            request_data = RequestInfo(flow)
            dump_data = request_data.dumps()
            await RedisHelper.cache_record(user_id=user_id, request=dump_data)
            # TODO: 下个版本需要加入ws协议的支持