egroupware/phpgwapi/js/jsolait/lib/urllib.js

307 lines
12 KiB
JavaScript

/*
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.2", 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 arbage 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){
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<arguments.length;i++){
a.push(arguments[i]);
}
return mod.sendRequest.apply(this,a)
}
/**
Shorthand for a POST request.
It calls sendRequest with "POST" 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 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.postURL=function(url, user, pass, data, headers, callback) {
var a= new Array("POST");
for(var i=0;i<arguments.length;i++){
a.push(arguments[i]);
}
return mod.sendRequest.apply(this,a)
}
})