Mercurial > hg
comparison mercurial/hgweb/server.py @ 39954:8c7ecd32ccce
py3: use system strings in HTTP server code
Previously the source transformer was converting some string literals
to bytes and we were comparing a system native string to bytes
and this was leading to sending the wrong HTTP response headers on
Python 3.
After this change, we now properly send Transfer-Encoding and
Connection response headers on Python 3.
Differential Revision: https://phab.mercurial-scm.org/D4833
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Mon, 01 Oct 2018 23:12:42 -0700 |
parents | d1e0b905c59d |
children | 348352658e4b 197f092b2cd9 |
comparison
equal
deleted
inserted
replaced
39953:a3a9b93bff80 | 39954:8c7ecd32ccce |
---|---|
203 self.send_response(*saved_status) | 203 self.send_response(*saved_status) |
204 self.length = None | 204 self.length = None |
205 self._chunked = False | 205 self._chunked = False |
206 for h in self.saved_headers: | 206 for h in self.saved_headers: |
207 self.send_header(*h) | 207 self.send_header(*h) |
208 if h[0].lower() == 'content-length': | 208 if h[0].lower() == r'content-length': |
209 self.length = int(h[1]) | 209 self.length = int(h[1]) |
210 if (self.length is None and | 210 if (self.length is None and |
211 saved_status[0] != common.HTTP_NOT_MODIFIED): | 211 saved_status[0] != common.HTTP_NOT_MODIFIED): |
212 self._chunked = (not self.close_connection and | 212 self._chunked = (not self.close_connection and |
213 self.request_version == "HTTP/1.1") | 213 self.request_version == r'HTTP/1.1') |
214 if self._chunked: | 214 if self._chunked: |
215 self.send_header(r'Transfer-Encoding', r'chunked') | 215 self.send_header(r'Transfer-Encoding', r'chunked') |
216 else: | 216 else: |
217 self.send_header(r'Connection', r'close') | 217 self.send_header(r'Connection', r'close') |
218 self.end_headers() | 218 self.end_headers() |
221 def _start_response(self, http_status, headers, exc_info=None): | 221 def _start_response(self, http_status, headers, exc_info=None): |
222 assert isinstance(http_status, str) | 222 assert isinstance(http_status, str) |
223 code, msg = http_status.split(None, 1) | 223 code, msg = http_status.split(None, 1) |
224 code = int(code) | 224 code = int(code) |
225 self.saved_status = http_status | 225 self.saved_status = http_status |
226 bad_headers = ('connection', 'transfer-encoding') | 226 bad_headers = (r'connection', r'transfer-encoding') |
227 self.saved_headers = [h for h in headers | 227 self.saved_headers = [h for h in headers |
228 if h[0].lower() not in bad_headers] | 228 if h[0].lower() not in bad_headers] |
229 return self._write | 229 return self._write |
230 | 230 |
231 def _write(self, data): | 231 def _write(self, data): |