Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
ISPN-780 - Memcached key limit not working with get/gets commands
Check needed to apply to readKeys method so that get/gets commands where
also covered by the key length check.
  • Loading branch information
galderz committed Nov 18, 2010
1 parent 48ba6bb commit eae7884
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 12 deletions.
Expand Up @@ -9,6 +9,7 @@ import java.util.Properties
import org.infinispan.util.{TypedProperties, Util}
import org.infinispan.config.{Configuration, GlobalConfiguration}
import org.infinispan.manager.{EmbeddedCacheManager, CacheContainer, DefaultCacheManager}
import org.infinispan.config.GlobalConfiguration.ShutdownHookBehavior

/**
* Main class for server startup.
Expand Down
Expand Up @@ -49,31 +49,29 @@ class MemcachedDecoder(cache: Cache[String, MemcachedValue], scheduler: Schedule
new RequestHeader(op.get)
}

override def readKey(h: RequestHeader, b: ChannelBuffer): String = {
val k = readElement(b)
if (k.length > 250) throw new ServerException(h, new IOException("Key length over the 250 character limit")) else k
}
override def readKey(h: RequestHeader, b: ChannelBuffer): String = checkKeyLength(h, readElement(b))

private def readKeys(h: RequestHeader, b: ChannelBuffer): Array[String] = {
val line = readLine(b)
line.trim.split(" +")
}
private def readKeys(b: ChannelBuffer): Array[String] = readLine(b).trim.split(" +")

override protected def get(h: RequestHeader, buffer: ChannelBuffer, cache: Cache[String, MemcachedValue]): AnyRef = {
val keys = readKeys(h, buffer)
val keys = readKeys(buffer)
if (keys.length > 1) {
val map = new HashMap[String, MemcachedValue]()
for (k <- keys) {
val v = cache.get(k)
val v = cache.get(checkKeyLength(h, k))
if (v != null)
map += (k -> v)
}
createMultiGetResponse(h, new immutable.HashMap ++ map)
} else {
createGetResponse(h, keys.head, cache.get(keys.head))
createGetResponse(h, keys.head, cache.get(checkKeyLength(h, keys.head)))
}
}

private def checkKeyLength(h: RequestHeader, k: String): String = {
if (k.length > 250) throw new ServerException(h, new IOException("Key length over the 250 character limit")) else k
}

override def readParameters(h: RequestHeader, b: ChannelBuffer): Option[MemcachedParameters] = {
val line = readLine(b)
if (!line.isEmpty) {
Expand Down
Expand Up @@ -333,7 +333,7 @@ class MemcachedFunctionalTest extends MemcachedSingleNodeTest {
assertEquals(version, Version.version)
}

def testKeyLengthLimit {
def testIncrKeyLengthLimit {
val keyUnderLimit = generateRandomString(249)
var f = client.set(keyUnderLimit, 0, "78")
assertTrue(f.get(timeout, TimeUnit.SECONDS).booleanValue)
Expand All @@ -349,6 +349,16 @@ class MemcachedFunctionalTest extends MemcachedSingleNodeTest {
assertClientError(resp)
}

def testGetKeyLengthLimit {
var tooLongKey = generateRandomString(251)
var resp = send("get " + tooLongKey + "\r\n")
assertClientError(resp)

tooLongKey = generateRandomString(251)
resp = send("get k1 k2 k3 " + tooLongKey + "\r\n")
assertClientError(resp)
}

def testInvalidCas {
var resp = send("cas bad blah 0 0 0\r\n\r\n")
assertClientError(resp)
Expand Down

0 comments on commit eae7884

Please sign in to comment.