0001-allow-cookies-usage-in-endpoint-requests-27654.patch
passerelle/utils/__init__.py | ||
---|---|---|
214 | 214 |
if 'timeout' not in kwargs: |
215 | 215 |
kwargs['timeout'] = settings.REQUESTS_TIMEOUT |
216 | 216 | |
217 |
# don't use persistent cookies |
|
218 |
self.cookies.clear() |
|
217 |
if self.resource and hasattr(self.resource, 'cookiejar'): |
|
218 |
# use cookies that will last the whole endpoint duration |
|
219 |
self.cookies = self.resource.cookiejar |
|
219 | 220 | |
220 | 221 |
response = super(Request, self).request(method, url, **kwargs) |
221 | 222 |
passerelle/views.py | ||
---|---|---|
22 | 22 |
from django.utils.encoding import force_text |
23 | 23 |
from django.forms.models import modelform_factory |
24 | 24 |
from django.forms.widgets import ClearableFileInput |
25 |
import requests |
|
25 | 26 | |
26 | 27 |
from dateutil import parser as date_parser |
27 | 28 | |
... | ... | |
287 | 288 |
def dispatch(self, request, *args, **kwargs): |
288 | 289 |
self.init_stuff(request, *args, **kwargs) |
289 | 290 |
connector = self.get_object() |
291 |
connector.cookiejar = requests.cookies.cookiejar_from_dict({}) |
|
290 | 292 |
self.endpoint = None |
291 | 293 |
endpoints = [] |
292 | 294 |
for name, method in inspect.getmembers(connector): |
tests/test_generic_endpoint.py | ||
---|---|---|
295 | 295 |
assert cache.get_calls == 5 |
296 | 296 |
assert cache.set_calls == 3 |
297 | 297 |
assert resp1.json_body != resp6.json_body |
298 | ||
299 | ||
300 |
def test_endpoint_cookies(app, db, monkeypatch, httpbin): |
|
301 | ||
302 |
@endpoint(methods=['get']) |
|
303 |
def httpcall(obj, request): |
|
304 |
response = obj.requests.get(httpbin.url + '/cookies/set?foo=bar', allow_redirects=False) |
|
305 |
cookie1 = response.request.headers.get('Cookie') |
|
306 |
response = obj.requests.get(httpbin.url + '/get') |
|
307 |
cookie2 = response.request.headers.get('Cookie') |
|
308 |
return { |
|
309 |
'cookie1': cookie1, |
|
310 |
'cookie2': cookie2 |
|
311 |
} |
|
312 | ||
313 |
monkeypatch.setattr(StubInvoicesConnector, 'httpcall', httpcall, raising=False) |
|
314 | ||
315 |
connector = StubInvoicesConnector(slug='fake') |
|
316 |
connector.save() |
|
317 | ||
318 |
json_res = app.get('/stub-invoices/fake/httpcall').json |
|
319 |
assert json_res['cookie1'] is None |
|
320 |
assert json_res['cookie2'] == 'foo=bar' |
|
321 |
# Do it a second time to test that no cookies are leaking from one call |
|
322 |
# to the other |
|
323 |
json_res = app.get('/stub-invoices/fake/httpcall').json |
|
324 |
assert json_res['cookie1'] is None |
|
325 |
assert json_res['cookie2'] == 'foo=bar' |
tests/test_requests.py | ||
---|---|---|
6 | 6 |
from httmock import urlmatch, HTTMock, response |
7 | 7 | |
8 | 8 |
from django.test import override_settings |
9 |
import requests |
|
9 | 10 | |
10 | 11 |
from passerelle.utils import Request, CaseInsensitiveDict |
11 | 12 |
from passerelle.utils.http_authenticators import HawkAuth |
... | ... | |
327 | 328 |
assert mocked_get.call_args[1]['timeout'] == 42 |
328 | 329 |
Request(logger=logger).get('http://example.net/whatever', timeout=None) |
329 | 330 |
assert mocked_get.call_args[1]['timeout'] is None |
331 | ||
332 | ||
333 |
def test_requests_cookies(httpbin): |
|
334 |
resource = MockResource() |
|
335 |
resource.cookiejar = requests.cookies.cookiejar_from_dict({}) |
|
336 |
logger = logging.getLogger('requests') |
|
337 |
request = Request(resource=resource, logger=logger) |
|
338 | ||
339 |
request.get(httpbin.url + '/cookies/set?foo=bar') |
|
340 | ||
341 |
# cookies are sent back |
|
342 |
response = request.get(httpbin.url + '/get') |
|
343 |
assert response.request.headers['Cookie'] == 'foo=bar' |
|
344 | ||
345 |
# cookies sent back even with a new Request obj |
|
346 |
request = Request(resource=resource, logger=logger) |
|
347 |
response = request.get(httpbin.url + '/get') |
|
348 |
assert response.request.headers['Cookie'] == 'foo=bar' |
tox.ini | ||
---|---|---|
25 | 25 |
lxml |
26 | 26 |
mohawk |
27 | 27 |
pytest-freezegun |
28 |
pytest-httpbin |
|
28 | 29 |
commands = |
29 | 30 |
django18: py.test {posargs: {env:FAST:} --junitxml=test_{envname}_results.xml --cov-report xml --cov-report html --cov=passerelle/ --cov-config .coveragerc tests/} |
30 | 31 |
django18: ./pylint.sh passerelle/ |
31 |
- |