locust 2.39.1.dev14__tar.gz → 2.39.2.dev5__tar.gz
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.
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/PKG-INFO +1 -1
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/_version.py +2 -2
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/contrib/fasthttp.py +32 -24
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/.gitignore +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/LICENSE +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/README.md +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/hatch_build.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/__init__.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/__main__.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/argument_parser.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/clients.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/contrib/__init__.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/contrib/milvus.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/contrib/mongodb.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/contrib/oai.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/contrib/postgres.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/contrib/socketio.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/debug.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/dispatch.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/env.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/event.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/exception.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/html.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/input_events.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/log.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/main.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/py.typed +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/rpc/__init__.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/rpc/protocol.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/rpc/zmqrpc.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/runners.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/shape.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/stats.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/user/__init__.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/user/inspectuser.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/user/markov_taskset.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/user/sequential_taskset.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/user/task.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/user/users.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/user/wait_time.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/util/__init__.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/util/cache.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/util/date.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/util/deprecation.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/util/directory.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/util/exception_handler.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/util/load_locustfile.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/util/rounding.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/util/timespan.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/util/url.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/web.py +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/webui/dist/assets/favicon-dark.png +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/webui/dist/assets/favicon-light.png +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/webui/dist/assets/graphs-dark.png +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/webui/dist/assets/graphs-light.png +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/webui/dist/assets/index-BjqxSg7R.js +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/webui/dist/assets/terminal.gif +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/webui/dist/assets/testruns-dark.png +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/webui/dist/assets/testruns-light.png +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/webui/dist/auth.html +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/webui/dist/index.html +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/locust/webui/dist/report.html +0 -0
- {locust-2.39.1.dev14 → locust-2.39.2.dev5}/pyproject.toml +0 -0
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '2.39.
|
|
32
|
-
__version_tuple__ = version_tuple = (2, 39,
|
|
31
|
+
__version__ = version = '2.39.2.dev5'
|
|
32
|
+
__version_tuple__ = version_tuple = (2, 39, 2, 'dev5')
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from locust.env import Environment
|
|
4
3
|
from locust.exception import CatchResponseError, LocustError, ResponseError
|
|
5
4
|
from locust.user import User
|
|
6
5
|
from locust.util.deprecation import DeprecatedFastHttpLocustClass as FastHttpLocust # noqa: F401
|
|
@@ -106,16 +105,16 @@ class FastHttpSession:
|
|
|
106
105
|
|
|
107
106
|
def __init__(
|
|
108
107
|
self,
|
|
109
|
-
|
|
110
|
-
|
|
108
|
+
base_url: str | None,
|
|
109
|
+
request_event,
|
|
111
110
|
user: User | None,
|
|
112
111
|
insecure=True,
|
|
113
112
|
client_pool: HTTPClientPool | None = None,
|
|
114
113
|
ssl_context_factory: Callable | None = None,
|
|
115
114
|
**kwargs,
|
|
116
115
|
) -> None:
|
|
117
|
-
self.environment = environment
|
|
118
116
|
self.base_url = base_url
|
|
117
|
+
self.request_event = request_event
|
|
119
118
|
self.cookiejar = CookieJar()
|
|
120
119
|
self.user = user
|
|
121
120
|
if not ssl_context_factory:
|
|
@@ -132,18 +131,28 @@ class FastHttpSession:
|
|
|
132
131
|
)
|
|
133
132
|
|
|
134
133
|
# Check for basic authentication
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
134
|
+
if self.base_url:
|
|
135
|
+
parsed_url = urlparse(self.base_url)
|
|
136
|
+
if parsed_url.username and parsed_url.password:
|
|
137
|
+
netloc = parsed_url.hostname or ""
|
|
138
|
+
if parsed_url.port:
|
|
139
|
+
netloc += ":%d" % parsed_url.port
|
|
140
|
+
|
|
141
|
+
# remove username and password from the base_url
|
|
142
|
+
self.base_url = str(
|
|
143
|
+
urlunparse(
|
|
144
|
+
(
|
|
145
|
+
parsed_url.scheme,
|
|
146
|
+
netloc,
|
|
147
|
+
parsed_url.path,
|
|
148
|
+
parsed_url.params,
|
|
149
|
+
parsed_url.query,
|
|
150
|
+
parsed_url.fragment,
|
|
151
|
+
)
|
|
152
|
+
)
|
|
153
|
+
)
|
|
154
|
+
# store authentication header (we construct this by using _basic_auth_str() function from requests.auth)
|
|
155
|
+
self.auth_header = _construct_basic_auth_str(parsed_url.username, parsed_url.password)
|
|
147
156
|
|
|
148
157
|
def _build_url(self, path: str) -> str:
|
|
149
158
|
"""prepend url with hostname unless it's already an absolute URL"""
|
|
@@ -273,7 +282,7 @@ class FastHttpSession:
|
|
|
273
282
|
except HTTPParseError as e:
|
|
274
283
|
request_meta["response_time"] = (time.perf_counter() - start_perf_counter) * 1000
|
|
275
284
|
request_meta["exception"] = e
|
|
276
|
-
self.
|
|
285
|
+
self.request_event.fire(**request_meta)
|
|
277
286
|
return response
|
|
278
287
|
|
|
279
288
|
# Record the consumed time
|
|
@@ -282,14 +291,14 @@ class FastHttpSession:
|
|
|
282
291
|
request_meta["response_time"] = (time.perf_counter() - start_perf_counter) * 1000
|
|
283
292
|
|
|
284
293
|
if catch_response:
|
|
285
|
-
return ResponseContextManager(response,
|
|
294
|
+
return ResponseContextManager(response, request_event=self.request_event, request_meta=request_meta)
|
|
286
295
|
else:
|
|
287
296
|
try:
|
|
288
297
|
response.raise_for_status()
|
|
289
298
|
except FAILURE_EXCEPTIONS as e:
|
|
290
299
|
request_meta["exception"] = e
|
|
291
300
|
|
|
292
|
-
self.
|
|
301
|
+
self.request_event.fire(**request_meta)
|
|
293
302
|
return response
|
|
294
303
|
|
|
295
304
|
def delete(self, url: str, **kwargs: Unpack[RESTKwargs]) -> ResponseContextManager | FastResponse:
|
|
@@ -406,8 +415,8 @@ class FastHttpUser(User):
|
|
|
406
415
|
)
|
|
407
416
|
|
|
408
417
|
self.client: FastHttpSession = FastHttpSession(
|
|
409
|
-
self.environment,
|
|
410
418
|
base_url=self.host,
|
|
419
|
+
request_event=self.environment.events.request,
|
|
411
420
|
network_timeout=self.network_timeout,
|
|
412
421
|
connection_timeout=self.connection_timeout,
|
|
413
422
|
max_redirects=self.max_redirects,
|
|
@@ -653,15 +662,14 @@ class ResponseContextManager(FastResponse):
|
|
|
653
662
|
_manual_result = None
|
|
654
663
|
_entered = False
|
|
655
664
|
|
|
656
|
-
def __init__(self, response,
|
|
665
|
+
def __init__(self, response, request_event, request_meta):
|
|
657
666
|
# copy data from response to this object
|
|
658
667
|
self.__dict__ = response.__dict__
|
|
659
668
|
try:
|
|
660
669
|
self._cached_content = response._cached_content
|
|
661
670
|
except AttributeError:
|
|
662
671
|
pass
|
|
663
|
-
|
|
664
|
-
self._environment = environment
|
|
672
|
+
self._request_event = request_event
|
|
665
673
|
self.request_meta = request_meta
|
|
666
674
|
|
|
667
675
|
def __enter__(self):
|
|
@@ -696,7 +704,7 @@ class ResponseContextManager(FastResponse):
|
|
|
696
704
|
return True
|
|
697
705
|
|
|
698
706
|
def _report_request(self):
|
|
699
|
-
self.
|
|
707
|
+
self._request_event.fire(**self.request_meta)
|
|
700
708
|
|
|
701
709
|
def success(self):
|
|
702
710
|
"""
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|