123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- /*
- Copyright (c) 2004-2012, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
- */
- if(!dojo._hasResource["dojox.io.xhrPlugins"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
- dojo._hasResource["dojox.io.xhrPlugins"] = true;
- dojo.provide("dojox.io.xhrPlugins");
- dojo.require("dojo.AdapterRegistry");
- dojo.require("dojo._base.xhr");
- (function() {
- var registry;
- var plainXhr;
- function getPlainXhr(){
- return plainXhr = dojox.io.xhrPlugins.plainXhr = plainXhr || dojo._defaultXhr || dojo.xhr;
- }
- dojox.io.xhrPlugins.register = function(){
- // summary:
- // overrides the default xhr handler to implement a registry of
- // xhr handlers
- var plainXhr = getPlainXhr();
- if(!registry){
- registry = new dojo.AdapterRegistry();
- // replaces the default xhr() method. Can we just use connect() instead?
- dojo[dojo._defaultXhr ? "_defaultXhr" : "xhr"] = function(/*String*/ method, /*dojo.__XhrArgs*/ args, /*Boolean?*/ hasBody){
- return registry.match.apply(registry,arguments);
- };
- registry.register(
- "xhr",
- function(method,args){
- if(!args.url.match(/^\w*:\/\//)){
- // if it is not an absolute url (or relative to the
- // protocol) we can use this plain XHR
- return true;
- }
- var root = window.location.href.match(/^.*?\/\/.*?\//)[0];
- return args.url.substring(0, root.length) == root; // or check to see if we have the same path
- },
- plainXhr
- );
- }
- return registry.register.apply(registry, arguments);
- };
- dojox.io.xhrPlugins.addProxy = function(proxyUrl){
- // summary:
- // adds a server side proxy xhr handler for cross-site URLs
- // proxyUrl:
- // This is URL to send the requests to.
- // example:
- // Define a proxy:
- // | dojox.io.xhrPlugins.addProxy("/proxy?url=");
- // And then when you call:
- // | dojo.xhr("GET",{url:"http://othersite.com/file"});
- // It would result in the request (to your origin server):
- // | GET /proxy?url=http%3A%2F%2Fothersite.com%2Ffile HTTP/1.1
- var plainXhr = getPlainXhr();
- dojox.io.xhrPlugins.register(
- "proxy",
- function(method,args){
- // this will match on URL
- // really can be used for anything, but plain XHR will take
- // precedent by order of loading
- return true;
- },
- function(method,args,hasBody){
- args.url = proxyUrl + encodeURIComponent(args.url);
- return plainXhr.call(dojo, method, args, hasBody);
- });
- };
- var csXhrSupport;
- dojox.io.xhrPlugins.addCrossSiteXhr = function(url, httpAdapter){
- // summary:
- // Adds W3C Cross site XHR or XDomainRequest handling for the given URL prefix
- //
- // url:
- // Requests that start with this URL will be considered for using
- // cross-site XHR.
- //
- // httpAdapter: This allows for adapting HTTP requests that could not otherwise be
- // sent with XDR, so you can use a convention for headers and PUT/DELETE methods.
- //
- // description:
- // This can be used for servers that support W3C cross-site XHR. In order for
- // a server to allow a client to make cross-site XHR requests,
- // it should respond with the header like:
- // | Access-Control: allow <*>
- // see: http://www.w3.org/TR/access-control/
- var plainXhr = getPlainXhr();
- if(csXhrSupport === undefined && window.XMLHttpRequest){
- // just run this once to see if we have cross-site support
- try{
- var xhr = new XMLHttpRequest();
- xhr.open("GET","http://testing-cross-domain-capability.com",true);
- csXhrSupport = true;
- dojo.config.noRequestedWithHeaders = true;
- }catch(e){
- csXhrSupport = false;
- }
- }
- dojox.io.xhrPlugins.register(
- "cs-xhr",
- function(method,args){
- return (csXhrSupport ||
- (window.XDomainRequest && args.sync !== true &&
- (method == "GET" || method == "POST" || httpAdapter))) &&
- (args.url.substring(0,url.length) == url);
- },
- csXhrSupport ? plainXhr : function(){
- var normalXhrObj = dojo._xhrObj;
- // we will just substitute this in temporarily so we can use XDomainRequest instead of XMLHttpRequest
- dojo._xhrObj = function(){
-
- var xdr = new XDomainRequest();
- xdr.readyState = 1;
- xdr.setRequestHeader = function(){}; // just absorb them, we can't set headers :/
- xdr.getResponseHeader = function(header){ // this is the only header we can access
- return header == "Content-Type" ? xdr.contentType : null;
- }
- // adapt the xdr handlers to xhr
- function handler(status, readyState){
- return function(){
- xdr.readyState = readyState;
- xdr.status = status;
- }
- }
- xdr.onload = handler(200, 4);
- xdr.onprogress = handler(200, 3);
- xdr.onerror = handler(404, 4); // an error, who knows what the real status is
- return xdr;
- };
- var dfd = (httpAdapter ? httpAdapter(getPlainXhr()) : getPlainXhr()).apply(dojo,arguments);
- dojo._xhrObj = normalXhrObj;
- return dfd;
- }
- );
- };
- dojox.io.xhrPlugins.fullHttpAdapter = function(plainXhr,noRawBody){
- // summary:
- // Provides a HTTP adaption.
- // description:
- // The following convention is used:
- // method name -> ?http-method=PUT
- // Header -> http-Header-Name=header-value
- // X-Header -> header_name=header-value
- // example:
- // dojox.io.xhrPlugins.addXdr("http://somesite.com", dojox.io.xhrPlugins.fullHttpAdapter);
- return function(method,args,hasBody){
- var content = {};
- var parameters = {};
- if(method != "GET"){
- parameters["http-method"] = method;
- if(args.putData && noRawBody){
- content["http-content"] = args.putData;
- delete args.putData;
- hasBody = false;
- }
- if(args.postData && noRawBody){
- content["http-content"] = args.postData;
- delete args.postData;
- hasBody = false;
- }
- method = "POST";
-
- }
- for(var i in args.headers){
- var parameterName = i.match(/^X-/) ? i.substring(2).replace(/-/g,'_').toLowerCase() : ("http-" + i);
- parameters[parameterName] = args.headers[i];
- }
- args.query = dojo.objectToQuery(parameters);
- dojo._ioAddQueryToUrl(args);
- args.content = dojo.mixin(args.content || {},content);
- return plainXhr.call(dojo,method,args,hasBody);
- };
- };
- })();
- }
|