forked from Esri/arcgis-js-api
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrequest.js
25 lines (24 loc) · 11.7 KB
/
request.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// COPYRIGHT © 201 Esri
//
// All rights reserved under the copyright laws of the United States
// and applicable international laws, treaties, and conventions.
//
// This material is licensed for use under the Esri Master License
// Agreement (MLA), and is bound by the terms of that agreement.
// You may redistribute and use this code without modification,
// provided you adhere to the terms of the MLA and include this
// copyright notice.
//
// See use restrictions at http://www.esri.com/legal/pdfs/mla_e204_e300/english
//
// For additional information, contact:
// Environmental Systems Research Institute, Inc.
// Attn: Contracts and Legal Services Department
// 380 New York Street
// Redlands, California, USA 92373
// USA
//
// email: [email protected]
//
// See http://js.arcgis.com/3.30/esri/copyright.txt for details.
define(["require","dojo/_base/array","dojo/_base/config","dojo/_base/Deferred","dojo/_base/lang","dojo/_base/url","dojo/_base/xhr","dojo/request/xhr","./core/request/script","dojo/request/iframe","dojo/dom-construct","dojo/io-query","./kernel","./config","./sniff","./lang","./urlUtils","./deferredUtils"],function(e,r,n,t,o,i,s,a,l,d,u,c,f,p,g,h,m,v){function w(e){return e=new i(e),(e.host+(e.port?":"+e.port:"")).toLowerCase()}function k(e){return this._xhr?this._xhr.getResponseHeader(e):null}function _(e,r){var n=c.objectToQuery(e.content);if(n&&(e.url+=(-1===e.url.indexOf("?")?"?":"&")+n),e.url.length>2e3){var i;if("data:"!==e.url.toLowerCase().slice(0,5))return i=new t,i.reject(o.mixin(new Error,{message:"When using responseType 'image', URL length cannot exceed 2000 characters."})),i;if(e.url.length>3e6)return i=new t,i.reject(o.mixin(new Error,{message:"When using responseType 'image', data URL length cannot exceed 3000000 characters."})),i}var s=new Image;r.allowImageDataAccess&&(e.withCredentials?s.crossOrigin="use-credentials":s.crossOrigin="anonymous");var a=!1,l=new t(function(e){a=!0,s.onload=s.onerror=s.onabort=null,s.src=""}),d=function(e){s.onload=s.onerror=s.onabort=null,a||l.reject(new Error("Unable to load the resource"))};return s.onload=function(){s.onload=s.onerror=s.onabort=null,a||l.resolve(this)},s.onerror=d,s.onabort=d,s.alt="",s.src=e.url,l}function b(e,i,p,v){var w,k,b=!1,C=!1,x=!1;h.isDefined(i)&&(o.isObject(i)?(b=!!i.useProxy,C=!!i.usePost,x=!!i.returnProgress,w=i.crossOrigin):b=!!i),e=o.mixin({},e),e._ssl&&(e.url=e.url.replace(/^http:/i,"https:")),g("ie")<10&&!L.test(e.url)&&(e.url=encodeURI(e.url));var D=e.content,O=e.url,y=p&&e.form,A=E;w=h.isDefined(w)?w:A.useCors,e.load=function(r){var t;return r&&(r.error?(t=o.mixin(new Error,r.error),t.log=!!n.isDebug):"error"===r.status&&(t=o.mixin(new Error,r),t.log=!!n.isDebug),t&&(e.failOk=!t.log,h.isDefined(t.httpCode)||(t.httpCode=t.code))),t||r},e.error=function(r,t){return t&&t.xhr&&t.xhr.abort(),r instanceof Error||(r=o.mixin(new Error,r)),r.log=!!n.isDebug,e.failOk=!r.log,A.errorHandler(r,t),r},e._token&&(e.content=e.content||{},e.content.token=e._token);var q,P=0;D&&O&&(q=c.objectToQuery(D),P=q.length+O.length+1,g("esri-url-encodes-apostrophe")&&(P=q.replace(/'/g,"%27").length+O.length+1)),e.timeout=h.isDefined(e.timeout)?e.timeout:A.timeout,e.handleAs=e.handleAs||"json";try{var S,U,T=w&&m.canUseXhr(e.url)&&!/https?:\/\/[^\/]+\/[^\/]+\/admin\/?(\/.*)?$/i.test(e.url),F=m.hasSameOrigin(e.url,window.location.href)||T,I=!!(C||p||P>A.postLength),W=!(F||-1===e.handleAs.indexOf("json")||!e.callbackParamName||p),X=!(!(m.getProxyRule(e.url)||A.alwaysUseProxy||b)&&("image"===e.handleAs&&!i.allowImageDataAccess||W&&!I||F));if(p&&!g("esri-file-upload")&&!X&&T&&(X=!0),X)if(S=m.getProxyUrl(O,w),U=S.path,S._xo&&(T=!0),!I&&U.length+1+P>A.postLength&&(I=!0),e.url=U+"?"+O,I)e.content=o.mixin(S.query||{},D);else{var N=c.objectToQuery(o.mixin(S.query||{},D));N&&(e.url+="?"+N),e.content=null}if(!W||I||X){var B=e.headers;if(!T||B&&B.hasOwnProperty("X-Requested-With")||(B=e.headers=B||{},B["X-Requested-With"]=null),p){var H,Q,M,$,z,J=e.callbackParamName||"callback.html",G=e.callbackElementName||"textarea",K=y.elements?y.elements.length:0;if(D=e.content){D.token&&O.toLowerCase().indexOf("/sharing/servers/")>-1&&(O+=(-1===O.indexOf("?")?"?":"&")+"token="+D.token,e.url=X?U+"?"+O:O,delete D.token);for(H in D)if(M=D[H],h.isDefined(M)){for(Q=null,$=0;$<K;$++)if(z=y.elements[$],z.name===H){Q=z;break}Q?Q.value=M:v?y.append(H,M):y.appendChild(u.create("input",{type:"hidden",name:H,value:M}))}}if(g("esri-file-upload")){r.forEach(y.elements,function(e){e.name===J&&y.removeChild(e)});var V=v?y:new FormData(y);if(g("safari")>=11&&"entries"in V&&"delete"in V){for(var Y=[],Z=V.entries(),ee=Z.next();!ee.done;){var re=ee.value;re[1]instanceof File&&""===re[1].name&&Y.push(re[0]),ee=Z.next()}Y.forEach(function(e){V.delete(e)})}e.contentType=!1,e.postData=V,delete e.form}else y.enctype="multipart/form-data",g("ie")<9&&(y.encoding="multipart/form-data"),y.method="post",r.some(y.elements,function(e){return e.name===J})||y.appendChild(u.create("input",{type:"hidden",name:J,value:G})),-1===O.toLowerCase().indexOf("addattachment")&&-1===O.toLowerCase().indexOf("updateattachment")||(O+=(-1===O.indexOf("?")?"?":"&")+J+"="+G,e.url=X?U+"?"+O:O),delete e.content}if(T&&!e.hasOwnProperty("withCredentials")&&"with-credentials"===E.useCors){var ne=X?U:O,te=m.canUseXhr(ne,!0),oe=te>-1?E.corsEnabledServers[te]:null;if(oe&&oe.hasOwnProperty("withCredentials"))oe.withCredentials&&(e.withCredentials=!0);else if(f.id){var ie=f.id.findServerInfo(ne);ie&&ie.webTierAuth&&(e.withCredentials=!0)}}if(e=j?j(e):e,"image"===e.handleAs)return _(e,i);if(I){if(p&&!g("esri-file-upload")){k=new t(function(){se.cancel()});var se=d.post(e.url,e).then(function(e){k.resolve(e)}).otherwise(function(e){k.reject(e)});return k.addCallback(function(r){return e.load(r)}),k.addErrback(function(r){return e.error(r)}),k}if(!X&&g("safari")&&(e.url+=(-1===e.url.indexOf("?")?"?":"&")+"_ts="+(new Date).getTime()+R++),x){e.uploadProgress=!0,e.data=e.postData,e.query=e.content,k=new t(function(){ae.cancel()});var ae=a.post(e.url,e).then(function(e){k.resolve(e)},function(e){k.reject(e)},function(e){k.progress({transferType:e.transferType,loaded:e.loaded,total:e.total})});return k.addCallback(function(r){return e.load(r)}),k.addErrback(function(r){return e.error(r)}),k}return s.post(e)}return s.get(e)}e=j?j(e):e,e.jsonp=e.callbackParamName,e.query=e.content,k=new t(function(){le.cancel()});var le=l.get(e.url,e).then(function(e){k.resolve(e)}).otherwise(function(e){k.reject(e)});return k.addCallback(function(r){return e.load(r)}),k.addErrback(function(r){return e.error(r)}),k}catch(r){return k=new t,k.errback(e.error(r)),k}}function C(e){var r=E.corsStatus,o=m.canUseXhr(e,!0);o>-1&&E.corsEnabledServers.splice(o,1);var i=new t;return i.reject({log:!!n.isDebug}),r[w(e)]=i.promise,o}function x(e){var r=E.corsStatus;try{var n=w(e);if(E.corsDetection&&E.useCors&&g("esri-cors")&&e&&-1!==e.toLowerCase().indexOf("/rest/services")&&!m.hasSameOrigin(e,window.location.href)&&!m.canUseXhr(e)){if(r[n]&&!r[n].isCanceled())return r[n];var o=new t(v._dfdCanceller);r[n]=o.promise;var i=s.get({url:e.substring(0,e.toLowerCase().indexOf("/rest/")+"/rest/".length)+"info",content:{f:"json"},failOk:!0,handleAs:"json",headers:{"X-Requested-With":null},timeout:1e3*E.corsDetectionTimeout});return o._pendingDfd=i,i.then(function(r){r?(m.canUseXhr(e)||E.corsEnabledServers.push(n),o.resolve()):o.reject()},function(e){o.reject(e)}),o.promise}}catch(e){console.log("esri._detectCors: an unknown error occurred while detecting CORS support")}return P}function D(e){j=e}function O(i,a,l,d){function u(e){if(e._pendingDfd=b(l,d,y,D),!e._pendingDfd){e.ioArgs=e._pendingDfd&&e._pendingDfd.ioArgs;var i=new Error("Deferred object is missing");return i.log=!!n.isDebug,e.errback(i),e._pendingDfd=null,e}e._pendingDfd.addCallback(function(r){if(!r)return r;var i=e._pendingDfd&&e._pendingDfd.ioArgs&&e._pendingDfd.ioArgs.xhr;if(!i)return r;var s=i.getResponseHeader("Content-Type");if(s&&(s=s.toLowerCase(),-1===s.indexOf("text/plain")&&-1===s.indexOf("application/json")))return r;var a;if(r instanceof ArrayBuffer&&r.byteLength<=750)a=new Blob([r]);else{if(!(r instanceof Blob&&r.size<=750))return r;a=r}var l=new t,d=new FileReader;return d.readAsText(a),d.onloadend=function(){var e;if(!d.error)try{var t=JSON.parse(d.result);t.error&&(e=t.error)}catch(i){}if(e){var i=o.mixin(new Error,e);i.log=!!n.isDebug,null==i.httpCode&&(i.httpCode=i.code),l.reject(i)}else l.resolve(r)},l.promise}).addCallback(function(r){e.ioArgs=e._pendingDfd&&e._pendingDfd.ioArgs,d.returnFullResponse&&(r={data:r,_xhr:e.ioArgs&&e.ioArgs.xhr,getHeader:k}),e.callback(r),e._pendingDfd=null}).addErrback(function(n){var t,o,i;if(n&&(t=n.code,o=n.subcode,i=n.messageCode,i=i&&i.toUpperCase()),n&&403==t&&(4==o||n.message&&n.message.toLowerCase().indexOf("ssl")>-1&&-1===n.message.toLowerCase().indexOf("permission"))){if(!l._ssl)return l._ssl=l._sslFromServer=!0,void O(e,!0,l,d)}else if(n&&415==n.status){if(C(l.url),!l._err415)return l._err415=1,void O(e,!0,l,d)}else if(f.id&&-1!==r.indexOf(f.id._errorCodes,t)&&!f.id._isPublic(l.url)&&!p&&(403!=t||-1===r.indexOf(q,i)&&(!h.isDefined(o)||2==o&&l._token)))return e._pendingDfd=f.id.getCredential(l.url,{token:l._token,error:n}),void e._pendingDfd.addCallback(function(r){l._token=r.token,l._credential=r,l._ssl=l._sslFromServer||r.ssl,O(e,!0,l,d)}).addErrback(function(r){e.errback(r),e._pendingDfd=null});e.ioArgs=e._pendingDfd&&e._pendingDfd.ioArgs,e.isFulfilled()||e.errback(n),e._pendingDfd=null}).then(null,null,function(r){e.progress(r)})}var c=l.form,p=d.disableIdentityLookup,v=d._preLookup,_=!1;if(g("esri-workers")&&!1!==E.useWorkers)if(!0===d.useWorkers||!0===E.useWorkers)_=!0;else if(d.workerOptions){var x=d.workerOptions;(x.callback||x.worker&&x.worker.worker instanceof Worker)&&(_=!0)}var D=c&&g("esri-file-upload")&&c instanceof FormData,y=c&&(c.elements?r.some(c.elements,function(e){return"file"===e.type}):D),j=-1!==l.url.toLowerCase().indexOf("token=")||l.content&&l.content.token||y&&r.some(c.elements,function(e){return"token"===e.name})?1:0;if(!a){i.addCallback(function(e){if((/\/sharing\/rest\/accounts\/self/i.test(l.url)||/\/sharing\/rest\/portals\/self/i.test(l.url))&&!j&&!l._token&&e.user&&e.user.username){E.webTierAuthServers.push(w(l.url));var r=E.corsEnabledServers,n=m.canUseXhr(l.url,!0),t={host:w(l.url),withCredentials:!0};if(-1===n)r.push(t);else{var o=r[n];o instanceof RegExp?(t.host=o,r.splice(n,1,t)):"object"==typeof o?o.withCredentials=!0:r.splice(n,1,t)}}var i=l._credential;if(i){var s,a=f.id.findServerInfo(i.server),d=a&&a.owningSystemUrl;d&&(d=d.replace(/\/?$/,"/sharing"),(s=f.id.findCredential(d,i.userId))&&-1===f.id._getIdenticalSvcIdx(d,s)&&s.resources.splice(0,0,d))}}),i.addBoth(function(e){delete l._credential,!e||g("ie")&&e.nodeType||(e._ssl=l._ssl)});var R=l.load,L=l.error;R&&i.addCallback(function(e){var r=i._pendingDfd,n=r&&r.ioArgs,t=n&&n.args;return R.call(t,e,n)}),L&&i.addErrback(function(e){var r=i._pendingDfd,n=r&&r.ioArgs,t=n&&n.args;return L.call(t,e,n)})}if(f.id&&!j&&!l._token&&!f.id._isPublic(l.url)&&(!p||v)){var P=f.id.findCredential(l.url);P&&(l._token=P.token,l._ssl=P.ssl)}return _?d.workerOptions&&d.workerOptions.worker?(A||(A=s),s=d.workerOptions.worker,u(i)):e(["./workers/RequestClient"],function(e){if(A||(A=s),d.workerOptions){var r=d.workerOptions;s=e.getClient(r.callback,r.cbFunction)}else s=e.getClient();u(i)}):(A&&(s=A,A=null),u(i)),i}function y(e,r){e.url=m.fixUrl(e.url),r=r||{};var n=new t(v._dfdCanceller),o=x(e.url);return n._pendingDfd=o,o.always(function(t){t&&"cancel"===t.dojoType?n.reject(t):O(n,!1,e,r)}),n}var j,A=null,E=p.defaults.io,q=["COM_0056","COM_0057"],R=0,L=/%[0-9A-F]{2}/i,P=function(){var e=new t;return e.resolve(),e.promise}();return y._makeRequest=b,y._processRequest=O,y._disableCors=C,y._detectCors=x,y.setRequestPreCallback=D,g("extend-esri")&&(f.request=y,f._makeRequest=b,f._processRequest=O,f._disableCors=C,f._detectCors=x,f.setRequestPreCallback=D),y});