comparison mercurial/hgweb/request.py @ 36858:01f6bba64424

hgweb: remove support for POST form data (BC) Previously, we called out to cgi.parse(), which for POST requests parsed multipart/form-data and application/x-www-form-urlencoded Content-Type requests for form data, combined it with query string parameters, returned a union of the values. As far as I know, nothing in Mercurial actually uses this mechanism to submit data to the HTTP server. The wire protocol has its own mechanism for passing parameters. And the web interface only does GET requests. Removing support for parsing POST data doesn't break any tests. Another reason to not like this feature is that cgi.parse() may modify the QUERY_STRING environment variable as a side-effect. In addition, it merges both POST data and the query string into one data structure. This prevents consumers from knowing whether a variable came from the query string or POST data. That can matter for some operations. I suspect we use cgi.parse() because back when this code was initially implemented, it was the function that was readily available. In other words, I don't think there was conscious choice to support POST data: we just got it because cgi.parse() supported it. Since nothing uses the feature and it is untested, let's remove support for parsing POST form data. We can add it back in easily enough if we need it in the future. .. bc:: Hgweb no longer reads form data in POST requests from multipart/form-data and application/x-www-form-urlencoded requests. Arguments should be specified as URL path components or in the query string in the URL instead. Differential Revision: https://phab.mercurial-scm.org/D2774
author Gregory Szorc <gregory.szorc@gmail.com>
date Sat, 10 Mar 2018 11:07:53 -0800
parents da4e2f87167d
children 422be99519e5
comparison
equal deleted inserted replaced
36857:da4e2f87167d 36858:01f6bba64424
6 # This software may be used and distributed according to the terms of the 6 # This software may be used and distributed according to the terms of the
7 # GNU General Public License version 2 or any later version. 7 # GNU General Public License version 2 or any later version.
8 8
9 from __future__ import absolute_import 9 from __future__ import absolute_import
10 10
11 import cgi
12 import errno 11 import errno
13 import socket 12 import socket
14 import wsgiref.headers as wsgiheaders 13 import wsgiref.headers as wsgiheaders
15 #import wsgiref.validate 14 #import wsgiref.validate
16 15
256 self.err = wsgienv[r'wsgi.errors'] 255 self.err = wsgienv[r'wsgi.errors']
257 self.threaded = wsgienv[r'wsgi.multithread'] 256 self.threaded = wsgienv[r'wsgi.multithread']
258 self.multiprocess = wsgienv[r'wsgi.multiprocess'] 257 self.multiprocess = wsgienv[r'wsgi.multiprocess']
259 self.run_once = wsgienv[r'wsgi.run_once'] 258 self.run_once = wsgienv[r'wsgi.run_once']
260 self.env = wsgienv 259 self.env = wsgienv
261 self.form = normalize(cgi.parse(inp, 260 self.req = parserequestfromenv(wsgienv, inp)
262 self.env, 261 self.form = normalize(self.req.querystringdict)
263 keep_blank_values=1))
264 self._start_response = start_response 262 self._start_response = start_response
265 self.server_write = None 263 self.server_write = None
266 self.headers = [] 264 self.headers = []
267
268 self.req = parserequestfromenv(wsgienv, inp)
269 265
270 def respond(self, status, type, filename=None, body=None): 266 def respond(self, status, type, filename=None, body=None):
271 if not isinstance(type, str): 267 if not isinstance(type, str):
272 type = pycompat.sysstr(type) 268 type = pycompat.sysstr(type)
273 if self._start_response is not None: 269 if self._start_response is not None: