From 9c82af3afb912f1646cdbdccb6ff62998a2920af 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 --- include/opensrf/osrf_message.h | 3 +++ src/javascript/opensrf.js | 24 ++++++++++++++++++------ 2 files changed, 21 insertions(+), 6 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 d67fbfd..edc0cb3 100644 --- a/src/javascript/opensrf.js +++ b/src/javascript/opensrf.js @@ -35,7 +35,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; @@ -488,6 +490,7 @@ OpenSRF.Request = function(session, reqid, args) { this.timeout = args.timeout; this.api_level = args.api_level || OpenSRF.api_level; this.response_queue = []; + this.part_response_buffer = ''; this.complete = false; }; @@ -611,11 +614,12 @@ OpenSRF.Stack.handle_message = function(ses, osrf_msg) { var req = ses.find_request(osrf_msg.threadTrace()); + 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) { if(req) { @@ -645,11 +649,19 @@ OpenSRF.Stack.handle_message = function(ses, osrf_msg) { } 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(req.onresponse) { - return req.onresponse(req); + 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(req.onresponse) + return req.onresponse(req); } } }; -- 2.11.0