pylookyloo 1.27.1__py3-none-any.whl → 1.28.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of pylookyloo might be problematic. Click here for more details.

pylookyloo/api.py CHANGED
@@ -17,6 +17,29 @@ import requests
17
17
 
18
18
  from urllib3.util import Retry
19
19
  from requests.adapters import HTTPAdapter
20
+ from requests.sessions import Session
21
+ from requests.status_codes import codes
22
+
23
+
24
+ class SafeRedirectRePOSTSession(Session):
25
+
26
+ def rebuild_method(self, prepared_request: requests.PreparedRequest, response: requests.Response) -> None:
27
+ # This method will resubmit a POST when we have a http -> https redirect
28
+ if response.status_code == codes.moved and prepared_request.method == 'POST':
29
+ # make sure it is just a redirect http->https and we're not going to a different host
30
+ prec_url = urlparse(response.url)
31
+ next_url = urlparse(prepared_request.url)
32
+
33
+ if (prec_url.netloc != next_url.netloc or prec_url.scheme != 'http'
34
+ or next_url.scheme != 'https'):
35
+ super().rebuild_method(prepared_request, response)
36
+ else:
37
+ # For surely good reasons, requests force-remove the body of the redirected requests unless the statuscode is either 307 or 308
38
+ # https://github.com/psf/requests/issues/1084
39
+ # Doing that makes sure we keep it
40
+ response.status_code = 307
41
+ else:
42
+ super().rebuild_method(prepared_request, response)
20
43
 
21
44
 
22
45
  class PyLookylooError(Exception):
@@ -39,6 +62,7 @@ class CaptureSettings(TypedDict, total=False):
39
62
  proxy: str | dict[str, str] | None
40
63
  general_timeout_in_sec: int | None
41
64
  cookies: list[dict[str, Any]] | None
65
+ storage: str | dict[str, Any] | None
42
66
  headers: str | dict[str, str] | None
43
67
  http_credentials: dict[str, int] | None
44
68
  geolocation: dict[str, float] | None
@@ -78,7 +102,7 @@ class Lookyloo():
78
102
  self.root_url = 'http://' + self.root_url
79
103
  if not self.root_url.endswith('/'):
80
104
  self.root_url += '/'
81
- self.session = requests.session()
105
+ self.session = SafeRedirectRePOSTSession()
82
106
  self.session.headers['user-agent'] = useragent if useragent else f'PyLookyloo / {version("pylookyloo")}'
83
107
  if proxies:
84
108
  self.session.proxies.update(proxies)
@@ -148,6 +172,7 @@ class Lookyloo():
148
172
  proxy: str | dict[str, str] | None=None,
149
173
  general_timeout_in_sec: int | None=None,
150
174
  cookies: list[dict[str, Any]] | None=None,
175
+ storage: str | dict[str, Any] | None=None,
151
176
  headers: str | dict[str, str] | None=None,
152
177
  http_credentials: dict[str, int] | None=None,
153
178
  geolocation: dict[str, float] | None=None,
@@ -172,6 +197,7 @@ class Lookyloo():
172
197
  proxy: str | dict[str, str] | None=None,
173
198
  general_timeout_in_sec: int | None=None,
174
199
  cookies: list[dict[str, Any]] | None=None,
200
+ storage: str | dict[str, Any] | None=None,
175
201
  headers: str | dict[str, str] | None=None,
176
202
  http_credentials: dict[str, int] | None=None,
177
203
  geolocation: dict[str, float] | None=None,
@@ -247,6 +273,8 @@ class Lookyloo():
247
273
  to_send['general_timeout_in_sec'] = general_timeout_in_sec
248
274
  if cookies:
249
275
  to_send['cookies'] = cookies
276
+ if storage:
277
+ to_send['storage'] = storage
250
278
  if headers:
251
279
  to_send['headers'] = headers
252
280
  if http_credentials:
@@ -402,6 +430,14 @@ class Lookyloo():
402
430
  r = self.session.get(urljoin(self.root_url, str(PurePosixPath('json', capture_uuid, 'cookies'))))
403
431
  return r.json()
404
432
 
433
+ def get_storage(self, capture_uuid: str) -> dict[str, Any]:
434
+ '''Returns the complete storage state.
435
+
436
+ :param capture_uuid: UUID of the capture
437
+ '''
438
+ r = self.session.get(urljoin(self.root_url, str(PurePosixPath('json', capture_uuid, 'storage'))))
439
+ return r.json()
440
+
405
441
  def get_html(self, capture_uuid: str) -> StringIO:
