Mercurial > p > roundup > code
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: |
