Skip to content

Commit fe695fb

Browse files
committed
Now correctly using urlencode for query parameters. Also handling unicode by converting to utf-8.
1 parent 6d5e94f commit fe695fb

3 files changed

Lines changed: 47 additions & 11 deletions

File tree

apiclient/discovery.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import re
2828
import simplejson
2929
import uritemplate
30+
import urllib
3031
import urlparse
3132

3233

@@ -93,10 +94,13 @@ def request(self, headers, path_params, query_params, body_value):
9394
return (headers, path_params, query, simplejson.dumps(model))
9495

9596
def build_query(self, params):
96-
query = '?alt=json&prettyprint=true'
97-
for key,value in params.iteritems():
98-
query += '&%s=%s' % (key, value)
99-
return query
97+
params.update({'alt': 'json', 'prettyprint': 'true'})
98+
astuples = []
99+
for key, value in params.iteritems():
100+
if getattr(value, 'encode', False) and callable(value.encode):
101+
value = value.encode('utf-8')
102+
astuples.append((key, value))
103+
return '?' + urllib.urlencode(astuples)
100104

101105
def response(self, resp, content):
102106
# Error handling is TBD, for example, do we retry

runtests.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
#!/usr/bin/env python
2-
import glob, unittest, os, sys
2+
import glob
3+
import logging
4+
import os
5+
import sys
6+
import unittest
37

48
from trace import fullmodname
59
try:
@@ -10,6 +14,20 @@ def cleanup():
1014

1115
sys.path.insert(0, os.getcwd())
1216

17+
verbosity = 1
18+
if "-q" in sys.argv or '--quiet' in sys.argv:
19+
verbosity = 0
20+
if "-v" in sys.argv or '--verbose' in sys.argv:
21+
verbosity = 2
22+
23+
if verbosity == 0:
24+
logging.disable(logging.CRITICAL)
25+
elif verbosity == 1:
26+
logging.disable(logging.ERROR)
27+
elif verbosity == 2:
28+
logging.basicConfig(level=logging.DEBUG)
29+
30+
1331
def build_suite(folder):
1432
# find all of the test modules
1533
modules = map(fullmodname, glob.glob(os.path.join(folder, 'test_*.py')))
@@ -25,12 +43,6 @@ def build_suite(folder):
2543
__import__(module)
2644
raise
2745

28-
verbosity = 1
29-
if "-q" in sys.argv or '--quiet' in sys.argv:
30-
verbosity = 0
31-
if "-v" in sys.argv or '--verbose' in sys.argv:
32-
verbosity = 2
33-
3446
unit_tests = build_suite('tests')
3547
functional_tests = build_suite('functional_tests')
3648

tests/test_json_model.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from apiclient.discovery import JsonModel
2525
import os
2626
import unittest
27+
import urlparse
2728

2829

2930
class Model(unittest.TestCase):
@@ -57,5 +58,24 @@ def test_json_body(self):
5758
self.assertNotEqual(query, '')
5859
self.assertEqual(body, '{"data": {}}')
5960

61+
def test_json_build_query(self):
62+
model = JsonModel()
63+
64+
headers = {}
65+
path_params = {}
66+
query_params = {'foo': 1, 'bar': u'\N{COMET}'}
67+
body = {}
68+
69+
headers, params, query, body = model.request(headers, path_params, query_params, body)
70+
71+
self.assertEqual(headers['accept'], 'application/json')
72+
self.assertEqual(headers['content-type'], 'application/json')
73+
74+
query_dict = urlparse.parse_qs(query)
75+
self.assertEqual(query_dict['foo'], ['1'])
76+
self.assertEqual(query_dict['bar'], [u'\N{COMET}'.encode('utf-8')])
77+
self.assertEqual(body, '{"data": {}}')
78+
79+
6080
if __name__ == '__main__':
6181
unittest.main()

0 commit comments

Comments
 (0)