@@ -9,9 +9,12 @@ var jsonType = {'Content-Type': 'application/json;charset=utf-8'};
99
1010module . exports = function ( Vue ) {
1111
12+ var Url = Vue . url ;
13+ var originUrl = Url . parse ( location . href ) ;
14+
1215 function Http ( url , options ) {
1316
14- var self = this , headers , promise ;
17+ var self = this , promise ;
1518
1619 options = options || { } ;
1720
@@ -20,21 +23,45 @@ module.exports = function (Vue) {
2023 url = '' ;
2124 }
2225
23- headers = _ . extend ( { } ,
24- Http . headers . common ,
25- Http . headers [ options . method . toLowerCase ( ) ]
26+ options = _ . extend ( true , { url : url } ,
27+ Http . options , _ . options ( 'http' , this , options )
2628 ) ;
2729
28- options = _ . extend ( true , { url : url , headers : headers } ,
29- Http . options , _ . options ( 'http' , this , options )
30+ if ( options . crossOrigin === null ) {
31+ options . crossOrigin = crossOrigin ( options . url ) ;
32+ }
33+
34+ options . headers = _ . extend ( { } ,
35+ Http . headers . common ,
36+ ! options . crossOrigin ? Http . headers . custom : { } ,
37+ Http . headers [ options . method . toLowerCase ( ) ] ,
38+ options . headers
3039 ) ;
3140
3241 if ( _ . isPlainObject ( options . data ) && / ^ ( g e t | j s o n p ) $ / i. test ( options . method ) ) {
3342 _ . extend ( options . params , options . data ) ;
3443 delete options . data ;
3544 }
3645
37- promise = ( options . method . toLowerCase ( ) == 'jsonp' ? jsonp : xhr ) . call ( this , this . $url || Vue . url , options ) ;
46+ if ( options . emulateHTTP && ! option . crossOrigin && / ^ ( p u t | p a t c h | d e l e t e ) $ / i. test ( options . method ) ) {
47+ options . headers [ 'X-HTTP-Method-Override' ] = options . method ;
48+ options . method = 'post' ;
49+ }
50+
51+ if ( options . emulateJSON && _ . isPlainObject ( options . data ) ) {
52+ options . headers [ 'Content-Type' ] = 'application/x-www-form-urlencoded' ;
53+ options . data = Url . params ( options . data ) ;
54+ }
55+
56+ if ( _ . isObject ( options . data ) && / F o r m D a t a / i. test ( options . data . toString ( ) ) ) {
57+ delete options . headers [ 'Content-Type' ] ;
58+ }
59+
60+ if ( _ . isPlainObject ( options . data ) ) {
61+ options . data = JSON . stringify ( options . data ) ;
62+ }
63+
64+ promise = ( options . method . toLowerCase ( ) == 'jsonp' ? jsonp : xhr ) . call ( this , this . $url || Url , options ) ;
3865
3966 promise . then ( transformResponse , transformResponse ) ;
4067
@@ -88,12 +115,20 @@ module.exports = function (Vue) {
88115
89116 }
90117
118+ function crossOrigin ( url ) {
119+
120+ var requestUrl = Url . parse ( url ) ;
121+
122+ return ( requestUrl . protocol !== originUrl . protocol || requestUrl . host !== originUrl . host ) ;
123+ }
124+
91125 Http . options = {
92126 method : 'get' ,
93127 params : { } ,
94128 data : '' ,
95129 jsonp : 'callback' ,
96130 beforeSend : null ,
131+ crossOrigin : null ,
97132 emulateHTTP : false ,
98133 emulateJSON : false
99134 } ;
@@ -103,10 +138,8 @@ module.exports = function (Vue) {
103138 post : jsonType ,
104139 patch : jsonType ,
105140 delete : jsonType ,
106- common : {
107- 'Accept' : 'application/json, text/plain, */*' ,
108- 'X-Requested-With' : 'XMLHttpRequest'
109- }
141+ common : { 'Accept' : 'application/json, text/plain, */*' } ,
142+ custom : { 'X-Requested-With' : 'XMLHttpRequest' }
110143 } ;
111144
112145 [ 'get' , 'put' , 'post' , 'patch' , 'delete' , 'jsonp' ] . forEach ( function ( method ) {
0 commit comments