@@ -117,24 +117,13 @@ class HTTPServer(socketserver.TCPServer):
117117 allow_reuse_address = True # Seems to make sense in testing environment
118118 allow_reuse_port = True
119119
120- def __init__ (self , * args , response_headers = None , ** kwargs ):
121- self .response_headers = response_headers
122- super ().__init__ (* args , ** kwargs )
123-
124120 def server_bind (self ):
125121 """Override server_bind to store the server name."""
126122 socketserver .TCPServer .server_bind (self )
127123 host , port = self .server_address [:2 ]
128124 self .server_name = socket .getfqdn (host )
129125 self .server_port = port
130126
131- def finish_request (self , request , client_address ):
132- """Finish one request by instantiating RequestHandlerClass."""
133- args = (request , client_address , self )
134- kwargs = {}
135- if hasattr (self , 'response_headers' ):
136- kwargs ['response_headers' ] = self .response_headers
137- self .RequestHandlerClass (request , client_address , self , ** kwargs )
138127
139128class ThreadingHTTPServer (socketserver .ThreadingMixIn , HTTPServer ):
140129 daemon_threads = True
@@ -143,7 +132,7 @@ class ThreadingHTTPServer(socketserver.ThreadingMixIn, HTTPServer):
143132class HTTPSServer (HTTPServer ):
144133 def __init__ (self , server_address , RequestHandlerClass ,
145134 bind_and_activate = True , * , certfile , keyfile = None ,
146- password = None , alpn_protocols = None , ** http_server_kwargs ):
135+ password = None , alpn_protocols = None ):
147136 try :
148137 import ssl
149138 except ImportError :
@@ -161,8 +150,7 @@ def __init__(self, server_address, RequestHandlerClass,
161150
162151 super ().__init__ (server_address ,
163152 RequestHandlerClass ,
164- bind_and_activate ,
165- ** http_server_kwargs )
153+ bind_and_activate )
166154
167155 def server_activate (self ):
168156 """Wrap the socket in SSLSocket."""
@@ -726,6 +714,13 @@ def do_HEAD(self):
726714 if f :
727715 f .close ()
728716
717+ def send_custom_response_headers (self ):
718+ """Send the headers stored in self.response_headers"""
719+ # User specified response_headers
720+ if self .response_headers is not None :
721+ for header , value in self .response_headers .items ():
722+ self .send_header (header , value )
723+
729724 def send_head (self ):
730725 """Common code for GET and HEAD commands.
731726
@@ -749,10 +744,6 @@ def send_head(self):
749744 new_url = urllib .parse .urlunsplit (new_parts )
750745 self .send_header ("Location" , new_url )
751746 self .send_header ("Content-Length" , "0" )
752- # User specified response_headers
753- if self .response_headers is not None :
754- for header , value in self .response_headers .items ():
755- self .send_header (header , value )
756747 self .end_headers ()
757748 return None
758749 for index in self .index_pages :
@@ -812,9 +803,7 @@ def send_head(self):
812803 self .send_header ("Content-Length" , str (fs [6 ]))
813804 self .send_header ("Last-Modified" ,
814805 self .date_time_string (fs .st_mtime ))
815- if self .response_headers is not None :
816- for header , value in self .response_headers .items ():
817- self .send_header (header , value )
806+ self .send_custom_response_headers ()
818807 self .end_headers ()
819808 return f
820809 except :
@@ -879,6 +868,7 @@ def list_directory(self, path):
879868 self .send_response (HTTPStatus .OK )
880869 self .send_header ("Content-type" , "text/html; charset=%s" % enc )
881870 self .send_header ("Content-Length" , str (len (encoded )))
871+ self .send_custom_response_headers ()
882872 self .end_headers ()
883873 return f
884874
@@ -990,8 +980,7 @@ def _get_best_family(*address):
990980def test (HandlerClass = BaseHTTPRequestHandler ,
991981 ServerClass = ThreadingHTTPServer ,
992982 protocol = "HTTP/1.0" , port = 8000 , bind = None ,
993- tls_cert = None , tls_key = None , tls_password = None ,
994- response_headers = None ):
983+ tls_cert = None , tls_key = None , tls_password = None ):
995984 """Test the HTTP request handler class.
996985
997986 This runs an HTTP server on port 8000 (or the port argument).
@@ -1002,10 +991,9 @@ def test(HandlerClass=BaseHTTPRequestHandler,
1002991
1003992 if tls_cert :
1004993 server = ServerClass (addr , HandlerClass , certfile = tls_cert ,
1005- keyfile = tls_key , password = tls_password ,
1006- response_headers = response_headers )
994+ keyfile = tls_key , password = tls_password )
1007995 else :
1008- server = ServerClass (addr , HandlerClass , response_headers = response_headers )
996+ server = ServerClass (addr , HandlerClass )
1009997
1010998 with server as httpd :
1011999 host , port = httpd .socket .getsockname ()[:2 ]
@@ -1067,6 +1055,10 @@ def _main(args=None):
10671055 except OSError as e :
10681056 parser .error (f"Failed to read TLS password file: { e } " )
10691057
1058+ response_headers = {}
1059+ for header , value in args .header or []:
1060+ response_headers [header ] = value
1061+
10701062 # ensure dual-stack is not disabled; ref #38907
10711063 class DualStackServerMixin :
10721064
@@ -1080,18 +1072,14 @@ def server_bind(self):
10801072 def finish_request (self , request , client_address ):
10811073 self .RequestHandlerClass (request , client_address , self ,
10821074 directory = args .directory ,
1083- response_headers = self . response_headers )
1075+ response_headers = response_headers )
10841076
10851077 class HTTPDualStackServer (DualStackServerMixin , ThreadingHTTPServer ):
10861078 pass
10871079 class HTTPSDualStackServer (DualStackServerMixin , ThreadingHTTPSServer ):
10881080 pass
10891081
10901082 ServerClass = HTTPSDualStackServer if args .tls_cert else HTTPDualStackServer
1091- response_headers = {}
1092- for header , value in args .header or []:
1093- response_headers [header ] = value
1094-
10951083
10961084 test (
10971085 HandlerClass = SimpleHTTPRequestHandler ,
@@ -1102,7 +1090,6 @@ class HTTPSDualStackServer(DualStackServerMixin, ThreadingHTTPSServer):
11021090 tls_cert = args .tls_cert ,
11031091 tls_key = args .tls_key ,
11041092 tls_password = tls_key_password ,
1105- response_headers = response_headers or None
11061093 )
11071094
11081095
0 commit comments