From 7c4f117fcb50e29c8221546095afea0af1bbbd08 Mon Sep 17 00:00:00 2001 From: Mike Rylander Date: Sun, 23 Feb 2014 15:55:52 -0500 Subject: [PATCH] Add chunking support to JS implementation Signed-off-by: Mike Rylander Signed-off-by: Bill Erickson --- include/opensrf/osrf_message.h | 3 +++ src/javascript/opensrf.js | 21 +++++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/include/opensrf/osrf_message.h b/include/opensrf/osrf_message.h index 76091d0..62cef98 100644 --- a/include/opensrf/osrf_message.h +++ b/include/opensrf/osrf_message.h @@ -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 diff --git a/src/javascript/opensrf.js b/src/javascript/opensrf.js index c0e454c..5f6a68f 100644 --- a/src/javascript/opensrf.js +++ b/src/javascript/opensrf.js @@ -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); } -- 2.11.0