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-xid';
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;
31 this.xreq = new XMLHttpRequest();
34 this.xreq = new ActiveXObject("Msxml2.XMLHTTP");
36 this.xreq = new ActiveXObject("Microsoft.XMLHTTP");
41 OpenSRF.XHRequest.prototype.send = function() {
45 if(this.args.timeout) {
46 /* this is a standard blocking (non-multipart) call */
47 xreq.open('POST', OSRF_HTTP_TRANSLATOR, false);
52 * multi-part messages are deprecated. Eventually this will go away.
53 * For now, continue allowing the Evergreen staff client to use
54 * multi-part messages. */
55 if (!navigator.userAgent.match(/open_ils_staff_client/)) {
56 /* standard asynchronous call */
57 xreq.onreadystatechange = function() {
58 if(xreq.readyState == 4)
59 xhr_req.core_handler();
61 xreq.open('POST', OSRF_HTTP_TRANSLATOR, true);
65 /* asynchronous multipart call */
66 xreq.multipart = true;
67 xreq.onload = function(evt) {xhr_req.core_handler();};
68 xreq.open('POST', OSRF_HTTP_TRANSLATOR, true);
69 xreq.setRequestHeader(OSRF_HTTP_HEADER_MULTIPART, 'true');
71 /* multipart requests do not pass the status info to the onload if there
72 is no new data to load. Capture the status on the readystate handler */
73 xreq.onreadystatechange = function() {
74 if(xreq.readyState == 4 && xreq.status >= 400)
75 xhr_req.transport_error_handler();
80 xreq.setRequestHeader('Content-Type', OSRF_POST_CONTENT_TYPE);
81 xreq.setRequestHeader(OSRF_HTTP_HEADER_THREAD, this.args.thread);
83 xreq.setRequestHeader(OSRF_HTTP_HEADER_TO, this.args.rcpt);
85 xreq.setRequestHeader(OSRF_HTTP_HEADER_SERVICE, this.args.rcpt_service);
88 var post = 'osrf-msg=' + encodeURIComponent(js2JSON([this.message.serialize()]));
91 if(this.args.timeout) /* this was a blocking call, manually run the handler */
97 OpenSRF.XHRequest.prototype.core_handler = function() {
98 sender = this.xreq.getResponseHeader(OSRF_HTTP_HEADER_FROM);
99 thread = this.xreq.getResponseHeader(OSRF_HTTP_HEADER_THREAD);
100 json = this.xreq.responseText;
101 stat = this.xreq.status;
104 return this.transport_error_handler();
107 new OpenSRF.NetMessage(null, sender, thread, json),
109 onresponse : this.args.onresponse,
110 oncomplete : this.args.oncomplete,
111 onerror : this.args.onerror,
112 onmethoderror : this.method_error_handler()
118 OpenSRF.XHRequest.prototype.method_error_handler = function() {
120 return function(req, status, status_text) {
121 if(xhr.args.onmethoderror)
122 xhr.args.onmethoderror(req, status, status_text);
124 xhr.args.onerror(xhr.message, xhr.args.rcpt || xhr.args.rcpt_service, xhr.args.thread);
128 OpenSRF.XHRequest.prototype.transport_error_handler = function() {
129 if(this.args.ontransporterror) {
130 this.args.ontransporterror(this.xreq);
132 if(this.args.onerror) {
133 this.args.onerror(this.message, this.args.rcpt || this.args.rcpt_service, this.args.thread);