diff --git a/kyototycoon/kt_http.py b/kyototycoon/kt_http.py index b594d07..0e55c42 100644 --- a/kyototycoon/kt_http.py +++ b/kyototycoon/kt_http.py @@ -26,6 +26,8 @@ class ProtocolHandler: def __init__(self, pickle_protocol=2): self.error_obj = kt_error.KyotoTycoonError() self.pickle_protocol = pickle_protocol + self.pack = self._pickle_packer + self.unpack = self._pickle_unpacker def error(self): return self.error_obj @@ -51,12 +53,18 @@ def echo(self): return True if res.status == 200 else False def get(self, key): - if key is None: return False + if key is None: + return False + key = urllib.quote(key.encode('UTF-8')) self.conn.request('GET', key) rv = self.conn.getresponse() body = rv.read() - return body if rv.status == 200 else None + + if rv.status != 200: + return None + + return self.unpack(body) def get_int(self, key): if key is None: return False @@ -73,11 +81,9 @@ def get_int(self, key): def set(self, key, value, expire): if key is None: return False - if not isinstance(value, str): - value = str(value) key = urllib.quote(key.encode('UTF-8')) - value = value.encode('UTF-8') + value = self.pack(value) return self._rest_put(key, value, expire) == 201 def set_int(self, key, value, expire): @@ -91,18 +97,16 @@ def set_int(self, key, value, expire): return self._rest_put(key, value, expire) == 201 def add(self, key, value, expire): - if key is None: return False + if key is None: + return False headers = { 'X-Kt-Mode' : 'add' } if expire != None: expire = int(time.time()) + expire; headers["X-Kt-Xt"] = str(expire) - if not isinstance(value, str): - value = str(value) - key = urllib.quote(key.encode('UTF-8')) - value = value.encode('UTF-8') + value = self.pack(value) self.conn.request('PUT', key, value, headers) rv = self.conn.getresponse() @@ -125,12 +129,9 @@ def replace(self, key, value, expire): if expire != None: expire = int(time.time()) + expire; headers["X-Kt-Xt"] = str(expire) - - if not isinstance(value, str): - value = str(value) key = urllib.quote(key.encode('UTF-8')) - value = value.encode('UTF-8') + value = self.pack(value) self.conn.request('PUT', key, value, headers) rv = self.conn.getresponse() diff --git a/tests/t_simple.py b/tests/t_simple.py index c1d11d0..e057c4a 100644 --- a/tests/t_simple.py +++ b/tests/t_simple.py @@ -36,20 +36,15 @@ def test_set(self): self.assertFalse(self.kt_handle.get(None)) self.assertTrue(self.kt_handle.set('cb', 1791)) - self.assertEqual(self.kt_handle.get('cb'), '1791') + self.assertEqual(self.kt_handle.get('cb'), 1791) self.assertTrue(self.kt_handle.set('cb', 1791.1226)) - self.assertEqual(self.kt_handle.get('cb'), '1791.1226') + self.assertEqual(self.kt_handle.get('cb'), 1791.1226) def test_set_int(self): self.assertTrue(self.kt_handle.clear()) self.assertTrue(self.kt_handle.set_int('key', 1984)) - - # get() would fail due to the default serializer. - self.failIf(self.kt_handle.get('key') == 1984) - # get_int() must succeed. self.assertEqual(self.kt_handle.get_int('key'), 1984) - # this must fail since set_int() only accepts an integer. self.assertFalse(self.kt_handle.set_int('key', '1984')) def test_remove(self): @@ -72,9 +67,9 @@ def test_replace(self): self.assertFalse(self.kt_handle.replace(None, 'value')) self.assertTrue(self.kt_handle.replace('apple', 212)) - self.assertEqual(self.kt_handle.get('apple'), '212') + self.assertEqual(self.kt_handle.get('apple'), 212) self.assertTrue(self.kt_handle.replace('apple', 121)) - self.assertEqual(self.kt_handle.get('apple'), '121') + self.assertEqual(self.kt_handle.get('apple'), 121) def test_add(self): self.assertTrue(self.kt_handle.clear()) @@ -91,7 +86,7 @@ def test_add(self): self.assertFalse(self.kt_handle.add(None, 'value')) self.assertTrue(self.kt_handle.add('number', 111)) - self.assertEqual(self.kt_handle.get('number'), '111') + self.assertEqual(self.kt_handle.get('number'), 111) def test_large_key(self): large_key = 'x' * self.LARGE_KEY_LEN