comparison roundup/cgi/client.py @ 5653:ba67e397f063

Fix string/bytes issues under python 3. 1) cgi/client.py: override cgi.FieldStorage's make_file so that file is always created in binary/byte mode. This means that json (and xml) are bytes not strings. 2) rest.py: try harder to find dicttoxml in roundup directory or on sys.path. This just worked under python 2 but python 3 only searches sys.path by default and does not search relative like python 2. 3) rest.py: replace headers.getheader call removed from python 3 with equivalent code. 4) rest.py: make value returned from dispatch into bytes not string. 5) test/caseinsensitivedict.py, test/test_CaseInsensitiveDict.py: get code from stackoverflow that implements a case insensitive key dict. So dict['foo'], dict['Foo'] are the same entry. Used for looking up headers in mocked http rewuset header array. 6) test/rest_common.py: rework tests for etags and rest to properly supply bytes to the called routines. Calls to s2b and b2s and use of BytesIO and overriding make_file in cgi.FieldStorage to try to make sure it works under python 3.
author John Rouillard <rouilj@ieee.org>
date Sun, 17 Mar 2019 19:28:26 -0400
parents b3618882f906
children 207e0f5d551c
comparison
equal deleted inserted replaced
5652:9689d1bf9bb0 5653:ba67e397f063
373 if 'CONTENT_LENGTH' not in self.env: 373 if 'CONTENT_LENGTH' not in self.env:
374 self.env['CONTENT_LENGTH'] = 0 374 self.env['CONTENT_LENGTH'] = 0
375 logger.debug("Setting CONTENT_LENGTH to 0 for method: %s", 375 logger.debug("Setting CONTENT_LENGTH to 0 for method: %s",
376 self.env['REQUEST_METHOD']) 376 self.env['REQUEST_METHOD'])
377 377
378 # cgi.FieldStorage must save all data as
379 # binary/bytes. This is needed for handling json and xml
380 # data blobs under python 3. Under python 2, str and binary
381 # are interchangable, not so under 3.
382 def make_file(self):
383 import tempfile
384 return tempfile.TemporaryFile("wb+")
385
386 saved_make_file = cgi.FieldStorage.make_file
387 cgi.FieldStorage.make_file = make_file
378 self.form = cgi.FieldStorage(fp=request.rfile, environ=env) 388 self.form = cgi.FieldStorage(fp=request.rfile, environ=env)
389 cgi.FieldStorage.make_file = saved_make_file
379 # In some case (e.g. content-type application/xml), cgi 390 # In some case (e.g. content-type application/xml), cgi
380 # will not parse anything. Fake a list property in this case 391 # will not parse anything. Fake a list property in this case
381 if self.form.list is None: 392 if self.form.list is None:
382 self.form.list = [] 393 self.form.list = []
383 else: 394 else:

Roundup Issue Tracker: http://roundup-tracker.org/