Mercurial > p > roundup > code
changeset 5650:e8ca7072c629
Fix Python 3 issues in REST code.
* Need to use .get not .getheader for HTTP headers (see hg commit
fec18298ae02, "Python 3 preparation: HTTP headers handling in
roundup_server.py.").
* Need to use key not cmp with sort (see hg commit 3fa026621f69,
"Python 3 preparation: comparisons.").
* dispatch output must be bytes, not str, otherwise writing it to the
socket (e.g. in roundup-server) will fail.
This fixes issues shown up attempting to access the REST interface
with a browser with Python 3 (as opposed to with the Roundup
testsuite, which also has known REST issues with Python 3).
| author | Joseph Myers <jsm@polyomino.org.uk> |
|---|---|
| date | Sun, 17 Mar 2019 16:25:36 +0000 |
| parents | f8893e1cde0d |
| children | a02ef29b4242 |
| files | roundup/rest.py test/rest_common.py |
| diffstat | 2 files changed, 14 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/roundup/rest.py Fri Mar 15 20:29:00 2019 -0400 +++ b/roundup/rest.py Sun Mar 17 16:25:36 2019 +0000 @@ -27,7 +27,7 @@ from roundup import hyperdb from roundup import date from roundup import actions -from roundup.anypy.strings import bs2b +from roundup.anypy.strings import bs2b, s2b from roundup.exceptions import * from roundup.cgi.exceptions import * @@ -160,7 +160,7 @@ etags = [] if '@etag' in input: etags.append(input['@etag'].value); - etags.append(headers.getheader("ETag", None)) + etags.append(headers.get("ETag", None)) return etags def parse_accept_header(accept): @@ -220,7 +220,7 @@ else: media_params.append((key, value)) result.append((media_type, dict(media_params), q)) - result.sort(lambda x, y: -cmp(x[2], y[2])) + result.sort(key=lambda x: x[2], reverse=True) return result @@ -1299,7 +1299,7 @@ headers = self.client.request.headers # Never allow GET to be an unsafe operation (i.e. data changing). # User must use POST to "tunnel" DELETE, PUT, OPTIONS etc. - override = headers.getheader('X-HTTP-Method-Override') + override = headers.get('X-HTTP-Method-Override') output = None if override: if method.upper() != 'GET': @@ -1314,7 +1314,7 @@ uri) # parse Accept header and get the content type - accept_header = parse_accept_header(headers.getheader('Accept')) + accept_header = parse_accept_header(headers.get('Accept')) accept_type = "invalid" for part in accept_header: if part[0] in self.__accepted_content_type: @@ -1350,7 +1350,7 @@ # Is there an input.value with format json data? # If so turn it into an object that emulates enough # of the FieldStorge methods/props to allow a response. - content_type_header = headers.getheader('Content-Type', None) + content_type_header = headers.get('Content-Type', None) if type(input.value) == str and content_type_header: parsed_content_type_header = content_type_header # the structure of a content-type header @@ -1404,7 +1404,7 @@ # Make output json end in a newline to # separate from following text in logs etc.. - return output + "\n" + return s2b(output + "\n") class RoundupJSONEncoder(json.JSONEncoder):
--- a/test/rest_common.py Fri Mar 15 20:29:00 2019 -0400 +++ b/test/rest_common.py Sun Mar 17 16:25:36 2019 +0000 @@ -68,7 +68,7 @@ 'TRACKER_NAME': 'rounduptest' } self.dummy_client = client.Client(self.instance, MockNull(), env, [], None) - self.dummy_client.request.headers.getheader = self.get_header + self.dummy_client.request.headers.get = self.get_header self.empty_form = cgi.FieldStorage() self.server = RestfulInstance(self.dummy_client, self.db) @@ -426,7 +426,7 @@ form = cgi.FieldStorage(body_file, headers=headers, environ=env) - self.server.client.request.headers.getheader=self.get_header + self.server.client.request.headers.get=self.get_header results = self.server.dispatch('PUT', "/rest/data/user/%s/realname"%self.joeid, form) @@ -455,7 +455,7 @@ form = cgi.FieldStorage(body_file, headers=headers, environ=env) - self.server.client.request.headers.getheader=self.get_header + self.server.client.request.headers.get=self.get_header results = self.server.dispatch('PUT', "/rest/data/user/%s/realname"%self.joeid, form) @@ -483,7 +483,7 @@ cgi.MiniFieldStorage('data', 'Joe Doe'), ] self.headers = headers - self.server.client.request.headers.getheader = self.get_header + self.server.client.request.headers.get = self.get_header results = self.server.dispatch('PUT', "/rest/data/user/%s/realname"%self.joeid, form) @@ -523,7 +523,7 @@ form = cgi.FieldStorage(body_file, headers=headers, environ=env) - self.server.client.request.headers.getheader=self.get_header + self.server.client.request.headers.get=self.get_header results = self.server.dispatch('PATCH', "/rest/data/user/%s"%self.joeid, form) @@ -544,7 +544,7 @@ form = cgi.FieldStorage(body_file, headers=headers, environ=env) - self.server.client.request.headers.getheader=self.get_header + self.server.client.request.headers.get=self.get_header results = self.server.dispatch('PATCH', "/rest/data/user/%s"%self.joeid, form) @@ -571,7 +571,7 @@ form = cgi.FieldStorage(body_file, headers=headers, environ=env) - self.server.client.request.headers.getheader=self.get_header + self.server.client.request.headers.get=self.get_header results = self.server.dispatch('POST', "/rest/data/issue", form)
