source: Dev/trunk/src/client/dojo/request/util.js @ 485

Last change on this file since 485 was 483, checked in by hendrikvanantwerpen, 11 years ago

Added Dojo 1.9.3 release.

File size: 4.1 KB
Line 
1define([
2        'exports',
3        '../errors/RequestError',
4        '../errors/CancelError',
5        '../Deferred',
6        '../io-query',
7        '../_base/array',
8        '../_base/lang',
9        '../promise/Promise'
10], function(exports, RequestError, CancelError, Deferred, ioQuery, array, lang, Promise){
11        exports.deepCopy = function deepCopy(target, source){
12                for(var name in source){
13                        var tval = target[name],
14                                sval = source[name];
15                        if(tval !== sval){
16                                if(tval && typeof tval === 'object' && sval && typeof sval === 'object'){
17                                        exports.deepCopy(tval, sval);
18                                }else{
19                                        target[name] = sval;
20                                }
21                        }
22                }
23                return target;
24        };
25
26        exports.deepCreate = function deepCreate(source, properties){
27                properties = properties || {};
28                var target = lang.delegate(source),
29                        name, value;
30
31                for(name in source){
32                        value = source[name];
33
34                        if(value && typeof value === 'object'){
35                                target[name] = exports.deepCreate(value, properties[name]);
36                        }
37                }
38                return exports.deepCopy(target, properties);
39        };
40
41        var freeze = Object.freeze || function(obj){ return obj; };
42        function okHandler(response){
43                return freeze(response);
44        }
45        function dataHandler (response) {
46                return response.data || response.text;
47        }
48
49        exports.deferred = function deferred(response, cancel, isValid, isReady, handleResponse, last){
50                var def = new Deferred(function(reason){
51                        cancel && cancel(def, response);
52
53                        if(!reason || !(reason instanceof RequestError) && !(reason instanceof CancelError)){
54                                return new CancelError('Request canceled', response);
55                        }
56                        return reason;
57                });
58
59                def.response = response;
60                def.isValid = isValid;
61                def.isReady = isReady;
62                def.handleResponse = handleResponse;
63
64                function errHandler(error){
65                        error.response = response;
66                        throw error;
67                }
68                var responsePromise = def.then(okHandler).otherwise(errHandler);
69
70                if(exports.notify){
71                        responsePromise.then(
72                                lang.hitch(exports.notify, 'emit', 'load'),
73                                lang.hitch(exports.notify, 'emit', 'error')
74                        );
75                }
76
77                var dataPromise = responsePromise.then(dataHandler);
78
79                // http://bugs.dojotoolkit.org/ticket/16794
80                // The following works around a leak in IE9 through the
81                // prototype using lang.delegate on dataPromise and
82                // assigning the result a property with a reference to
83                // responsePromise.
84                var promise = new Promise();
85                for (var prop in dataPromise) {
86                        if (dataPromise.hasOwnProperty(prop)) {
87                                promise[prop] = dataPromise[prop];
88                        }
89                }
90                promise.response = responsePromise;
91                freeze(promise);
92                // End leak fix
93
94
95                if(last){
96                        def.then(function(response){
97                                last.call(def, response);
98                        }, function(error){
99                                last.call(def, response, error);
100                        });
101                }
102
103                def.promise = promise;
104                def.then = promise.then;
105
106                return def;
107        };
108
109        exports.addCommonMethods = function addCommonMethods(provider, methods){
110                array.forEach(methods||['GET', 'POST', 'PUT', 'DELETE'], function(method){
111                        provider[(method === 'DELETE' ? 'DEL' : method).toLowerCase()] = function(url, options){
112                                options = lang.delegate(options||{});
113                                options.method = method;
114                                return provider(url, options);
115                        };
116                });
117        };
118
119        exports.parseArgs = function parseArgs(url, options, skipData){
120                var data = options.data,
121                        query = options.query;
122               
123                if(data && !skipData){
124                        if(typeof data === 'object'){
125                                options.data = ioQuery.objectToQuery(data);
126                        }
127                }
128
129                if(query){
130                        if(typeof query === 'object'){
131                                query = ioQuery.objectToQuery(query);
132                        }
133                        if(options.preventCache){
134                                query += (query ? '&' : '') + 'request.preventCache=' + (+(new Date));
135                        }
136                }else if(options.preventCache){
137                        query = 'request.preventCache=' + (+(new Date));
138                }
139
140                if(url && query){
141                        url += (~url.indexOf('?') ? '&' : '?') + query;
142                }
143
144                return {
145                        url: url,
146                        options: options,
147                        getHeader: function(headerName){ return null; }
148                };
149        };
150
151        exports.checkStatus = function(stat){
152                stat = stat || 0;
153                return (stat >= 200 && stat < 300) || // allow any 2XX response code
154                        stat === 304 ||                 // or, get it out of the cache
155                        stat === 1223 ||                // or, Internet Explorer mangled the status code
156                        !stat;                         // or, we're Titanium/browser chrome/chrome extension requesting a local file
157        };
158});
Note: See TracBrowser for help on using the repository browser.