@@ -346,10 +346,13 @@ def setUp(self):
346346 self .cwd = os .getcwd ()
347347 self .parent_dir = tempfile .mkdtemp ()
348348 self .cgi_dir = os .path .join (self .parent_dir , 'cgi-bin' )
349+ self .cgi_child_dir = os .path .join (self .cgi_dir , 'child-dir' )
349350 os .mkdir (self .cgi_dir )
351+ os .mkdir (self .cgi_child_dir )
350352 self .nocgi_path = None
351353 self .file1_path = None
352354 self .file2_path = None
355+ self .file3_path = None
353356
354357 # The shebang line should be pure ASCII: use symlink if possible.
355358 # See issue #7668.
@@ -383,6 +386,11 @@ def setUp(self):
383386 file2 .write (cgi_file2 % self .pythonexe )
384387 os .chmod (self .file2_path , 0o777 )
385388
389+ self .file3_path = os .path .join (self .cgi_child_dir , 'file3.py' )
390+ with open (self .file3_path , 'w' , encoding = 'utf-8' ) as file3 :
391+ file3 .write (cgi_file1 % self .pythonexe )
392+ os .chmod (self .file3_path , 0o777 )
393+
386394 os .chdir (self .parent_dir )
387395
388396 def tearDown (self ):
@@ -396,6 +404,9 @@ def tearDown(self):
396404 os .remove (self .file1_path )
397405 if self .file2_path :
398406 os .remove (self .file2_path )
407+ if self .file3_path :
408+ os .remove (self .file3_path )
409+ os .rmdir (self .cgi_child_dir )
399410 os .rmdir (self .cgi_dir )
400411 os .rmdir (self .parent_dir )
401412 finally :
@@ -491,6 +502,11 @@ def test_urlquote_decoding_in_cgi_check(self):
491502 self .assertEqual ((b'Hello World' + self .linesep , 'text/html' , 200 ),
492503 (res .read (), res .getheader ('Content-type' ), res .status ))
493504
505+ def test_nested_cgi_path_issue21323 (self ):
506+ res = self .request ('/cgi-bin/child-dir/file3.py' )
507+ self .assertEqual ((b'Hello World' + self .linesep , 'text/html' , 200 ),
508+ (res .read (), res .getheader ('Content-type' ), res .status ))
509+
494510
495511class SocketlessRequestHandler (SimpleHTTPRequestHandler ):
496512 def __init__ (self ):
0 commit comments