1 /* -----------------------------------------------------------------------
2 * Copyright (C) 2008 Georgia Public Library Service
3 * Bill Erickson <erickson@esilibrary.com>
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 * ----------------------------------------------------------------------- */
16 var OSRF_HTTP_HEADER_TO = 'X-OpenSRF-to';
17 var OSRF_HTTP_HEADER_XID = 'X-OpenSRF-thread';
18 var OSRF_HTTP_HEADER_FROM = 'X-OpenSRF-from';
19 var OSRF_HTTP_HEADER_THREAD = 'X-OpenSRF-thread';
20 var OSRF_HTTP_HEADER_TIMEOUT = 'X-OpenSRF-timeout';
21 var OSRF_HTTP_HEADER_SERVICE = 'X-OpenSRF-service';
22 var OSRF_HTTP_HEADER_MULTIPART = 'X-OpenSRF-multipart';
23 var OSRF_HTTP_TRANSLATOR = '/osrf-http-translator'; /* XXX config */
24 var OSRF_POST_CONTENT_TYPE = 'application/x-www-form-urlencoded';
27 OpenSRF.XHRequest = function(osrf_msg, args) {
28 this.message = osrf_msg;
30 this.xreq = new XMLHttpRequest(); /* XXX browser check */
33 OpenSRF.XHRequest.prototype.send = function() {
37 if(this.args.timeout) {
38 /* this is a standard blocking (non-multipart) call */
39 xreq.open('POST', OSRF_HTTP_TRANSLATOR, false);
43 if( /* XXX browser != mozilla */ false ) {
45 /* standard asynchronous call */
46 xreq.onreadystatechange = function() {
47 if(xreq.readyState == 4)
48 xhr_req.core_handler();
50 xreq.open('POST', OSRF_HTTP_TRANSLATOR, true);
54 /* asynchronous multipart call */
55 xreq.multipart = true;
56 xreq.onload = function(evt) {xhr_req.core_handler();}
57 xreq.open('POST', OSRF_HTTP_TRANSLATOR, true);
58 xreq.setRequestHeader(OSRF_HTTP_HEADER_MULTIPART, 'true');
62 xreq.setRequestHeader('Content-Type', OSRF_POST_CONTENT_TYPE);
63 xreq.setRequestHeader(OSRF_HTTP_HEADER_THREAD, this.args.thread);
65 xreq.setRequestHeader(OSRF_HTTP_HEADER_TO, this.args.rcpt);
67 xreq.setRequestHeader(OSRF_HTTP_HEADER_SERVICE, this.args.rcpt_service);
69 var post = 'osrf-msg=' + encodeURIComponent(js2JSON([this.message.serialize()]));
72 if(this.args.timeout) /* this was a blocking call, manually run the handler */
79 OpenSRF.XHRequest.prototype.core_handler = function() {
80 sender = this.xreq.getResponseHeader(OSRF_HTTP_HEADER_FROM);
81 thread = this.xreq.getResponseHeader(OSRF_HTTP_HEADER_THREAD);
82 json = this.xreq.responseText;
83 stat = this.xreq.status;
87 new OpenSRF.NetMessage(null, sender, thread, json),
91 if(ses.state == OSRF_APP_SESSION_CONNECTED &&
92 ses.onconnect && !ses.onconnect_called) {
93 ses.onconnect_called = true;
99 if(req.response_queue.length > 0 && xhr.args.onresponse)
100 return xhr.args.onresponse(req);
102 if(req.complete && xhr.args.oncomplete && !xhr.args.oncomplete_called) {
103 xhr.args.oncomplete_called = true;
104 return xhr.args.oncomplete(req);