Projet

Général

Profil

0001-allow-cookies-usage-in-endpoint-requests-27654.patch

Emmanuel Cazenave, 02 novembre 2018 17:58

Télécharger (5,07 ko)

Voir les différences:

Subject: [PATCH] allow cookies usage in endpoint requests (#27654)

 passerelle/utils/__init__.py   |  5 +++--
 passerelle/views.py            |  2 ++
 tests/test_generic_endpoint.py | 28 ++++++++++++++++++++++++++++
 tests/test_requests.py         | 19 +++++++++++++++++++
 tox.ini                        |  1 +
 5 files changed, 53 insertions(+), 2 deletions(-)
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
-