@@ -321,10 +321,13 @@ def setUp(self):
321321 self .cwd = os .getcwd ()
322322 self .parent_dir = tempfile .mkdtemp ()
323323 self .cgi_dir = os .path .join (self .parent_dir , 'cgi-bin' )
324+ self .cgi_child_dir = os .path .join (self .cgi_dir , 'child-dir' )
324325 os .mkdir (self .cgi_dir )
326+ os .mkdir (self .cgi_child_dir )
325327 self .nocgi_path = None
326328 self .file1_path = None
327329 self .file2_path = None
330+ self .file3_path = None
328331
329332 # The shebang line should be pure ASCII: use symlink if possible.
330333 # See issue #7668.
@@ -358,6 +361,11 @@ def setUp(self):
358361 file2 .write (cgi_file2 % self .pythonexe )
359362 os .chmod (self .file2_path , 0o777 )
360363
364+ self .file3_path = os .path .join (self .cgi_child_dir , 'file3.py' )
365+ with open (self .file3_path , 'w' , encoding = 'utf-8' ) as file3 :
366+ file3 .write (cgi_file1 % self .pythonexe )
367+ os .chmod (self .file3_path , 0o777 )
368+
361369 os .chdir (self .parent_dir )
362370
363371 def tearDown (self ):
@@ -371,6 +379,9 @@ def tearDown(self):
371379 os .remove (self .file1_path )
372380 if self .file2_path :
373381 os .remove (self .file2_path )
382+ if self .file3_path :
383+ os .remove (self .file3_path )
384+ os .rmdir (self .cgi_child_dir )
374385 os .rmdir (self .cgi_dir )
375386 os .rmdir (self .parent_dir )
376387 finally :
@@ -466,6 +477,11 @@ def test_urlquote_decoding_in_cgi_check(self):
466477 self .assertEqual ((b'Hello World' + self .linesep , 'text/html' , 200 ),
467478 (res .read (), res .getheader ('Content-type' ), res .status ))
468479
480+ def test_nested_cgi_path_issue21323 (self ):
481+ res = self .request ('/cgi-bin/child-dir/file3.py' )
482+ self .assertEqual ((b'Hello World' + self .linesep , 'text/html' , 200 ),
483+ (res .read (), res .getheader ('Content-type' ), res .status ))
484+
469485
470486class SocketlessRequestHandler (SimpleHTTPRequestHandler ):
471487 def __init__ (self ):
0 commit comments