@@ -64,6 +64,7 @@ def run(self):
6464 self .request_handler ,
6565 certfile = self .tls [0 ],
6666 keyfile = self .tls [1 ],
67+ password = self .tls [2 ],
6768 )
6869 else :
6970 self .server = HTTPServer (('localhost' , 0 ), self .request_handler )
@@ -333,10 +334,19 @@ def test_head_via_send_error(self):
333334
334335@unittest .skipIf (ssl is None , 'No ssl module' )
335336class BaseHTTPSServerTestCase (BaseTestCase ):
336- tls = (
337- os .path .join (os .path .dirname (__file__ ), "certdata" , "ssl_cert.pem" ),
338- os .path .join (os .path .dirname (__file__ ), "certdata" , "ssl_key.pem" ),
339- )
337+ def _data_file (* name ):
338+ return os .path .join (os .path .dirname (__file__ ), "certdata" , * name )
339+
340+ CERTFILE = _data_file ("keycert.pem" )
341+ ONLYCERT = _data_file ("ssl_cert.pem" )
342+ ONLYKEY = _data_file ("ssl_key.pem" )
343+ CERTFILE_PROTECTED = _data_file ("keycert.passwd.pem" )
344+ ONLYKEY_PROTECTED = _data_file ("ssl_key.passwd.pem" )
345+ KEY_PASSWORD = "somepass"
346+ EMPTYCERT = _data_file ("nullcert.pem" )
347+ BADCERT = _data_file ("badcert.pem" )
348+
349+ tls = (ONLYCERT , ONLYKEY , None ) # values by default
340350
341351 class request_handler (NoLogRequestHandler , SimpleHTTPRequestHandler ):
342352 pass
@@ -354,6 +364,43 @@ def request(self, uri, method='GET', body=None, headers={}):
354364 self .connection .request (method , uri , body , headers )
355365 return self .connection .getresponse ()
356366
367+ def test_valid_certdata (self ):
368+ valid_certdata_examples = (
369+ (self .CERTFILE , None , None ),
370+ (self .CERTFILE , self .CERTFILE , None ),
371+ (self .CERTFILE_PROTECTED , None , self .KEY_PASSWORD ),
372+ (self .ONLYCERT , self .ONLYKEY_PROTECTED , self .KEY_PASSWORD ),
373+ )
374+ for data in valid_certdata_examples :
375+ server = HTTPSServer (
376+ ('localhost' , 0 ),
377+ BaseHTTPRequestHandler ,
378+ certfile = data [0 ],
379+ keyfile = data [1 ],
380+ password = data [2 ],
381+ )
382+ self .assertIsInstance (server , HTTPSServer )
383+ server .server_close ()
384+
385+ def test_invalid_certdata (self ):
386+ invalid_certdata_examples = (
387+ (self .BADCERT , None , None ),
388+ (self .EMPTYCERT , None , None ),
389+ (self .ONLYCERT , None , None ),
390+ (self .ONLYKEY , None , None ),
391+ (self .ONLYKEY , self .ONLYCERT , None ),
392+ (self .CERTFILE_PROTECTED , None , "badpass" ),
393+ )
394+ for data in invalid_certdata_examples :
395+ with self .assertRaises (ssl .SSLError ):
396+ HTTPSServer (
397+ ('localhost' , 0 ),
398+ self .request_handler ,
399+ certfile = data [0 ],
400+ keyfile = data [1 ],
401+ password = data [2 ],
402+ )
403+
357404
358405class RequestHandlerLoggingTestCase (BaseTestCase ):
359406 class request_handler (BaseHTTPRequestHandler ):
0 commit comments