summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrendan Walker <brendan.walker@pelotoncycle.com>2017-02-14 18:47:09 -0500
committerBrendan Walker <brendan.walker@pelotoncycle.com>2017-02-14 18:47:09 -0500
commiteae693f317eef5e3e18087071bf5749e4566eedb (patch)
tree3d950364f830c18d6b83dd122aee5bf1c98090d0
parenta91f0b108732a993340c52a2f63eb635547ef2c9 (diff)
downloadpymemcache-eae693f317eef5e3e18087071bf5749e4566eedb.tar.gz
Iterating over characters in key once
-rw-r--r--pymemcache/client/base.py31
-rw-r--r--pymemcache/test/test_client.py2
2 files changed, 20 insertions, 13 deletions
diff --git a/pymemcache/client/base.py b/pymemcache/client/base.py
index a842455..7b365f0 100644
--- a/pymemcache/client/base.py
+++ b/pymemcache/client/base.py
@@ -92,20 +92,27 @@ def _check_key(key, allow_unicode_keys, key_prefix=b''):
except (UnicodeEncodeError, UnicodeDecodeError):
raise MemcacheIllegalInputError("Non-ASCII key: '%r'" % (key,))
key = key_prefix + key
- if b' ' in key or b'\n' in key:
- raise MemcacheIllegalInputError(
- "Key contains space and/or newline: '%r'" % (key,)
- )
- if b'\00' in key:
- raise MemcacheIllegalInputError(
- "Key contains null byte: '%r'" % (key,)
- )
- if b'\r\n' in key:
- raise MemcacheIllegalInputError(
- "Key contains carriage return: '%r'" % (key,)
- )
+
if len(key) > 250:
raise MemcacheIllegalInputError("Key is too long: '%r'" % (key,))
+
+ for c in key:
+ if c == b' ':
+ raise MemcacheIllegalInputError(
+ "Key contains space: '%r'" % (key,)
+ )
+ elif c == b'\n':
+ raise MemcacheIllegalInputError(
+ "Key contains newline: '%r'" % (key,)
+ )
+ elif c == b'\00':
+ raise MemcacheIllegalInputError(
+ "Key contains null byte: '%r'" % (key,)
+ )
+ elif c == b'\r':
+ raise MemcacheIllegalInputError(
+ "Key contains carriage return: '%r'" % (key,)
+ )
return key
diff --git a/pymemcache/test/test_client.py b/pymemcache/test/test_client.py
index 329562c..8d17411 100644
--- a/pymemcache/test/test_client.py
+++ b/pymemcache/test/test_client.py
@@ -576,7 +576,7 @@ class TestClient(ClientTestMixin, unittest.TestCase):
client = self.make_client([b''])
def _set():
- client.set(b'key\r\n', b'value', noreply=False)
+ client.set(b'key\r', b'value', noreply=False)
with pytest.raises(MemcacheIllegalInputError):
_set()