@@ -1361,40 +1361,64 @@ def test_osx_proxy_bypass(self):
1361
1361
bypass = {'exclude_simple' : True , 'exceptions' : []}
1362
1362
self .assertTrue (_proxy_bypass_macosx_sysconf ('test' , bypass ))
1363
1363
1364
- def test_basic_auth (self , quote_char = '"' ):
1365
- opener = OpenerDirector ()
1366
- password_manager = MockPasswordManager ()
1367
- auth_handler = urllib .request .HTTPBasicAuthHandler (password_manager )
1368
- realm = "ACME Widget Store"
1369
- http_handler = MockHTTPHandler (
1370
- 401 , 'WWW-Authenticate: Basic realm=%s%s%s\r \n \r \n ' %
1371
- (quote_char , realm , quote_char ))
1372
- opener .add_handler (auth_handler )
1373
- opener .add_handler (http_handler )
1374
- self ._test_basic_auth (opener , auth_handler , "Authorization" ,
1375
- realm , http_handler , password_manager ,
1376
- "http://acme.example.com/protected" ,
1377
- "http://acme.example.com/protected" ,
1378
- )
1379
-
1380
- def test_basic_auth_with_single_quoted_realm (self ):
1381
- self .test_basic_auth (quote_char = "'" )
1382
-
1383
- def test_basic_auth_with_unquoted_realm (self ):
1384
- opener = OpenerDirector ()
1385
- password_manager = MockPasswordManager ()
1386
- auth_handler = urllib .request .HTTPBasicAuthHandler (password_manager )
1387
- realm = "ACME Widget Store"
1388
- http_handler = MockHTTPHandler (
1389
- 401 , 'WWW-Authenticate: Basic realm=%s\r \n \r \n ' % realm )
1390
- opener .add_handler (auth_handler )
1391
- opener .add_handler (http_handler )
1392
- with self .assertWarns (UserWarning ):
1364
+ def check_basic_auth (self , headers , realm ):
1365
+ with self .subTest (realm = realm , headers = headers ):
1366
+ opener = OpenerDirector ()
1367
+ password_manager = MockPasswordManager ()
1368
+ auth_handler = urllib .request .HTTPBasicAuthHandler (password_manager )
1369
+ body = '\r \n ' .join (headers ) + '\r \n \r \n '
1370
+ http_handler = MockHTTPHandler (401 , body )
1371
+ opener .add_handler (auth_handler )
1372
+ opener .add_handler (http_handler )
1393
1373
self ._test_basic_auth (opener , auth_handler , "Authorization" ,
1394
- realm , http_handler , password_manager ,
1395
- "http://acme.example.com/protected" ,
1396
- "http://acme.example.com/protected" ,
1397
- )
1374
+ realm , http_handler , password_manager ,
1375
+ "http://acme.example.com/protected" ,
1376
+ "http://acme.example.com/protected" )
1377
+
1378
+ def test_basic_auth (self ):
1379
+ realm = "realm2@example.com"
1380
+ realm2 = "realm2@example.com"
1381
+ basic = 'Basic realm="{}"' .format (realm )
1382
+ basic2 = 'Basic realm="{}"' .format (realm2 )
1383
+ other_no_realm = 'Otherscheme xxx'
1384
+ digest = ('Digest realm="{}", '
1385
+ 'qop="auth, auth-int", '
1386
+ 'nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", '
1387
+ 'opaque="5ccc069c403ebaf9f0171e9517f40e41"' ).format (realm2 )
1388
+ for realm_str in (
1389
+ # test "quote" and 'quote'
1390
+ 'Basic realm="{}"' .format (realm ),
1391
+ "Basic realm='{}'" .format (realm ),
1392
+
1393
+ # charset is ignored
1394
+ 'Basic realm="{}", charset="UTF-8"' .format (realm ),
1395
+
1396
+ # Multiple challenges per header
1397
+ '{}, {}' .format (basic , basic2 ),
1398
+ '{}, {}' .format (basic , other_no_realm ),
1399
+ '{}, {}' .format (other_no_realm , basic ),
1400
+ '{}, {}' .format (basic , digest ),
1401
+ '{}, {}' .format (digest , basic ),
1402
+ ):
1403
+ headers = ['WWW-Authenticate: {}' .format (realm_str )]
1404
+ self .check_basic_auth (headers , realm )
1405
+
1406
+ # no quote: expect a warning
1407
+ with support .check_warnings (("Basic Auth Realm was unquoted" ,
1408
+ UserWarning )):
1409
+ headers = ['WWW-Authenticate: Basic realm={}' .format (realm )]
1410
+ self .check_basic_auth (headers , realm )
1411
+
1412
+ # Multiple headers: one challenge per header.
1413
+ # Use the first Basic realm.
1414
+ for challenges in (
1415
+ [basic , basic2 ],
1416
+ [basic , digest ],
1417
+ [digest , basic ],
1418
+ ):
1419
+ headers = ['WWW-Authenticate: {}' .format (challenge )
1420
+ for challenge in challenges ]
1421
+ self .check_basic_auth (headers , realm )
1398
1422
1399
1423
def test_proxy_basic_auth (self ):
1400
1424
opener = OpenerDirector ()
0 commit comments