check_frontend.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. """Serve isolated browser regression checks without the API, model or user data.
  2. Run `python scripts/check_frontend.py`, then open http://127.0.0.1:8081.
  3. Only a temporary copy of frontend assets is exposed. Ctrl+C stops the server.
  4. """
  5. from functools import partial
  6. from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer
  7. from pathlib import Path
  8. from tempfile import TemporaryDirectory
  9. import json
  10. import shutil
  11. ROOT = Path(__file__).resolve().parents[1]
  12. SAMPLE = '''# Markdown 标题
  13. 这是 **加粗**、*斜体*、~~删除线~~ 和 `inline code`。
  14. - 第一项
  15. - 嵌套项
  16. - [x] 已完成
  17. > 引用内容
  18. | 项目 | 数值 |
  19. | --- | ---: |
  20. | 风量 | 120 |
  21. ```python
  22. def greet():
  23. print("<hello>")
  24. ```
  25. [文档](https://example.com)
  26. '''
  27. HOSTILE = '<img src="x" onerror="window.__xss=1"><script>window.__xss=1</script><svg onload="window.__xss=1"></svg><style>body{display:none}</style>[bad](javascript:alert%281%29)<iframe srcdoc="bad"></iframe>'
  28. class Handler(SimpleHTTPRequestHandler):
  29. def do_GET(self):
  30. if self.path.startswith('/api/'):
  31. if self.path.startswith('/api/chat/interrupt'):
  32. self.send_response(204)
  33. self.end_headers()
  34. return
  35. if self.path.startswith('/api/chat/history/'):
  36. payload={'items':[{'id':'markdown-1','msg_role':'assistant','content':SAMPLE},
  37. {'id':'markdown-2','msg_role':'assistant','content':HOSTILE}],'agent_name':'main'}
  38. elif self.path.startswith('/api/sessions'):
  39. payload={'items':[{'id':'markdown-history','title':'Markdown历史测试','mode':'full'}]}
  40. elif self.path.startswith('/api/business-agents'):
  41. payload={'items':[{'name':'main_fan','display_name':'矿井主通风机研判智能体'}]}
  42. else:
  43. payload={'model':'test','items':[],'agents':[],'assets':[]}
  44. body = json.dumps(payload,ensure_ascii=False).encode()
  45. self.send_response(200)
  46. self.send_header('Content-Type', 'application/json')
  47. self.end_headers()
  48. self.wfile.write(body)
  49. else:
  50. super().do_GET()
  51. if __name__ == '__main__':
  52. with TemporaryDirectory(prefix='deep-agent-frontend-') as directory:
  53. shutil.copytree(ROOT / 'static', Path(directory) / 'static')
  54. shutil.copyfile(ROOT / 'tests/frontend_markdown.html', Path(directory) / 'index.html')
  55. server = ThreadingHTTPServer(('127.0.0.1', 8081), partial(Handler, directory=directory))
  56. print('Frontend checks: http://127.0.0.1:8081', flush=True)
  57. try:
  58. server.serve_forever()
  59. except KeyboardInterrupt:
  60. pass
  61. finally:
  62. server.server_close()