Add chunking support to JS implementation
authorMike Rylander <mrylander@gmail.com>
Sun, 23 Feb 2014 20:55:52 +0000 (15:55 -0500)
committerBill Erickson <berick@esilibrary.com>
Fri, 28 Feb 2014 21:15:20 +0000 (16:15 -0500)
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Signed-off-by: Bill Erickson <berick@esilibrary.com>
include/opensrf/osrf_message.h
src/javascript/opensrf.js

index 76091d0..62cef98 100644 (file)
@@ -38,6 +38,9 @@ extern "C" {
 #define OSRF_STATUS_ACCEPTED             202
 #define OSRF_STATUS_COMPLETE             205
 
+#define OSRF_STATUS_PARTIAL              206
+#define OSRF_STATUS_NOCONTENT            204
+
 #define OSRF_STATUS_REDIRECTED           307
 
 #define OSRF_STATUS_BADREQUEST           400
index c0e454c..5f6a68f 100644 (file)
@@ -33,7 +33,9 @@ var OSRF_MESSAGE_TYPE_DISCONNECT = 'DISCONNECT';
 var OSRF_STATUS_CONTINUE = 100;
 var OSRF_STATUS_OK = 200;
 var OSRF_STATUS_ACCEPTED = 202;
+var OSRF_STATUS_NOCONTENT = 204;
 var OSRF_STATUS_COMPLETE = 205;
+var OSRF_STATUS_PARTIAL = 206;
 var OSRF_STATUS_REDIRECTED = 307;
 var OSRF_STATUS_BADREQUEST = 400;
 var OSRF_STATUS_UNAUTHORIZED = 401;
@@ -332,6 +334,7 @@ OpenSRF.Request = function(session, reqid, args) {
     this.params = args.params;
     this.timeout = args.timeout;
     this.response_queue = [];
+    this.part_response_buffer = '';
     this.complete = false;
 };
 
@@ -441,11 +444,12 @@ OpenSRF.Stack.handle_message = function(ses, osrf_msg, callbacks) {
     
     var req = null;
 
+    var payload = osrf_msg.payload();
+    var status = payload.statusCode();
+    var status_text = payload.status();
+
     if(osrf_msg.type() == OSRF_MESSAGE_TYPE_STATUS) {
 
-        var payload = osrf_msg.payload();
-        var status = payload.statusCode();
-        var status_text = payload.status();
 
         if(status == OSRF_STATUS_COMPLETE) {
             req = ses.find_request(osrf_msg.threadTrace());
@@ -476,9 +480,18 @@ OpenSRF.Stack.handle_message = function(ses, osrf_msg, callbacks) {
     }
 
     if(osrf_msg.type() == OSRF_MESSAGE_TYPE_RESULT) {
+
         req = ses.find_request(osrf_msg.threadTrace());
         if(req) {
-            req.response_queue.push(osrf_msg.payload());
+            if (status == OSRF_STATUS_PARTIAL) {
+                req.part_response_buffer += payload.content()
+                return; // we're just collecting a big chunked payload
+            } else if (status == OSRF_STATUS_NOCONTENT) {
+                payload.content( JSON2js(req.part_response_buffer) );
+                payload.statusCode( OSRF_STATUS_OK );
+                req.part_response_buffer = '';
+            }
+            req.response_queue.push(payload);
             if(callbacks.onresponse) 
                 return callbacks.onresponse(req);
         }