You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by js...@apache.org on 2006/12/06 08:11:22 UTC

svn commit: r482932 - /incubator/tuscany/cpp/sca/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/ModREST.cpp

Author: jsdelfino
Date: Tue Dec  5 23:11:21 2006
New Revision: 482932

URL: http://svn.apache.org/viewvc?view=rev&rev=482932
Log:
Added handling of HTTP ETags and conditional HTTP GETs to the REST binding to enable caching of resource representations.

Modified:
    incubator/tuscany/cpp/sca/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/ModREST.cpp

Modified: incubator/tuscany/cpp/sca/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/ModREST.cpp
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/sca/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/ModREST.cpp?view=diff&rev=482932&r1=482931&r2=482932
==============================================================================
--- incubator/tuscany/cpp/sca/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/ModREST.cpp (original)
+++ incubator/tuscany/cpp/sca/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/ModREST.cpp Tue Dec  5 23:11:21 2006
@@ -31,6 +31,7 @@
 #include "http_log.h"
 #include "http_main.h"
 #include "util_script.h"
+#include "util_md5.h"
 
 #include "mod_core.h"
 
@@ -540,11 +541,31 @@
                                         resourceDataObject->getType().getURI(),
                                         resourceDataObject->getType().getName());
                                     char* str = xm->save(doc);
-    
-                                    loginfo("Sending response: %s", str);
-                                    ap_set_content_type(request, "text/xml");
-                                    ap_rputs(str, request);
-                                
+                                    
+                                    // Calculate an Etag hash for the response
+                                    char* etag = ap_md5(request->pool, (const unsigned char*)str);
+                                    
+                                    // Handle a conditional GET, if the etag matches the etag
+                                    // sent by the client, we don't need to send the whole response
+                                    const char* match = apr_table_get(request->headers_in, "If-None-Match");
+                                    if (match != NULL && !strcmp(etag, match))
+                                    {
+                                        loginfo("REST resource matches ETag, sending HTTP 304 response code");
+                                        request->status = HTTP_NOT_MODIFIED;
+                                    }
+                                    else
+                                    {
+                                        loginfo("Sending response: %s", str);
+                                        ap_set_content_type(request, "text/xml");
+                                        apr_table_setn(request->headers_out, "ETag", etag);
+                                        
+                                        // Send an Etag header to allow caching and
+                                        // conditional gets
+                                        char* etag = ap_md5(request->pool, (const unsigned char*)str);
+                                        apr_table_setn(request->headers_out, "ETag", etag);
+                                        
+                                        ap_rputs(str, request);
+                                    }
                                 }
                                 else
                                 {



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org