Skip to content

Commit 0f6451e

Browse files
authored
feat: added Request.postDataBuffer (#150)
1 parent 4887636 commit 0f6451e

File tree

6 files changed

+69
-5
lines changed

6 files changed

+69
-5
lines changed

playwright/async_api.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,17 @@ def postDataJSON(self) -> typing.Union[typing.Dict, NoneType]:
132132
"""
133133
return mapping.from_maybe_impl(self._impl_obj.postDataJSON)
134134

135+
@property
136+
def postDataBuffer(self) -> typing.Union[bytes, NoneType]:
137+
"""Request.postDataBuffer
138+
139+
Returns
140+
-------
141+
Optional[bytes]
142+
Request's post body in a binary form, if any.
143+
"""
144+
return mapping.from_maybe_impl(self._impl_obj.postDataBuffer)
145+
135146
@property
136147
def headers(self) -> typing.Dict[str, str]:
137148
"""Request.headers

playwright/network.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,10 @@ def method(self) -> str:
5959

6060
@property
6161
def postData(self) -> Optional[str]:
62-
b64_content = self._initializer.get("postData")
63-
if not b64_content:
62+
data = self.postDataBuffer
63+
if not data:
6464
return None
65-
return base64.b64decode(b64_content).decode()
65+
return data.decode()
6666

6767
@property
6868
def postDataJSON(self) -> Optional[Dict]:
@@ -76,6 +76,13 @@ def postDataJSON(self) -> Optional[Dict]:
7676
return dict(parse.parse_qsl(post_data))
7777
return json.loads(post_data)
7878

79+
@property
80+
def postDataBuffer(self) -> Optional[bytes]:
81+
b64_content = self._initializer.get("postData")
82+
if not b64_content:
83+
return None
84+
return base64.b64decode(b64_content)
85+
7986
@property
8087
def headers(self) -> Dict[str, str]:
8188
return parse_headers(self._initializer["headers"])

playwright/sync_api.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,17 @@ def postDataJSON(self) -> typing.Union[typing.Dict, NoneType]:
132132
"""
133133
return mapping.from_maybe_impl(self._impl_obj.postDataJSON)
134134

135+
@property
136+
def postDataBuffer(self) -> typing.Union[bytes, NoneType]:
137+
"""Request.postDataBuffer
138+
139+
Returns
140+
-------
141+
Optional[bytes]
142+
Request's post body in a binary form, if any.
143+
"""
144+
return mapping.from_maybe_impl(self._impl_obj.postDataBuffer)
145+
135146
@property
136147
def headers(self) -> typing.Dict[str, str]:
137148
"""Request.headers

tests/async/test_interception.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -727,7 +727,7 @@ async def test_request_continue_should_amend_post_data(page, server):
727727
"""
728728
),
729729
)
730-
assert serverRequest.post_body == "doggo"
730+
assert serverRequest.post_body.decode() == "doggo"
731731

732732

733733
async def test_request_fulfill_should_work_a(page, server):

tests/async/test_network.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,41 @@ async def test_should_be_undefined_when_there_is_no_post_data(page, server):
237237
assert response.request.postDataJSON is None
238238

239239

240+
async def test_should_work_with_binary_post_data(page, server):
241+
await page.goto(server.EMPTY_PAGE)
242+
server.set_route("/post", lambda req: req.finish())
243+
requests = []
244+
page.on("request", lambda r: requests.append(r))
245+
await page.evaluate(
246+
"""async () => {
247+
await fetch('./post', { method: 'POST', body: new Uint8Array(Array.from(Array(256).keys())) })
248+
}"""
249+
)
250+
assert len(requests) == 1
251+
buffer = requests[0].postDataBuffer
252+
assert len(buffer) == 256
253+
for i in range(256):
254+
assert buffer[i] == i
255+
256+
257+
async def test_should_work_with_binary_post_data_and_interception(page, server):
258+
await page.goto(server.EMPTY_PAGE)
259+
server.set_route("/post", lambda req: req.finish())
260+
requests = []
261+
await page.route("/post", lambda route: asyncio.ensure_future(route.continue_()))
262+
page.on("request", lambda r: requests.append(r))
263+
await page.evaluate(
264+
"""async () => {
265+
await fetch('./post', { method: 'POST', body: new Uint8Array(Array.from(Array(256).keys())) })
266+
}"""
267+
)
268+
assert len(requests) == 1
269+
buffer = requests[0].postDataBuffer
270+
assert len(buffer) == 256
271+
for i in range(256):
272+
assert buffer[i] == i
273+
274+
240275
async def test_response_text_should_work(page, server):
241276
response = await page.goto(server.PREFIX + "/simple.json")
242277
assert await response.text() == '{"foo": "bar"}\n'

tests/server.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ def start(self):
7878
class TestServerHTTPHandler(http.Request):
7979
def process(self):
8080
request = self
81-
self.post_body = request.content.read().decode()
81+
self.post_body = request.content.read()
8282
request.content.seek(0, 0)
8383
uri = request.uri.decode()
8484
if request_subscribers.get(uri):

0 commit comments

Comments
 (0)