406
442
  '''Returns the rendered HTML as it would be in the browser after the page loaded.
407
443
 
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pylookyloo
3
- Version: 1.27.1
3
+ Version: 1.28.1
4
4
  Summary: Python CLI and module for Lookyloo
5
- License: BSD-3-Clause
5
+ License: GPL-2.0-or-later
6
6
  Author: Raphaël Vinot
7
7
  Author-email: raphael.vinot@circl.lu
8
8
  Requires-Python: >=3.9
@@ -11,7 +11,7 @@ Classifier: Environment :: Console
11
11
  Classifier: Intended Audience :: Information Technology
12
12
  Classifier: Intended Audience :: Science/Research
13
13
  Classifier: Intended Audience :: Telecommunications Industry
14
- Classifier: License :: OSI Approved :: BSD License
14
+ Classifier: License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)
15
15
  Classifier: Operating System :: POSIX :: Linux
16
16
  Classifier: Programming Language :: Python :: 3
17
17
  Classifier: Programming Language :: Python :: 3.9
@@ -23,8 +23,8 @@ Classifier: Topic :: Internet
23
23
  Classifier: Topic :: Security
24
24
  Provides-Extra: docs
25
25
  Provides-Extra: examples
26
- Requires-Dist: Sphinx (>=8.1.3) ; (python_version >= "3.10") and (extra == "docs")
27
- Requires-Dist: pylacus (>=1.12.1) ; extra == "examples"
26
+ Requires-Dist: Sphinx (>=8.2.3) ; (python_version >= "3.11") and (extra == "docs")
27
+ Requires-Dist: pylacus (>=1.13.2) ; extra == "examples"
28
28
  Requires-Dist: requests (>=2.32.3)
29
29
  Project-URL: Documentation, https://pylookyloo.readthedocs.io/en/latest/
30
30
  Project-URL: Repository, https://github.com/lookyloo/PyLookyloo
@@ -0,0 +1,8 @@
1
+ pylookyloo/__init__.py,sha256=_JYXwXHL7ShZkeruvGd8qDTpxNRfuDjvV65SOMMU6yc,1922
2
+ pylookyloo/api.py,sha256=qm8dBlfkh0DbPvAHkycDIHHYdrIToqwqX3G7uCjLsvs,31263
3
+ pylookyloo/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ pylookyloo-1.28.1.dist-info/LICENSE,sha256=4C4hLYrIkUD96Ggk-y_Go1Qf7PBZrEm9PSeTGe2nd4s,1516
5
+ pylookyloo-1.28.1.dist-info/METADATA,sha256=GIEI43Vck84Fyvi_oMMzK6DBoIsz-x76yCJj8_EVe_g,2387
6
+ pylookyloo-1.28.1.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
7
+ pylookyloo-1.28.1.dist-info/entry_points.txt,sha256=y2c0Ujg8co6Xyf7MoxStVU-fLQMZBSGAg-KFidmsha4,44
8
+ pylookyloo-1.28.1.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.0.1
2
+ Generator: poetry-core 2.1.2
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,8 +0,0 @@
1
- pylookyloo/__init__.py,sha256=_JYXwXHL7ShZkeruvGd8qDTpxNRfuDjvV65SOMMU6yc,1922
2
- pylookyloo/api.py,sha256=JrHJr4IJ8NpJI8otMS83f4uUTifFOxqwDO2UIFNW2QE,29530
3
- pylookyloo/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- pylookyloo-1.27.1.dist-info/LICENSE,sha256=4C4hLYrIkUD96Ggk-y_Go1Qf7PBZrEm9PSeTGe2nd4s,1516
5
- pylookyloo-1.27.1.dist-info/METADATA,sha256=6AwRog0u2bcT5lAcIOT7Y_OxZe-4g8RFOpegYiT9XVE,2347
6
- pylookyloo-1.27.1.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
7
- pylookyloo-1.27.1.dist-info/entry_points.txt,sha256=y2c0Ujg8co6Xyf7MoxStVU-fLQMZBSGAg-KFidmsha4,44
8
- pylookyloo-1.27.1.dist-info/RECORD,,