/* Modification information for LGPL compliance r56990 - 2010-06-16 13:05:36 -0700 (Wed, 16 Jun 2010) - kjing - snapshot "Mango" svn branch to a new one for GitHub sync r56989 - 2010-06-16 13:01:33 -0700 (Wed, 16 Jun 2010) - kjing - defunt "Mango" svn dev branch before github cutover r55980 - 2010-04-19 13:31:28 -0700 (Mon, 19 Apr 2010) - kjing - create Mango (6.1) based on windex r51719 - 2009-10-22 10:18:00 -0700 (Thu, 22 Oct 2009) - mitani - Converted to Build 3 tags and updated the build system r51634 - 2009-10-19 13:32:22 -0700 (Mon, 19 Oct 2009) - mitani - Windex is the branch for Sugar Sales 1.0 development r50375 - 2009-08-24 18:07:43 -0700 (Mon, 24 Aug 2009) - dwong - branch kobe2 from tokyo r50372 r42807 - 2008-12-29 11:16:59 -0800 (Mon, 29 Dec 2008) - dwong - Branch from trunk/sugarcrm r42806 to branches/tokyo/sugarcrm r4085 - 2005-04-13 17:30:42 -0700 (Wed, 13 Apr 2005) - robert - adding meeting scheduler and accept/decline */ /* Copyright (c) 2003 Jan-Klaas Kollhof This file is part of the JavaScript o lait library(jsolait). jsolait is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this software; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /** Provides methods for making HTTP requests. */ Module("urllib","1.1.3", function(mod){ /** Thrown if no request object could be instanciated. */ mod.NoHTTPRequestObject=Class("NoHTTPRequestObject", mod.Exception, function(publ, supr){ /** Initializes the Exception. @param trace The error causing this exception. */ publ.init=function(trace){ supr(this).init( "Could not create an HTTP request object", trace); } }) /** Thrown if an HTTP request could not be opened. */ mod.RequestOpenFailed = Class("RequestOpenFailed", mod.Exception, function(publ, supr){ /** Initializes the Exception. @param trace The error causing this exception. */ publ.init=function(trace){ supr(this).init( "Opening of HTTP request failed.", trace); } }) /** Thrown is arequest could not be sent to the server. */ mod.SendFailed=Class("SendFailed", mod.Exception, function(publ, supr){ /** Initializes the Exception. @param trace The error causing this exception. */ publ.init = function(trace){ supr(this).init( "Sending of HTTP request failed.", trace); } }) /** Mimics the HTTPRequest object using Adobe's SVG Viewer's postURL and getURL. It can only process asyncronous connection and the only header that's supported is 'Content-Type'. */ var ASVRequest=Class("ASVRequest", function(publ){ /** Initializes the ASVRequest. */ publ.init = function(){ if((getURL==null) || (postURL==null)){ throw "getURL and postURL are not available!"; }else{ this.readyState=0; this.responseText=""; this.__contType =""; this.status=200; } } /** Mimics the open method without actually opening a connection. @param type "GET" or "POST". @param url The url to open. @param async=true True for async. connection. Otherwhise an exception is thrown. */ publ.open=function(type,url,async){ if (async == false){ throw "Can only open asynchronous connections!"; } this.__type = type; this.__url = url; this.readyState=0; } /** Sets a header. @param name The header name. All but "Content-Type" are ignored. @param value The value of the header. */ publ.setRequestHeader=function(name, value){ if (name=="Content-Type"){ this.__contType =value; } } /** Sends the request. @param data The data to send when doing a post. */ publ.send=function(data){ var self=this; var cbh=new Object(); cbh.operationComplete = function(rsp){ self.readyState=4; self.responseText=rsp.content; if(this.ignoreComplete == false){ if(self.onreadystatechange){ self.onreadystatechange(); } } } cbh.ignoreComplete = false; try{ if(this.__type =="GET"){ getURL(this.__url,cbh); }else if (this.__type == "POST"){ postURL(this.__url, data, cbh, this.__contType); } }catch(e){ cbh.ignoreComplete=true; throw e; } } }) /** Creates an HTTP request object for retreiving files. @return HTTP request object. */ var getHTTP=function() { var obj; try{ //to get the mozilla httprequest object obj = new XMLHttpRequest(); }catch(e){ try{ //to get MS HTTP request object obj=new ActiveXObject("Msxml2.XMLHTTP.4.0"); }catch(e){ try{ //to get MS HTTP request object obj=new ActiveXObject("Msxml2.XMLHTTP") }catch(e){ try{// to get the old MS HTTP request object obj = new ActiveXObject("microsoft.XMLHTTP"); }catch(e){ try{//to create the ASV request object. obj = new ASVRequest(); }catch(e){ throw new mod.NoHTTPRequestObject("Neither Mozilla, IE nor ASV found. Can't do HTTP request without them."); } } } } } return obj; } /** Sends a request to a server. To explain the way the optional arguments work I will give examples: simple: sendRequest("get", "url") sendRequest("post", "url", "data") with headers: sendRequest("get", "url", [["headername","value"]]) sendRequest("post", "url", "data", [["headername","value"]]) with user information: sendRequest("get", "url", "user", "pass") sendRequest("post", "url", "user", "pass", "data") with headers and user information: sendRequest("get", "url", "user", "pass", [["headername","value"]]) sendRequest("post", "url", "user", "pass", "data", [["headername","value"]]) To make the request asynchronous just add a callback function as the last argument to the calls above. @param type Type of connection (GET, POST, ...). @param url The URL to retrieve. @param user=null The username for auth. @param pass=null The password. (must be set if user is set!) @param data="" The data to send with the request. @param headers=[] Array of headers. Each element in the array should be another array containing [headername,value]. @param callback=null Callback for asynchronous connections. The callback is called after completion and is passed the request object as 1st Parameter. @return HTTP request object. */ mod.sendRequest=function(type, url, user, pass, data, headers, callback){ var async=false; //check if the last argument is a function and treat it as callback; if(arguments[arguments.length-1] instanceof Function){ var async=true; callback = arguments[arguments.length-1]; } //treat sencond last(if callback)/last(if no callback) argument as headers var headindex=arguments.length-((async || arguments[arguments.length-1] == null) ?2:1); //is it an array then it's headers if(arguments[headindex] instanceof Array){ headers=arguments[headindex]; }else{ headers=[]; } //are user AND password not specified then assume data as 3rd argument. if(typeof user == "string" && typeof pass == "string"){ if(typeof data != "string"){ data=""; } }else if (typeof user == "string"){ data = user; user=null; pass=null; }else{ user=null; pass=null; } var xmlhttp= getHTTP(); try{ if(user!=null){ xmlhttp.open(type, url, async, user, pass); }else{ xmlhttp.open(type, url, async); } }catch(e){ throw new mod.RequestOpenFailed(e); } //set headers for(var i=0;i< headers.length;i++){ xmlhttp.setRequestHeader(headers[i][0], headers[i][1]); } if(async){//set up a callback xmlhttp.onreadystatechange=function(){ if (xmlhttp.readyState==4) { callback(xmlhttp); xmlhttp = null; //help IE with garbage collection }else if (xmlhttp.readyState==2){ //status property should be available (MS IXMLHTTPRequest documentation) //in Mozilla it is not if the request failed(server not reachable) //in IE it is not available at all ?! try{//see if it is mozilla otherwise don't care. var isNetscape = netscape; try{//if status is not available the request failed. var s=xmlhttp.status; }catch(e){//call the callback because Mozilla will not get to readystate 4 callback(xmlhttp); xmlhttp = null; } }catch(e){ } } } } try{ xmlhttp.send(data); }catch(e){ if(async){ callback(xmlhttp, e); xmlhttp=null; }else{ throw new mod.SendFailed(e); } } return xmlhttp; } /** Shorthand for a GET request. It calls sendRequest with "GET" as first argument. See the sendRequest method for more information. @param url The URL to retrieve. @param user=null The username for auth. @param pass=null The password. (must be set if user is set!) @param headers=[] Array of headers. Each element in the array should be another array containing [headername,value]. @param callback=null Callback for asynchronous connections. The callback is called after completion and is passed the request object as 1st Parameter. @return HTTP request object. */ mod.getURL=function(url, user, pass, headers, callback) { var a= new Array("GET"); for(var i=0;i