def request(self, method, url, name=None, **kwargs): """ Constructs and sends a :py:class:`requests.Request`. Returns :py:class:`requests.Response` object. :param method: method for the new :class:`Request` object. :param url: URL for the new :class:`Request` object. :param name: (optional) Placeholder, make compatible with Locust's HttpSession :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. :param data: (optional) Dictionary or bytes to send in the body of the :class:`Request`. :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. :param files: (optional) Dictionary of ``'filename': file-like-objects`` for multipart encoding upload. :param auth: (optional) Auth tuple or callable to enable Basic/Digest/Custom HTTP Auth. :param timeout: (optional) How long to wait for the server to send data before giving up, as a float, or \ a (`connect timeout, read timeout <user/advanced.html#timeouts>`_) tuple. :type timeout: float or tuple :param allow_redirects: (optional) Set to True by default. :type allow_redirects: bool :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. :param stream: (optional) whether to immediately download the response content. Defaults to ``False``. :param verify: (optional) if ``True``, the SSL cert will be verified. A CA_BUNDLE path can also be provided. :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. """ self.data = SessionData() # timeout default to 120 seconds kwargs.setdefault("timeout", 120) # set stream to True, in order to get client/server IP/Port kwargs["stream"] = True start_timestamp = time.time() response = self._send_request_safe_mode(method, url, **kwargs) response_time_ms = round((time.time() - start_timestamp) * 1000, 2) try: client_ip, client_port = response.raw.connection.sock.getsockname() self.data.address.client_ip = client_ip self.data.address.client_port = client_port logger.debug(f"client IP: {client_ip}, Port: {client_port}") except AttributeError as ex: raise NetworkFailure(f"failed to get client address info: {ex}") try: server_ip, server_port = response.raw.connection.sock.getpeername() self.data.address.server_ip = server_ip self.data.address.server_port = server_port logger.debug(f"server IP: {server_ip}, Port: {server_port}") except AttributeError as ex: raise NetworkFailure(f"failed to get server address info: {ex}") # get length of the response content content_size = int(dict(response.headers).get("content-length") or 0) # record the consumed time self.data.stat.response_time_ms = response_time_ms self.data.stat.elapsed_ms = response.elapsed.microseconds / 1000.0 self.data.stat.content_size = content_size # record request and response histories, include 30X redirection response_list = response.history + [response] self.data.req_resps = [ get_req_resp_record(resp_obj) for resp_obj in response_list ] try: response.raise_for_status() except RequestException as ex: logger.error(f"{str(ex)}") else: logger.info(f"status_code: {response.status_code}, " f"response_time(ms): {response_time_ms} ms, " f"response_length: {content_size} bytes") return response
def __init__(self): super(HttpSession, self).__init__() self.data = SessionData()