Skip to content

Commit 4436ea7

Browse files
author
j.s@google.com
committed
Calls to gdata.service.Delete will now pass along URL parameters. Resolves issue 244.
1 parent 19e7388 commit 4436ea7

3 files changed

Lines changed: 50 additions & 12 deletions

File tree

src/atom/mock_http_core.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,12 @@ class SettableHttpClient(object):
246246
"""An HTTP Client which responds with the data given in set_response."""
247247

248248
def __init__(self, status, reason, body, headers):
249+
"""Configures the response for the server.
250+
251+
See set_response for details on the arguments to the constructor.
252+
"""
249253
self.set_response(status, reason, body, headers)
254+
self.last_request = None
250255

251256
def set_response(self, status, reason, body, headers):
252257
"""Determines the response which will be sent for each request.
@@ -263,6 +268,7 @@ def set_response(self, status, reason, body, headers):
263268
self.response._headers = headers.copy()
264269

265270
def request(self, http_request):
271+
self.last_request = http_request
266272
return self.response
267273

268274

src/gdata/service.py

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,10 @@ def __init__(self, email=None, password=None, account_type='HOSTED_OR_GOOGLE',
282282
if http_request_handler.__name__ == 'gdata.urlfetch':
283283
import gdata.alt.appengine
284284
self.http_client = gdata.alt.appengine.AppEngineHttpClient()
285+
286+
def _SetSessionId(self, session_id):
287+
"""Used in unit tests to simulate a 302 which sets a gsessionid."""
288+
self.__gsessionid = session_id
285289

286290
# Define properties for GDataService
287291
def _SetAuthSubToken(self, auth_token, scopes=None):
@@ -1213,10 +1217,9 @@ def PostOrPut(self, verb, data, uri, extra_headers=None, url_params=None,
12131217

12141218
if self.__gsessionid is not None:
12151219
if uri.find('gsessionid=') < 0:
1216-
if uri.find('?') > -1:
1217-
uri += '&gsessionid=%s' % (self.__gsessionid,)
1218-
else:
1219-
uri += '?gsessionid=%s' % (self.__gsessionid,)
1220+
if url_params is None:
1221+
url_params = {}
1222+
url_params['gsessionid'] = self.__gsessionid
12201223

12211224
if data and media_source:
12221225
if ElementTree.iselement(data):
@@ -1239,7 +1242,7 @@ def PostOrPut(self, verb, data, uri, extra_headers=None, url_params=None,
12391242
extra_headers['Content-Type'] = 'multipart/related; boundary=END_OF_PART'
12401243
server_response = self.request(verb, uri,
12411244
data=[multipart[0], data_str, multipart[1], media_source.file_handle,
1242-
multipart[2]], headers=extra_headers)
1245+
multipart[2]], headers=extra_headers, url_params=url_params)
12431246
result_body = server_response.read()
12441247

12451248
elif media_source or isinstance(data, gdata.MediaSource):
@@ -1248,15 +1251,16 @@ def PostOrPut(self, verb, data, uri, extra_headers=None, url_params=None,
12481251
extra_headers['Content-Length'] = str(media_source.content_length)
12491252
extra_headers['Content-Type'] = media_source.content_type
12501253
server_response = self.request(verb, uri,
1251-
data=media_source.file_handle, headers=extra_headers)
1254+
data=media_source.file_handle, headers=extra_headers,
1255+
url_params=url_params)
12521256
result_body = server_response.read()
12531257

12541258
else:
12551259
http_data = data
12561260
content_type = 'application/atom+xml'
12571261
extra_headers['Content-Type'] = content_type
12581262
server_response = self.request(verb, uri, data=http_data,
1259-
headers=extra_headers)
1263+
headers=extra_headers, url_params=url_params)
12601264
result_body = server_response.read()
12611265

12621266
# Server returns 201 for most post requests, but when performing a batch
@@ -1358,13 +1362,12 @@ def Delete(self, uri, extra_headers=None, url_params=None,
13581362

13591363
if self.__gsessionid is not None:
13601364
if uri.find('gsessionid=') < 0:
1361-
if uri.find('?') > -1:
1362-
uri += '&gsessionid=%s' % (self.__gsessionid,)
1363-
else:
1364-
uri += '?gsessionid=%s' % (self.__gsessionid,)
1365+
if url_params is None:
1366+
url_params = {}
1367+
url_params['gsessionid'] = self.__gsessionid
13651368

13661369
server_response = self.request('DELETE', uri,
1367-
headers=extra_headers)
1370+
headers=extra_headers, url_params=url_params)
13681371
result_body = server_response.read()
13691372

13701373
if server_response.status == 200:

tests/gdata_tests/service_test.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import os.path
3333
from gdata import test_data
3434
import atom.mock_http
35+
import atom.mock_http_core
3536

3637

3738
username = ''
@@ -387,6 +388,34 @@ def testCaptchaUrlGeneration(self):
387388
self.assertEquals(self.gd_client.captcha_url,
388389
('https://www.google.com/accounts/Captcha?ctoken=HiteT4b0Bk5Xg18_'
389390
'AcVoP6-yFkHPibe7O9EqxeiI7lUSN'))
391+
392+
393+
class DeleteWithUrlParamsTest(unittest.TestCase):
394+
395+
def setUp(self):
396+
self.gd_client = gdata.service.GDataService()
397+
# Set the client to echo the request back in the response.
398+
self.gd_client.http_client.v2_http_client = (
399+
atom.mock_http_core.SettableHttpClient(200, 'OK', '', {}))
400+
401+
def testDeleteWithUrlParams(self):
402+
self.assertTrue(self.gd_client.Delete('http://example.com/test',
403+
{'TestHeader': '123'}, {'urlParam1': 'a', 'urlParam2': 'test'}))
404+
request = self.gd_client.http_client.v2_http_client.last_request
405+
self.assertEqual(request.uri.host, 'example.com')
406+
self.assertEqual(request.uri.path, '/test')
407+
self.assertEqual(request.uri.query,
408+
{'urlParam1': 'a', 'urlParam2': 'test'})
409+
410+
def testDeleteWithSessionId(self):
411+
self.gd_client._SetSessionId('test_session_id')
412+
self.assertTrue(self.gd_client.Delete('http://example.com/test',
413+
{'TestHeader': '123'}, {'urlParam1': 'a', 'urlParam2': 'test'}))
414+
request = self.gd_client.http_client.v2_http_client.last_request
415+
self.assertEqual(request.uri.host, 'example.com')
416+
self.assertEqual(request.uri.path, '/test')
417+
self.assertEqual(request.uri.query, {'urlParam1': 'a',
418+
'urlParam2': 'test', 'gsessionid': 'test_session_id'})
390419

391420

392421
class QueryTest(unittest.TestCase):

0 commit comments

Comments
 (0)