[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