From 3e70c7a182b4460d1b139d2fb6741a1902c07263 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A1n=20Chaves?= Date: Wed, 15 Apr 2020 12:41:07 +0200 Subject: [PATCH] HttpAuthMiddleware: implement meta support --- scrapy/downloadermiddlewares/httpauth.py | 12 ++++++++++-- tests/test_downloadermiddleware_httpauth.py | 20 ++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/scrapy/downloadermiddlewares/httpauth.py b/scrapy/downloadermiddlewares/httpauth.py index 089bf0d85..ee6c35619 100644 --- a/scrapy/downloadermiddlewares/httpauth.py +++ b/scrapy/downloadermiddlewares/httpauth.py @@ -26,6 +26,14 @@ class HttpAuthMiddleware: self.auth = basic_auth_header(usr, pwd) def process_request(self, request, spider): - auth = getattr(self, 'auth', None) - if auth and b'Authorization' not in request.headers: + if b'Authorization' in request.headers: + return + + usr = request.meta.get('http_user', '') + pwd = request.meta.get('http_pass', '') + if usr or pwd: + auth = basic_auth_header(usr, pwd) + else: + auth = getattr(self, 'auth', None) + if auth: request.headers[b'Authorization'] = auth diff --git a/tests/test_downloadermiddleware_httpauth.py b/tests/test_downloadermiddleware_httpauth.py index 3381632b0..91e4ef23b 100644 --- a/tests/test_downloadermiddleware_httpauth.py +++ b/tests/test_downloadermiddleware_httpauth.py @@ -30,3 +30,23 @@ class HttpAuthMiddlewareTest(unittest.TestCase): headers=dict(Authorization='Digest 123')) assert self.mw.process_request(req, self.spider) is None self.assertEqual(req.headers['Authorization'], b'Digest 123') + + def test_auth_already_set_with_meta(self): + meta = {'http_user': 'bar', 'http_pass': 'foo'} + req = Request('http://scrapytest.org/', + headers=dict(Authorization='Digest 123'), + meta=meta) + assert self.mw.process_request(req, self.spider) is None + self.assertEqual(req.headers['Authorization'], b'Digest 123') + + def test_auth_meta(self): + meta = {'http_user': 'bar', 'http_pass': 'foo'} + req = Request('http://scrapytest.org/', meta=meta) + assert self.mw.process_request(req, Spider('bar')) is None + self.assertEqual(req.headers['Authorization'], b'Basic YmFyOmZvbw==') + + def test_auth_meta_override(self): + meta = {'http_user': 'bar', 'http_pass': 'foo'} + req = Request('http://scrapytest.org/', meta=meta) + assert self.mw.process_request(req, self.spider) is None + self.assertEqual(req.headers['Authorization'], b'Basic YmFyOmZvbw==')