Skip to content

Commit e890af6

Browse files
authored
chore(pre-commit): autoupdate hooks (#1314)
2 parents a331a53 + 96f1f45 commit e890af6

File tree

8 files changed

+64
-8
lines changed

8 files changed

+64
-8
lines changed

.pre-commit-config.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ repos:
4848
- python
4949

5050
- repo: https://github.com/pycqa/bandit
51-
rev: 1.7.4
51+
rev: 1.7.5
5252
hooks:
5353
- id: bandit
5454
args: ["-ll"]

benefits/core/analytics.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,12 @@ def send(self, event):
128128
payload = self._payload(event)
129129
logger.debug(f"Sending event payload: {payload}")
130130

131-
r = requests.post(self.url, headers=self.headers, json=payload)
131+
r = requests.post(
132+
self.url,
133+
headers=self.headers,
134+
json=payload,
135+
timeout=settings.REQUESTS_TIMEOUT,
136+
)
132137
if r.status_code == 200:
133138
logger.debug(f"Event sent successfully: {r.json()}")
134139
elif r.status_code == 400:

benefits/core/models.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"""
44
import logging
55

6+
from django.conf import settings
67
from django.db import models
78
from django.urls import reverse
89

@@ -31,7 +32,7 @@ def data(self):
3132
if self.text:
3233
return self.text
3334
elif self.remote_url:
34-
self.text = requests.get(self.remote_url).text
35+
self.text = requests.get(self.remote_url, timeout=settings.REQUESTS_TIMEOUT).text
3536

3637
self.save()
3738
return self.text

benefits/core/recaptcha.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,6 @@ def verify(form_data: dict) -> bool:
2626
return False
2727

2828
payload = dict(secret=settings.RECAPTCHA_SECRET_KEY, response=form_data[DATA_FIELD])
29-
response = requests.post(settings.RECAPTCHA_VERIFY_URL, payload).json()
29+
response = requests.post(settings.RECAPTCHA_VERIFY_URL, payload, timeout=settings.REQUESTS_TIMEOUT).json()
3030

3131
return bool(response["success"])

benefits/enrollment/api.py

+31-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from tempfile import NamedTemporaryFile
66
import time
77

8+
from django.conf import settings
89
import requests
910

1011

@@ -123,15 +124,42 @@ def _make_url(self, *parts):
123124

124125
def _get(self, url, payload, headers=None):
125126
h = self._headers(headers)
126-
return self._cert_request(lambda verify, cert: requests.get(url, headers=h, params=payload, verify=verify, cert=cert))
127+
return self._cert_request(
128+
lambda verify, cert: requests.get(
129+
url,
130+
headers=h,
131+
params=payload,
132+
verify=verify,
133+
cert=cert,
134+
timeout=settings.REQUESTS_TIMEOUT,
135+
)
136+
)
127137

128138
def _patch(self, url, payload, headers=None):
129139
h = self._headers(headers)
130-
return self._cert_request(lambda verify, cert: requests.patch(url, headers=h, json=payload, verify=verify, cert=cert))
140+
return self._cert_request(
141+
lambda verify, cert: requests.patch(
142+
url,
143+
headers=h,
144+
json=payload,
145+
verify=verify,
146+
cert=cert,
147+
timeout=settings.REQUESTS_TIMEOUT,
148+
)
149+
)
131150

132151
def _post(self, url, payload, headers=None):
133152
h = self._headers(headers)
134-
return self._cert_request(lambda verify, cert: requests.post(url, headers=h, json=payload, verify=verify, cert=cert))
153+
return self._cert_request(
154+
lambda verify, cert: requests.post(
155+
url,
156+
headers=h,
157+
json=payload,
158+
verify=verify,
159+
cert=cert,
160+
timeout=settings.REQUESTS_TIMEOUT,
161+
)
162+
)
135163

136164
def _cert_request(self, request_func):
137165
"""

benefits/settings.py

+7
Original file line numberDiff line numberDiff line change
@@ -307,3 +307,10 @@ def _filter_empty(ls):
307307
]
308308
env_style_src = _filter_empty(os.environ.get("DJANGO_CSP_STYLE_SRC", "").split(","))
309309
CSP_STYLE_SRC.extend(env_style_src)
310+
311+
# Configuration for requests
312+
# https://requests.readthedocs.io/en/latest/user/advanced/#timeouts
313+
314+
REQUESTS_CONNECT_TIMEOUT = os.environ.get("REQUESTS_CONNECT_TIMEOUT", 3)
315+
REQUESTS_READ_TIMEOUT = os.environ.get("REQUESTS_READ_TIMEOUT", 1)
316+
REQUESTS_TIMEOUT = (REQUESTS_CONNECT_TIMEOUT, REQUESTS_READ_TIMEOUT)

docs/configuration/environment-variables.md

+14
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,20 @@ Comma-separated list of hosts which are trusted origins for unsafe requests (e.g
132132

133133
Comma-separated list of User-Agent strings which, when present as an HTTP header, should only receive healthcheck responses. Used by our `HealthcheckUserAgents` middleware.
134134

135+
## `requests` configuration
136+
137+
!!! tldr "`requests` docs"
138+
139+
[Docs for timeouts](https://requests.readthedocs.io/en/latest/user/advanced/#timeouts)
140+
141+
### `REQUESTS_CONNECT_TIMEOUT`
142+
143+
The number of seconds `requests` will wait for the client to establish a connection to a remote machine. Defaults to 3 seconds.
144+
145+
### `REQUESTS_READ_TIMEOUT`
146+
147+
The number of seconds the client will wait for the server to send a response. Defaults to 1 second.
148+
135149
## Cypress tests
136150

137151
!!! tldr "Cypress docs"

tests/pytest/core/test_models.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from django.conf import settings
12
import pytest
23

34
from benefits.core.models import EligibilityType, EligibilityVerifier, TransitAgency
@@ -29,7 +30,7 @@ def test_PemData_data_remote(model_PemData, mocker):
2930
assert model_PemData.text
3031
assert data == "PEM text"
3132
assert data == model_PemData.text
32-
requests_spy.assert_called_once_with(model_PemData.remote_url)
33+
requests_spy.assert_called_once_with(model_PemData.remote_url, timeout=settings.REQUESTS_TIMEOUT)
3334

3435

3536
@pytest.mark.django_db

0 commit comments

Comments
 (0)