Skip to content

Commit 009c546

Browse files
authored
Pook is now compatible with modern Python versions (#211)
* Removing Python version check for `pook` and refactor.
1 parent cdd2eb8 commit 009c546

7 files changed

+124
-123
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ install-dev-requirements:
44
pip install -U pip hatch
55

66
install-test-requirements:
7-
pip install .[test]
7+
pip install -U .[test]
88

99
services-up:
1010
docker-compose up -d

mocket/mockhttp.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,13 +160,14 @@ class Entry(MocketEntry):
160160
def __init__(self, uri, method, responses, match_querystring=True):
161161
uri = urlsplit(uri)
162162

163-
if not uri.port:
163+
port = uri.port
164+
if not port:
164165
if uri.scheme == "https":
165166
port = 443
166167
else:
167168
port = 80
168169

169-
super(Entry, self).__init__((uri.hostname, uri.port or port), responses)
170+
super(Entry, self).__init__((uri.hostname, port), responses)
170171
self.schema = uri.scheme
171172
self.path = uri.path
172173
self.query = uri.query

mocket/plugins/pook_mock_engine.py

Lines changed: 80 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,80 @@
1-
import platform
2-
3-
if not platform.python_version().startswith("3.11."):
4-
# it looks like `pook` is not compatible with Python 3.11
5-
from pook.engine import MockEngine
6-
from pook.interceptors.base import BaseInterceptor
7-
8-
from mocket.mocket import Mocket
9-
from mocket.mockhttp import Entry, Response
10-
11-
class MocketPookEntry(Entry):
12-
pook_request = None
13-
pook_engine = None
14-
15-
def can_handle(self, data):
16-
can_handle = super(MocketPookEntry, self).can_handle(data)
17-
18-
if can_handle:
19-
self.pook_engine.match(self.pook_request)
20-
return can_handle
21-
22-
@classmethod
23-
def single_register(
24-
cls, method, uri, body="", status=200, headers=None, match_querystring=True
25-
):
26-
entry = cls(
27-
uri,
28-
method,
29-
Response(body=body, status=status, headers=headers),
30-
match_querystring=match_querystring,
31-
)
32-
Mocket.register(entry)
33-
return entry
34-
35-
class MocketInterceptor(BaseInterceptor):
36-
@staticmethod
37-
def activate():
38-
Mocket.disable()
39-
Mocket.enable()
40-
41-
@staticmethod
42-
def disable():
43-
Mocket.disable()
44-
45-
class MocketEngine(MockEngine):
46-
def __init__(self, engine):
47-
def mocket_mock_fun(*args, **kwargs):
48-
mock = self.pook_mock_fun(*args, **kwargs)
49-
50-
request = mock._request
51-
method = request.method
52-
url = request.rawurl
53-
54-
response = mock._response
55-
body = response._body
56-
status = response._status
57-
headers = response._headers
58-
59-
entry = MocketPookEntry.single_register(
60-
method, url, body, status, headers
61-
)
62-
entry.pook_engine = self.engine
63-
entry.pook_request = request
64-
65-
return mock
66-
67-
# Store plugins engine
68-
self.engine = engine
69-
# Store HTTP client interceptors
70-
self.interceptors = []
71-
# Self-register MocketInterceptor
72-
self.add_interceptor(MocketInterceptor)
73-
74-
# mocking pook.mock()
75-
self.pook_mock_fun = self.engine.mock
76-
self.engine.mock = mocket_mock_fun
1+
from pook.engine import MockEngine
2+
from pook.interceptors.base import BaseInterceptor
3+
4+
from mocket.mocket import Mocket
5+
from mocket.mockhttp import Entry, Response
6+
7+
8+
class MocketPookEntry(Entry):
9+
pook_request = None
10+
pook_engine = None
11+
12+
def can_handle(self, data):
13+
can_handle = super(MocketPookEntry, self).can_handle(data)
14+
15+
if can_handle:
16+
self.pook_engine.match(self.pook_request)
17+
return can_handle
18+
19+
@classmethod
20+
def single_register(
21+
cls,
22+
method,
23+
uri,
24+
body="",
25+
status=200,
26+
headers=None,
27+
match_querystring=True,
28+
exception=None,
29+
):
30+
entry = cls(
31+
uri,
32+
method,
33+
[Response(body=body, status=status, headers=headers)],
34+
match_querystring=match_querystring,
35+
)
36+
Mocket.register(entry)
37+
return entry
38+
39+
40+
class MocketInterceptor(BaseInterceptor):
41+
@staticmethod
42+
def activate():
43+
Mocket.disable()
44+
Mocket.enable()
45+
46+
@staticmethod
47+
def disable():
48+
Mocket.disable()
49+
50+
51+
class MocketEngine(MockEngine):
52+
def __init__(self, engine):
53+
def mocket_mock_fun(*args, **kwargs):
54+
mock = self.pook_mock_fun(*args, **kwargs)
55+
56+
request = mock._request
57+
method = request.method
58+
url = request.rawurl
59+
60+
response = mock._response
61+
body = response._body
62+
status = response._status
63+
headers = response._headers
64+
65+
entry = MocketPookEntry.single_register(method, url, body, status, headers)
66+
entry.pook_engine = self.engine
67+
entry.pook_request = request
68+
69+
return mock
70+
71+
# Store plugins engine
72+
self.engine = engine
73+
# Store HTTP client interceptors
74+
self.interceptors = []
75+
# Self-register MocketInterceptor
76+
self.add_interceptor(MocketInterceptor)
77+
78+
# mocking pook.mock()
79+
self.pook_mock_fun = self.engine.mock
80+
self.engine.mock = mocket_mock_fun

tests/main/test_pook.py

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,29 @@
1-
import platform
1+
import pook
2+
import requests
23

3-
if not platform.python_version().startswith("3.11."):
4-
# it looks like `pook` is not compatible with Python 3.11
5-
import pook
6-
import requests
4+
from mocket.plugins.pook_mock_engine import MocketEngine
75

8-
from mocket.plugins.pook_mock_engine import MocketEngine
6+
pook.set_mock_engine(MocketEngine)
97

10-
pook.set_mock_engine(MocketEngine)
118

12-
@pook.on
13-
def test_pook_engine():
9+
@pook.on
10+
def test_pook_engine():
11+
url = "http://twitter.com/api/1/foobar"
12+
status = 404
13+
response_json = {"error": "foo"}
1414

15-
url = "http://twitter.com/api/1/foobar"
16-
status = 404
17-
response_json = {"error": "foo"}
15+
mock = pook.get(
16+
url,
17+
headers={"content-type": "application/json"},
18+
reply=status,
19+
response_json=response_json,
20+
)
21+
mock.persist()
1822

19-
mock = pook.get(
20-
url,
21-
headers={"content-type": "application/json"},
22-
reply=status,
23-
response_json=response_json,
24-
)
25-
mock.persist()
23+
requests.get(url)
24+
assert mock.calls == 1
2625

27-
requests.get(url)
28-
assert mock.calls == 1
29-
30-
resp = requests.get(url)
31-
assert resp.status_code == status
32-
assert resp.json() == response_json
33-
assert mock.calls == 2
26+
resp = requests.get(url)
27+
assert resp.status_code == status
28+
assert resp.json() == response_json
29+
assert mock.calls == 2

tests/main/tests.main.test_http.HttpEntryTestCase.test_truesendall_with_dump_from_recording.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
{
22
"httpbin.local": {
33
"80": {
4-
"03bc7d1e37b2615ce150043ddae0066d": {
5-
"request": "GET /ip HTTP/1.1\r\nHost: httpbin.local\r\nuser-agent: Fake-User-Agent\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\n\r\n",
6-
"response": "48 54 54 50 2F 31 2E 31 20 32 30 30 20 4F 4B 0D 0A 58 2D 50 6F 77 65 72 65 64 2D 42 79 3A 20 45 78 70 72 65 73 73 0D 0A 73 65 72 76 65 72 3A 20 67 75 6E 69 63 6F 72 6E 2F 31 39 2E 39 2E 30 0D 0A 64 61 74 65 3A 20 53 61 74 2C 20 31 37 20 44 65 63 20 32 30 32 32 20 31 34 3A 31 31 3A 31 37 20 47 4D 54 0D 0A 63 6F 6E 6E 65 63 74 69 6F 6E 3A 20 6B 65 65 70 2D 61 6C 69 76 65 0D 0A 63 6F 6E 74 65 6E 74 2D 74 79 70 65 3A 20 61 70 70 6C 69 63 61 74 69 6F 6E 2F 6A 73 6F 6E 0D 0A 63 6F 6E 74 65 6E 74 2D 6C 65 6E 67 74 68 3A 20 32 39 0D 0A 61 63 63 65 73 73 2D 63 6F 6E 74 72 6F 6C 2D 61 6C 6C 6F 77 2D 6F 72 69 67 69 6E 3A 20 2A 0D 0A 61 63 63 65 73 73 2D 63 6F 6E 74 72 6F 6C 2D 61 6C 6C 6F 77 2D 63 72 65 64 65 6E 74 69 61 6C 73 3A 20 74 72 75 65 0D 0A 0D 0A 7B 0A 20 20 22 6F 72 69 67 69 6E 22 3A 20 22 31 37 32 2E 32 31 2E 30 2E 33 22 0A 7D 0A"
4+
"0b717b72090e760066708581e9024a2e": {
5+
"request": "GET /gzip HTTP/1.1\r\nHost: httpbin.local\r\nuser-agent: Fake-User-Agent\r\nAccept-Encoding: gzip, deflate, zstd\r\nAccept: */*\r\nConnection: keep-alive\r\n\r\n",
6+
"response": "48 54 54 50 2F 31 2E 31 20 32 30 30 20 4F 4B 0D 0A 58 2D 50 6F 77 65 72 65 64 2D 42 79 3A 20 45 78 70 72 65 73 73 0D 0A 73 65 72 76 65 72 3A 20 67 75 6E 69 63 6F 72 6E 2F 31 39 2E 39 2E 30 0D 0A 64 61 74 65 3A 20 53 75 6E 2C 20 32 34 20 44 65 63 20 32 30 32 33 20 31 39 3A 35 35 3A 35 32 20 47 4D 54 0D 0A 63 6F 6E 6E 65 63 74 69 6F 6E 3A 20 6B 65 65 70 2D 61 6C 69 76 65 0D 0A 63 6F 6E 74 65 6E 74 2D 74 79 70 65 3A 20 61 70 70 6C 69 63 61 74 69 6F 6E 2F 6A 73 6F 6E 0D 0A 63 6F 6E 74 65 6E 74 2D 6C 65 6E 67 74 68 3A 20 31 38 39 0D 0A 63 6F 6E 74 65 6E 74 2D 65 6E 63 6F 64 69 6E 67 3A 20 67 7A 69 70 0D 0A 61 63 63 65 73 73 2D 63 6F 6E 74 72 6F 6C 2D 61 6C 6C 6F 77 2D 6F 72 69 67 69 6E 3A 20 2A 0D 0A 61 63 63 65 73 73 2D 63 6F 6E 74 72 6F 6C 2D 61 6C 6C 6F 77 2D 63 72 65 64 65 6E 74 69 61 6C 73 3A 20 74 72 75 65 0D 0A 0D 0A 1F 8B 08 00 C8 8C 88 65 02 FF 4D 8F 4D 0E C2 20 10 46 F7 3D 05 61 D9 B4 A8 6C 4C DC 35 A6 EA 01 F4 00 08 23 25 45 20 ED E8 A2 4D EF 2E D0 A4 71 F9 BD 79 F3 37 17 84 50 3D 99 10 40 D1 13 C1 E1 03 15 49 AC 03 A1 60 18 23 9B 63 8C A0 91 12 02 C6 4C CB 5D 49 B3 B4 D1 BA 75 D2 2B E3 74 2A A7 69 15 51 F0 B2 02 E3 B0 69 44 B5 E9 67 EF 1C 48 34 DE 25 B3 07 08 B5 B0 E6 0B 9B 70 F3 63 DE D1 21 86 A7 71 CC 7A 29 EC 56 7D 8C 30 D4 8D 06 97 9D 8B E8 A1 FE 43 D1 59 D6 E3 DF 80 9D 4F FF D0 6B 7B 5F BB A9 1F 8C 36 79 ED E1 C8 19 E7 6C CF 38 2D 96 E2 07 90 26 B9 E3 02 01 00 00"
77
},
8-
"70109c06d1c4e826d2899eb7fe343854": {
9-
"request": "GET /gzip HTTP/1.1\r\nHost: httpbin.local\r\nuser-agent: Fake-User-Agent\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\n\r\n",
10-
"response": "48 54 54 50 2F 31 2E 31 20 32 30 30 20 4F 4B 0D 0A 58 2D 50 6F 77 65 72 65 64 2D 42 79 3A 20 45 78 70 72 65 73 73 0D 0A 73 65 72 76 65 72 3A 20 67 75 6E 69 63 6F 72 6E 2F 31 39 2E 39 2E 30 0D 0A 64 61 74 65 3A 20 53 61 74 2C 20 31 37 20 44 65 63 20 32 30 32 32 20 31 34 3A 31 31 3A 31 37 20 47 4D 54 0D 0A 63 6F 6E 6E 65 63 74 69 6F 6E 3A 20 6B 65 65 70 2D 61 6C 69 76 65 0D 0A 63 6F 6E 74 65 6E 74 2D 74 79 70 65 3A 20 61 70 70 6C 69 63 61 74 69 6F 6E 2F 6A 73 6F 6E 0D 0A 63 6F 6E 74 65 6E 74 2D 6C 65 6E 67 74 68 3A 20 31 38 36 0D 0A 63 6F 6E 74 65 6E 74 2D 65 6E 63 6F 64 69 6E 67 3A 20 67 7A 69 70 0D 0A 61 63 63 65 73 73 2D 63 6F 6E 74 72 6F 6C 2D 61 6C 6C 6F 77 2D 6F 72 69 67 69 6E 3A 20 2A 0D 0A 61 63 63 65 73 73 2D 63 6F 6E 74 72 6F 6C 2D 61 6C 6C 6F 77 2D 63 72 65 64 65 6E 74 69 61 6C 73 3A 20 74 72 75 65 0D 0A 0D 0A 1F 8B 08 00 05 CE 9D 63 02 FF 4D 8F 41 0E C2 20 10 45 F7 3D 05 61 D9 14 B4 75 61 E2 AE 31 55 0F A0 07 40 18 29 29 02 A1 E8 C2 A6 77 17 68 52 5D CE 9B 37 7F 66 A6 02 21 2C 3F CA 39 10 F8 80 82 7F 41 85 12 EB 81 09 F0 63 64 53 2C 23 68 39 07 17 62 8D CB 4D 89 B3 B4 52 D2 19 6E 85 32 32 B5 53 5A 85 04 3C 34 0B B0 8A 47 6B 0C F0 A0 AC 49 CE 00 E0 08 D3 EA FD 13 2E 76 CC E9 7D 08 EE AE 0C D5 96 33 BD 76 6F 23 78 D2 4A 30 D9 39 B1 01 C8 1F 8A CE BC 9C FD 84 D0 DB F4 09 3E 77 D7 65 1A 5B AF A4 CA 6B EB 7D 43 9B 9A 6E E9 0E 17 73 F1 05 61 37 56 13 FC 00 00 00"
8+
"e2843e7232537a417f14a0cdaf97730e": {
9+
"request": "GET /ip HTTP/1.1\r\nHost: httpbin.local\r\nuser-agent: Fake-User-Agent\r\nAccept-Encoding: gzip, deflate, zstd\r\nAccept: */*\r\nConnection: keep-alive\r\n\r\n",
10+
"response": "48 54 54 50 2F 31 2E 31 20 32 30 30 20 4F 4B 0D 0A 58 2D 50 6F 77 65 72 65 64 2D 42 79 3A 20 45 78 70 72 65 73 73 0D 0A 73 65 72 76 65 72 3A 20 67 75 6E 69 63 6F 72 6E 2F 31 39 2E 39 2E 30 0D 0A 64 61 74 65 3A 20 53 75 6E 2C 20 32 34 20 44 65 63 20 32 30 32 33 20 31 39 3A 35 35 3A 35 32 20 47 4D 54 0D 0A 63 6F 6E 6E 65 63 74 69 6F 6E 3A 20 6B 65 65 70 2D 61 6C 69 76 65 0D 0A 63 6F 6E 74 65 6E 74 2D 74 79 70 65 3A 20 61 70 70 6C 69 63 61 74 69 6F 6E 2F 6A 73 6F 6E 0D 0A 63 6F 6E 74 65 6E 74 2D 6C 65 6E 67 74 68 3A 20 32 39 0D 0A 61 63 63 65 73 73 2D 63 6F 6E 74 72 6F 6C 2D 61 6C 6C 6F 77 2D 6F 72 69 67 69 6E 3A 20 2A 0D 0A 61 63 63 65 73 73 2D 63 6F 6E 74 72 6F 6C 2D 61 6C 6C 6F 77 2D 63 72 65 64 65 6E 74 69 61 6C 73 3A 20 74 72 75 65 0D 0A 0D 0A 7B 0A 20 20 22 6F 72 69 67 69 6E 22 3A 20 22 31 37 32 2E 32 32 2E 30 2E 32 22 0A 7D 0A"
1111
}
1212
}
1313
}

tests/main/tests.main.test_http_gevent.GeventHttpEntryTestCase.test_truesendall_with_dump_from_recording.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
{
22
"httpbin.local": {
33
"80": {
4-
"03bc7d1e37b2615ce150043ddae0066d": {
5-
"request": "GET /ip HTTP/1.1\r\nHost: httpbin.local\r\nuser-agent: Fake-User-Agent\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\n\r\n",
6-
"response": "48 54 54 50 2F 31 2E 31 20 32 30 30 20 4F 4B 0D 0A 58 2D 50 6F 77 65 72 65 64 2D 42 79 3A 20 45 78 70 72 65 73 73 0D 0A 73 65 72 76 65 72 3A 20 67 75 6E 69 63 6F 72 6E 2F 31 39 2E 39 2E 30 0D 0A 64 61 74 65 3A 20 53 61 74 2C 20 31 37 20 44 65 63 20 32 30 32 32 20 31 34 3A 31 31 3A 31 37 20 47 4D 54 0D 0A 63 6F 6E 6E 65 63 74 69 6F 6E 3A 20 6B 65 65 70 2D 61 6C 69 76 65 0D 0A 63 6F 6E 74 65 6E 74 2D 74 79 70 65 3A 20 61 70 70 6C 69 63 61 74 69 6F 6E 2F 6A 73 6F 6E 0D 0A 63 6F 6E 74 65 6E 74 2D 6C 65 6E 67 74 68 3A 20 32 39 0D 0A 61 63 63 65 73 73 2D 63 6F 6E 74 72 6F 6C 2D 61 6C 6C 6F 77 2D 6F 72 69 67 69 6E 3A 20 2A 0D 0A 61 63 63 65 73 73 2D 63 6F 6E 74 72 6F 6C 2D 61 6C 6C 6F 77 2D 63 72 65 64 65 6E 74 69 61 6C 73 3A 20 74 72 75 65 0D 0A 0D 0A 7B 0A 20 20 22 6F 72 69 67 69 6E 22 3A 20 22 31 37 32 2E 32 31 2E 30 2E 33 22 0A 7D 0A"
4+
"0b717b72090e760066708581e9024a2e": {
5+
"request": "GET /gzip HTTP/1.1\r\nHost: httpbin.local\r\nuser-agent: Fake-User-Agent\r\nAccept-Encoding: gzip, deflate, zstd\r\nAccept: */*\r\nConnection: keep-alive\r\n\r\n",
6+
"response": "48 54 54 50 2F 31 2E 31 20 32 30 30 20 4F 4B 0D 0A 58 2D 50 6F 77 65 72 65 64 2D 42 79 3A 20 45 78 70 72 65 73 73 0D 0A 73 65 72 76 65 72 3A 20 67 75 6E 69 63 6F 72 6E 2F 31 39 2E 39 2E 30 0D 0A 64 61 74 65 3A 20 53 75 6E 2C 20 32 34 20 44 65 63 20 32 30 32 33 20 31 39 3A 35 39 3A 32 31 20 47 4D 54 0D 0A 63 6F 6E 6E 65 63 74 69 6F 6E 3A 20 6B 65 65 70 2D 61 6C 69 76 65 0D 0A 63 6F 6E 74 65 6E 74 2D 74 79 70 65 3A 20 61 70 70 6C 69 63 61 74 69 6F 6E 2F 6A 73 6F 6E 0D 0A 63 6F 6E 74 65 6E 74 2D 6C 65 6E 67 74 68 3A 20 31 38 39 0D 0A 63 6F 6E 74 65 6E 74 2D 65 6E 63 6F 64 69 6E 67 3A 20 67 7A 69 70 0D 0A 61 63 63 65 73 73 2D 63 6F 6E 74 72 6F 6C 2D 61 6C 6C 6F 77 2D 6F 72 69 67 69 6E 3A 20 2A 0D 0A 61 63 63 65 73 73 2D 63 6F 6E 74 72 6F 6C 2D 61 6C 6C 6F 77 2D 63 72 65 64 65 6E 74 69 61 6C 73 3A 20 74 72 75 65 0D 0A 0D 0A 1F 8B 08 00 99 8D 88 65 02 FF 4D 8F 4D 0E C2 20 10 46 F7 3D 05 61 D9 B4 A8 6C 4C DC 35 A6 EA 01 F4 00 08 23 25 45 20 ED E8 A2 4D EF 2E D0 A4 71 F9 BD 79 F3 37 17 84 50 3D 99 10 40 D1 13 C1 E1 03 15 49 AC 03 A1 60 18 23 9B 63 8C A0 91 12 02 C6 4C CB 5D 49 B3 B4 D1 BA 75 D2 2B E3 74 2A A7 69 15 51 F0 B2 02 E3 B0 69 44 B5 E9 67 EF 1C 48 34 DE 25 B3 07 08 B5 B0 E6 0B 9B 70 F3 63 DE D1 21 86 A7 71 CC 7A 29 EC 56 7D 8C 30 D4 8D 06 97 9D 8B E8 A1 FE 43 D1 59 D6 E3 DF 80 9D 4F FF D0 6B 7B 5F BB A9 1F 8C 36 79 ED E1 C8 19 E7 6C CF 38 2D 96 E2 07 90 26 B9 E3 02 01 00 00"
77
},
8-
"70109c06d1c4e826d2899eb7fe343854": {
9-
"request": "GET /gzip HTTP/1.1\r\nHost: httpbin.local\r\nuser-agent: Fake-User-Agent\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\n\r\n",
10-
"response": "48 54 54 50 2F 31 2E 31 20 32 30 30 20 4F 4B 0D 0A 58 2D 50 6F 77 65 72 65 64 2D 42 79 3A 20 45 78 70 72 65 73 73 0D 0A 73 65 72 76 65 72 3A 20 67 75 6E 69 63 6F 72 6E 2F 31 39 2E 39 2E 30 0D 0A 64 61 74 65 3A 20 53 61 74 2C 20 31 37 20 44 65 63 20 32 30 32 32 20 31 34 3A 31 31 3A 31 37 20 47 4D 54 0D 0A 63 6F 6E 6E 65 63 74 69 6F 6E 3A 20 6B 65 65 70 2D 61 6C 69 76 65 0D 0A 63 6F 6E 74 65 6E 74 2D 74 79 70 65 3A 20 61 70 70 6C 69 63 61 74 69 6F 6E 2F 6A 73 6F 6E 0D 0A 63 6F 6E 74 65 6E 74 2D 6C 65 6E 67 74 68 3A 20 31 38 36 0D 0A 63 6F 6E 74 65 6E 74 2D 65 6E 63 6F 64 69 6E 67 3A 20 67 7A 69 70 0D 0A 61 63 63 65 73 73 2D 63 6F 6E 74 72 6F 6C 2D 61 6C 6C 6F 77 2D 6F 72 69 67 69 6E 3A 20 2A 0D 0A 61 63 63 65 73 73 2D 63 6F 6E 74 72 6F 6C 2D 61 6C 6C 6F 77 2D 63 72 65 64 65 6E 74 69 61 6C 73 3A 20 74 72 75 65 0D 0A 0D 0A 1F 8B 08 00 05 CE 9D 63 02 FF 4D 8F 41 0E C2 20 10 45 F7 3D 05 61 D9 14 B4 75 61 E2 AE 31 55 0F A0 07 40 18 29 29 02 A1 E8 C2 A6 77 17 68 52 5D CE 9B 37 7F 66 A6 02 21 2C 3F CA 39 10 F8 80 82 7F 41 85 12 EB 81 09 F0 63 64 53 2C 23 68 39 07 17 62 8D CB 4D 89 B3 B4 52 D2 19 6E 85 32 32 B5 53 5A 85 04 3C 34 0B B0 8A 47 6B 0C F0 A0 AC 49 CE 00 E0 08 D3 EA FD 13 2E 76 CC E9 7D 08 EE AE 0C D5 96 33 BD 76 6F 23 78 D2 4A 30 D9 39 B1 01 C8 1F 8A CE BC 9C FD 84 D0 DB F4 09 3E 77 D7 65 1A 5B AF A4 CA 6B EB 7D 43 9B 9A 6E E9 0E 17 73 F1 05 61 37 56 13 FC 00 00 00"
8+
"e2843e7232537a417f14a0cdaf97730e": {
9+
"request": "GET /ip HTTP/1.1\r\nHost: httpbin.local\r\nuser-agent: Fake-User-Agent\r\nAccept-Encoding: gzip, deflate, zstd\r\nAccept: */*\r\nConnection: keep-alive\r\n\r\n",
10+
"response": "48 54 54 50 2F 31 2E 31 20 32 30 30 20 4F 4B 0D 0A 58 2D 50 6F 77 65 72 65 64 2D 42 79 3A 20 45 78 70 72 65 73 73 0D 0A 73 65 72 76 65 72 3A 20 67 75 6E 69 63 6F 72 6E 2F 31 39 2E 39 2E 30 0D 0A 64 61 74 65 3A 20 53 75 6E 2C 20 32 34 20 44 65 63 20 32 30 32 33 20 31 39 3A 35 39 3A 32 31 20 47 4D 54 0D 0A 63 6F 6E 6E 65 63 74 69 6F 6E 3A 20 6B 65 65 70 2D 61 6C 69 76 65 0D 0A 63 6F 6E 74 65 6E 74 2D 74 79 70 65 3A 20 61 70 70 6C 69 63 61 74 69 6F 6E 2F 6A 73 6F 6E 0D 0A 63 6F 6E 74 65 6E 74 2D 6C 65 6E 67 74 68 3A 20 32 39 0D 0A 61 63 63 65 73 73 2D 63 6F 6E 74 72 6F 6C 2D 61 6C 6C 6F 77 2D 6F 72 69 67 69 6E 3A 20 2A 0D 0A 61 63 63 65 73 73 2D 63 6F 6E 74 72 6F 6C 2D 61 6C 6C 6F 77 2D 63 72 65 64 65 6E 74 69 61 6C 73 3A 20 74 72 75 65 0D 0A 0D 0A 7B 0A 20 20 22 6F 72 69 67 69 6E 22 3A 20 22 31 37 32 2E 32 32 2E 30 2E 32 22 0A 7D 0A"
1111
}
1212
}
1313
}

0 commit comments

Comments
 (0)