Skip to content

Commit 54bbcce

Browse files
committed
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).
1 parent e6eba23 commit 54bbcce

File tree

2 files changed

+14
-14
lines changed

2 files changed

+14
-14
lines changed

roundup/rest.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
from roundup import hyperdb
2828
from roundup import date
2929
from roundup import actions
30-
from roundup.anypy.strings import bs2b
30+
from roundup.anypy.strings import bs2b, s2b
3131
from roundup.exceptions import *
3232
from roundup.cgi.exceptions import *
3333

@@ -160,7 +160,7 @@ def obtain_etags(headers,input):
160160
etags = []
161161
if '@etag' in input:
162162
etags.append(input['@etag'].value);
163-
etags.append(headers.getheader("ETag", None))
163+
etags.append(headers.get("ETag", None))
164164
return etags
165165

166166
def parse_accept_header(accept):
@@ -220,7 +220,7 @@ def parse_accept_header(accept):
220220
else:
221221
media_params.append((key, value))
222222
result.append((media_type, dict(media_params), q))
223-
result.sort(lambda x, y: -cmp(x[2], y[2]))
223+
result.sort(key=lambda x: x[2], reverse=True)
224224
return result
225225

226226

@@ -1299,7 +1299,7 @@ def dispatch(self, method, uri, input):
12991299
headers = self.client.request.headers
13001300
# Never allow GET to be an unsafe operation (i.e. data changing).
13011301
# User must use POST to "tunnel" DELETE, PUT, OPTIONS etc.
1302-
override = headers.getheader('X-HTTP-Method-Override')
1302+
override = headers.get('X-HTTP-Method-Override')
13031303
output = None
13041304
if override:
13051305
if method.upper() != 'GET':
@@ -1314,7 +1314,7 @@ def dispatch(self, method, uri, input):
13141314
uri)
13151315

13161316
# parse Accept header and get the content type
1317-
accept_header = parse_accept_header(headers.getheader('Accept'))
1317+
accept_header = parse_accept_header(headers.get('Accept'))
13181318
accept_type = "invalid"
13191319
for part in accept_header:
13201320
if part[0] in self.__accepted_content_type:
@@ -1350,7 +1350,7 @@ def dispatch(self, method, uri, input):
13501350
# Is there an input.value with format json data?
13511351
# If so turn it into an object that emulates enough
13521352
# of the FieldStorge methods/props to allow a response.
1353-
content_type_header = headers.getheader('Content-Type', None)
1353+
content_type_header = headers.get('Content-Type', None)
13541354
if type(input.value) == str and content_type_header:
13551355
parsed_content_type_header = content_type_header
13561356
# the structure of a content-type header
@@ -1404,7 +1404,7 @@ def dispatch(self, method, uri, input):
14041404

14051405
# Make output json end in a newline to
14061406
# separate from following text in logs etc..
1407-
return output + "\n"
1407+
return s2b(output + "\n")
14081408

14091409

14101410
class RoundupJSONEncoder(json.JSONEncoder):

test/rest_common.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def setUp(self):
6868
'TRACKER_NAME': 'rounduptest'
6969
}
7070
self.dummy_client = client.Client(self.instance, MockNull(), env, [], None)
71-
self.dummy_client.request.headers.getheader = self.get_header
71+
self.dummy_client.request.headers.get = self.get_header
7272
self.empty_form = cgi.FieldStorage()
7373

7474
self.server = RestfulInstance(self.dummy_client, self.db)
@@ -426,7 +426,7 @@ def testDispatch(self):
426426
form = cgi.FieldStorage(body_file,
427427
headers=headers,
428428
environ=env)
429-
self.server.client.request.headers.getheader=self.get_header
429+
self.server.client.request.headers.get=self.get_header
430430
results = self.server.dispatch('PUT',
431431
"/rest/data/user/%s/realname"%self.joeid,
432432
form)
@@ -455,7 +455,7 @@ def testDispatch(self):
455455
form = cgi.FieldStorage(body_file,
456456
headers=headers,
457457
environ=env)
458-
self.server.client.request.headers.getheader=self.get_header
458+
self.server.client.request.headers.get=self.get_header
459459
results = self.server.dispatch('PUT',
460460
"/rest/data/user/%s/realname"%self.joeid,
461461
form)
@@ -483,7 +483,7 @@ def testDispatch(self):
483483
cgi.MiniFieldStorage('data', 'Joe Doe'),
484484
]
485485
self.headers = headers
486-
self.server.client.request.headers.getheader = self.get_header
486+
self.server.client.request.headers.get = self.get_header
487487
results = self.server.dispatch('PUT',
488488
"/rest/data/user/%s/realname"%self.joeid,
489489
form)
@@ -523,7 +523,7 @@ def testDispatch(self):
523523
form = cgi.FieldStorage(body_file,
524524
headers=headers,
525525
environ=env)
526-
self.server.client.request.headers.getheader=self.get_header
526+
self.server.client.request.headers.get=self.get_header
527527
results = self.server.dispatch('PATCH',
528528
"/rest/data/user/%s"%self.joeid,
529529
form)
@@ -544,7 +544,7 @@ def testDispatch(self):
544544
form = cgi.FieldStorage(body_file,
545545
headers=headers,
546546
environ=env)
547-
self.server.client.request.headers.getheader=self.get_header
547+
self.server.client.request.headers.get=self.get_header
548548
results = self.server.dispatch('PATCH',
549549
"/rest/data/user/%s"%self.joeid,
550550
form)
@@ -571,7 +571,7 @@ def testDispatch(self):
571571
form = cgi.FieldStorage(body_file,
572572
headers=headers,
573573
environ=env)
574-
self.server.client.request.headers.getheader=self.get_header
574+
self.server.client.request.headers.get=self.get_header
575575
results = self.server.dispatch('POST',
576576
"/rest/data/issue",
577577
form)

0 commit comments

Comments
 (0)