http.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import os
  2. from json import dumps
  3. from typing import Literal
  4. import httpx
  5. import pytest
  6. from _pytest.monkeypatch import MonkeyPatch
  7. from core.helper import ssrf_proxy
  8. MOCK = os.getenv("MOCK_SWITCH", "false") == "true"
  9. class MockedHttp:
  10. @staticmethod
  11. def httpx_request(
  12. method: Literal["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD"], url: str, **kwargs
  13. ) -> httpx.Response:
  14. """
  15. Mocked httpx.request
  16. """
  17. if url == "http://404.com":
  18. response = httpx.Response(status_code=404, request=httpx.Request(method, url), content=b"Not Found")
  19. return response
  20. # get data, files
  21. data = kwargs.get("data")
  22. files = kwargs.get("files")
  23. json = kwargs.get("json")
  24. content = kwargs.get("content")
  25. if data is not None:
  26. resp = dumps(data).encode("utf-8")
  27. elif files is not None:
  28. resp = dumps(files).encode("utf-8")
  29. elif json is not None:
  30. resp = dumps(json).encode("utf-8")
  31. elif content is not None:
  32. resp = content
  33. else:
  34. resp = b"OK"
  35. response = httpx.Response(
  36. status_code=200, request=httpx.Request(method, url), headers=kwargs.get("headers", {}), content=resp
  37. )
  38. return response
  39. @pytest.fixture
  40. def setup_http_mock(request, monkeypatch: MonkeyPatch):
  41. if not MOCK:
  42. yield
  43. return
  44. monkeypatch.setattr(ssrf_proxy, "make_request", MockedHttp.httpx_request)
  45. yield
  46. monkeypatch.undo()