@@ -22,105 +22,28 @@ exports.route = function (options) {
22
22
settings . _headersString = settings . _headers . join ( ',' ) ;
23
23
settings . _exposedHeaders = settings . exposedHeaders . concat ( settings . additionalExposedHeaders ) . join ( ',' ) ;
24
24
25
- if ( settings . origin . length ) {
25
+ if ( settings . origin . indexOf ( '*' ) !== - 1 ) {
26
+ Hoek . assert ( settings . origin . length === 1 , 'Cannot specify cors.origin * together with other values' ) ;
27
+ settings . _origin = true ;
28
+ }
29
+ else {
26
30
settings . _origin = {
27
- any : false ,
28
31
qualified : [ ] ,
29
- qualifiedString : '' ,
30
32
wildcards : [ ]
31
33
} ;
32
34
33
- if ( settings . origin . indexOf ( '*' ) !== - 1 ) {
34
- Hoek . assert ( settings . origin . length === 1 , 'Cannot specify cors.origin * together with other values' ) ;
35
- settings . _origin . any = true ;
36
- }
37
- else {
38
- for ( var c = 0 , cl = settings . origin . length ; c < cl ; ++ c ) {
39
- var origin = settings . origin [ c ] ;
40
- if ( origin . indexOf ( '*' ) !== - 1 ) {
41
- settings . _origin . wildcards . push ( new RegExp ( '^' + Hoek . escapeRegex ( origin ) . replace ( / \\ \* / g, '.*' ) . replace ( / \\ \? / g, '.' ) + '$' ) ) ;
42
- }
43
- else {
44
- settings . _origin . qualified . push ( origin ) ;
45
- }
35
+ for ( var c = 0 , cl = settings . origin . length ; c < cl ; ++ c ) {
36
+ var origin = settings . origin [ c ] ;
37
+ if ( origin . indexOf ( '*' ) !== - 1 ) {
38
+ settings . _origin . wildcards . push ( new RegExp ( '^' + Hoek . escapeRegex ( origin ) . replace ( / \\ \* / g, '.*' ) . replace ( / \\ \? / g, '.' ) + '$' ) ) ;
46
39
}
47
-
48
- Hoek . assert ( settings . matchOrigin || ! settings . _origin . wildcards . length , 'Cannot include wildcard origin values with matchOrigin disabled' ) ;
49
- settings . _origin . qualifiedString = settings . _origin . qualified . join ( ' ' ) ;
50
- }
51
- }
52
-
53
- return settings ;
54
- } ;
55
-
56
-
57
- exports . headers = function ( response , options ) {
58
-
59
- var request = response . request ;
60
- var settings = options || request . route . settings . cors ;
61
- if ( ! settings ) {
62
- return ;
63
- }
64
-
65
- if ( settings . _origin &&
66
- ( ! response . headers [ 'access-control-allow-origin' ] || settings . override ) ) {
67
-
68
- if ( settings . matchOrigin ) {
69
- response . vary ( 'origin' ) ;
70
- if ( internals . matchOrigin ( request . headers . origin , settings ) ) {
71
- response . _header ( 'access-control-allow-origin' , request . headers . origin ) ;
72
- }
73
- else if ( settings . isOriginExposed ) {
74
- response . _header ( 'access-control-allow-origin' , settings . _origin . any ? '*' : settings . _origin . qualifiedString ) ;
40
+ else {
41
+ settings . _origin . qualified . push ( origin ) ;
75
42
}
76
43
}
77
- else if ( settings . _origin . any ) {
78
- response . _header ( 'access-control-allow-origin' , '*' ) ;
79
- }
80
- else {
81
- response . _header ( 'access-control-allow-origin' , settings . _origin . qualifiedString ) ;
82
- }
83
- }
84
-
85
- var config = { override : ! ! settings . override } ; // Value can be 'merge'
86
-
87
- if ( settings . credentials ) {
88
- response . _header ( 'access-control-allow-credentials' , 'true' , { override : settings . override } ) ;
89
- }
90
-
91
- // Appended headers
92
-
93
- if ( settings . override === 'merge' ) {
94
- config . append = true ;
95
- }
96
-
97
- if ( settings . _exposedHeaders . length !== 0 ) {
98
- response . _header ( 'access-control-expose-headers' , settings . _exposedHeaders , config ) ;
99
- }
100
- } ;
101
-
102
-
103
- internals . matchOrigin = function ( origin , settings ) {
104
-
105
- if ( ! origin ) {
106
- return false ;
107
- }
108
-
109
- if ( settings . _origin . any ) {
110
- return true ;
111
- }
112
-
113
- if ( settings . _origin . qualified . indexOf ( origin ) !== - 1 ) {
114
- return true ;
115
- }
116
-
117
- for ( var i = 0 , il = settings . _origin . wildcards . length ; i < il ; ++ i ) {
118
- if ( origin . match ( settings . _origin . wildcards [ i ] ) ) {
119
- return true ;
120
- }
121
44
}
122
45
123
- return false ;
46
+ return settings ;
124
47
} ;
125
48
126
49
@@ -184,6 +107,12 @@ internals.handler = function (request, reply) {
184
107
return reply ( Boom . notFound ( ) ) ;
185
108
}
186
109
110
+ // Validate Origin header
111
+
112
+ if ( ! internals . matchOrigin ( origin , settings ) ) {
113
+ return reply ( Boom . notFound ( ) ) ;
114
+ }
115
+
187
116
// Validate allowed headers
188
117
189
118
var headers = request . headers [ 'access-control-request-headers' ] ;
@@ -197,8 +126,64 @@ internals.handler = function (request, reply) {
197
126
// Reply with the route CORS headers
198
127
199
128
var response = reply ( ) ;
200
- exports . headers ( response , settings ) ;
129
+ response . _header ( 'access-control-allow-origin' , request . headers . origin ) ;
201
130
response . _header ( 'access-control-allow-methods' , method ) ;
202
131
response . _header ( 'access-control-allow-headers' , settings . _headersString ) ;
203
132
response . _header ( 'access-control-max-age' , settings . maxAge ) ;
133
+
134
+ if ( settings . credentials ) {
135
+ response . _header ( 'access-control-allow-credentials' , 'true' ) ;
136
+ }
137
+
138
+ if ( settings . _exposedHeaders ) {
139
+ response . _header ( 'access-control-expose-headers' , settings . _exposedHeaders ) ;
140
+ }
141
+ } ;
142
+
143
+
144
+ exports . headers = function ( response ) {
145
+
146
+ var request = response . request ;
147
+ var settings = request . route . settings . cors ;
148
+ if ( ! settings ) {
149
+ return ;
150
+ }
151
+
152
+ response . vary ( 'origin' ) ;
153
+
154
+ if ( ! request . headers . origin ||
155
+ ! internals . matchOrigin ( request . headers . origin , settings ) ) {
156
+
157
+ return ;
158
+ }
159
+
160
+ response . _header ( 'access-control-allow-origin' , request . headers . origin ) ;
161
+
162
+ if ( settings . credentials ) {
163
+ response . _header ( 'access-control-allow-credentials' , 'true' ) ;
164
+ }
165
+
166
+ if ( settings . _exposedHeaders ) {
167
+ response . _header ( 'access-control-expose-headers' , settings . _exposedHeaders , { append : true } ) ;
168
+ }
169
+ } ;
170
+
171
+
172
+ internals . matchOrigin = function ( origin , settings ) {
173
+
174
+ if ( settings . _origin === true ) {
175
+ return true ;
176
+ }
177
+
178
+ if ( settings . _origin . qualified . indexOf ( origin ) !== - 1 ) {
179
+ return true ;
180
+ }
181
+
182
+ for ( var i = 0 , il = settings . _origin . wildcards . length ; i < il ; ++ i ) {
183
+ if ( origin . match ( settings . _origin . wildcards [ i ] ) ) {
184
+ return true ;
185
+ }
186
+ }
187
+
188
+ return false ;
204
189
} ;
0 commit comments