[infinispan-commits] Infinispan SVN: r2527 - in trunk: server/rest/src/main/scala/org/infinispan/rest and 1 other directories.
infinispan-commits at lists.jboss.org
infinispan-commits at lists.jboss.org
Wed Oct 20 10:07:41 EDT 2010
Author: manik.surtani at jboss.com
Date: 2010-10-20 10:07:40 -0400 (Wed, 20 Oct 2010)
New Revision: 2527
Modified:
trunk/core/src/main/java/org/infinispan/remoting/MIMECacheEntry.java
trunk/server/rest/src/main/scala/org/infinispan/rest/Server.scala
trunk/server/rest/src/test/scala/org/infinispan/rest/IntegrationTest.scala
Log:
ISPN-712 - GET and HEAD requests on non-existent caches or keys should return a 404 error rather than a 500 error
Modified: trunk/core/src/main/java/org/infinispan/remoting/MIMECacheEntry.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/remoting/MIMECacheEntry.java 2010-10-20 13:57:55 UTC (rev 2526)
+++ trunk/core/src/main/java/org/infinispan/remoting/MIMECacheEntry.java 2010-10-20 14:07:40 UTC (rev 2527)
@@ -37,6 +37,7 @@
this.contentType = contentType;
this.data = data;
this.lastModified = System.currentTimeMillis();
+ this.lastModified = (this.lastModified / 1000) * 1000;
}
Modified: trunk/server/rest/src/main/scala/org/infinispan/rest/Server.scala
===================================================================
--- trunk/server/rest/src/main/scala/org/infinispan/rest/Server.scala 2010-10-20 13:57:55 UTC (rev 2526)
+++ trunk/server/rest/src/main/scala/org/infinispan/rest/Server.scala 2010-10-20 14:07:40 UTC (rev 2527)
@@ -21,35 +21,40 @@
*/
@Path("/rest")
class Server(@Context request: Request, @HeaderParam("performAsync") useAsync: Boolean) {
-
@GET
@Path("/{cacheName}/{cacheKey}")
def getEntry(@PathParam("cacheName") cacheName: String, @PathParam("cacheKey") key: String) = {
- ManagerInstance.getEntry(cacheName, key) match {
- case b: MIMECacheEntry => {
- val lastMod = new Date(b.lastModified)
- request.evaluatePreconditions(lastMod, calcETAG(b)) match {
- case bldr: ResponseBuilder => bldr.build
- case null => Response.ok(b.data, b.contentType).lastModified(lastMod).tag(calcETAG(b)).build
+ try {
+ ManagerInstance.getEntry(cacheName, key) match {
+ case b: MIMECacheEntry => {
+ val lastMod = new Date(b.lastModified)
+ request.evaluatePreconditions(lastMod, calcETAG(b)) match {
+ case bldr: ResponseBuilder => bldr.build
+ case null => Response.ok(b.data, b.contentType).lastModified(lastMod).tag(calcETAG(b)).build
+ }
}
- }
- case s: String => Response.ok(s, "text/plain").build
- case obj: Any => {
- val variant = request.selectVariant(variantList)
- val selectedMediaType = if (variant != null) variant.getMediaType.toString else "application/x-java-serialized-object"
- selectedMediaType match {
- case MediaType.APPLICATION_JSON => Response.ok.`type`(selectedMediaType).entity(streamIt(jsonMapper.writeValue(_, obj))).build
- case MediaType.APPLICATION_XML => Response.ok.`type`(selectedMediaType).entity(streamIt(xstream.toXML(obj, _))).build
- case _ =>
- obj match {
- case ser: Serializable =>
- Response.ok.`type`("application/x-java-serialized-object").entity(streamIt(new ObjectOutputStream(_).writeObject(ser))).build
- case _ => Response.notAcceptable(variantList).build
- }
+ case s: String => Response.ok(s, "text/plain").build
+ case obj: Any => {
+ val variant = request.selectVariant(variantList)
+ val selectedMediaType = if (variant != null) variant.getMediaType.toString else "application/x-java-serialized-object"
+ selectedMediaType match {
+ case MediaType.APPLICATION_JSON => Response.ok.`type`(selectedMediaType).entity(streamIt(jsonMapper.writeValue(_, obj))).build
+ case MediaType.APPLICATION_XML => Response.ok.`type`(selectedMediaType).entity(streamIt(xstream.toXML(obj, _))).build
+ case _ =>
+ obj match {
+ case ser: Serializable =>
+ Response.ok.`type`("application/x-java-serialized-object").entity(streamIt(new ObjectOutputStream(_).writeObject(ser))).build
+ case _ => Response.notAcceptable(variantList).build
+ }
+ }
}
+ case null => Response status (Status.NOT_FOUND) build
}
- case null => Response status (Status.NOT_FOUND) build
+ } catch {
+ case e: CacheNotFoundException => {
+ Response status (Status.NOT_FOUND) build
+ }
}
}
Modified: trunk/server/rest/src/test/scala/org/infinispan/rest/IntegrationTest.scala
===================================================================
--- trunk/server/rest/src/test/scala/org/infinispan/rest/IntegrationTest.scala 2010-10-20 13:57:55 UTC (rev 2526)
+++ trunk/server/rest/src/test/scala/org/infinispan/rest/IntegrationTest.scala 2010-10-20 14:07:40 UTC (rev 2527)
@@ -131,6 +131,32 @@
assertNull(get.getResponseBodyAsString)
}
+ def testGetIfUnmodified(m: Method) = {
+ val fullPathKey = fullPath + "/" + m.getName
+ val post = new PostMethod(fullPathKey)
+ post.setRequestHeader("Content-Type", "application/text")
+ post.setRequestBody("data")
+ Client.call(post)
+
+ var get = Client.call(new GetMethod(fullPathKey))
+ assertEquals(HttpServletResponse.SC_OK, get.getStatusCode)
+ assertNotNull(get.getResponseHeader("ETag").getValue)
+ var lastMod = get.getResponseHeader("Last-Modified").getValue
+ assertNotNull(lastMod)
+ assertEquals("application/text", get.getResponseHeader("Content-Type").getValue)
+ assertEquals("data", get.getResponseBodyAsString)
+
+ // now get again
+ val getAgain = new GetMethod(fullPathKey)
+ getAgain.addRequestHeader("If-Unmodified-Since", lastMod)
+ get = Client.call(getAgain)
+ assertEquals(HttpServletResponse.SC_OK, get.getStatusCode)
+ assertNotNull(get.getResponseHeader("ETag").getValue)
+ assertNotNull(get.getResponseHeader("Last-Modified").getValue)
+ assertEquals("application/text", get.getResponseHeader("Content-Type").getValue)
+ assertEquals("data", get.getResponseBodyAsString)
+ }
+
def testPostDuplicate(m: Method) = {
val fullPathKey = fullPath + "/" + m.getName
val post = new PostMethod(fullPathKey)
@@ -272,6 +298,12 @@
assertTrue(x.name == "mic")
}
+ def testNonexistentCache(m: Method) = {
+ val fullPathKey = HOST + "rest/nonexistent/" + m.getName
+ val get = new GetMethod(fullPathKey)
+ Client call get
+ assertEquals(HttpServletResponse.SC_NOT_FOUND, get.getStatusCode)
+ }
}
More information about the infinispan-commits
mailing list