39
39
40
40
/**
41
41
* Default implementation of {@link CorsProcessor}, as defined by the
42
- * <a href="http://www.w3.org/TR/cors/">CORS W3C recommandation</a>.
42
+ * <a href="http://www.w3.org/TR/cors/">CORS W3C recommendation</a>.
43
+ *
44
+ * <p>Note that when input {@link CorsConfiguration} is {@code null}, this
45
+ * implementation does not reject simple or actual requests outright but simply
46
+ * avoid adding CORS headers to the response.
43
47
*
44
48
* @author Sebastien Deleuze
45
49
* @author Rossen Stoyanhcev
@@ -49,48 +53,37 @@ public class DefaultCorsProcessor implements CorsProcessor {
49
53
50
54
private static final Charset UTF8_CHARSET = Charset .forName ("UTF-8" );
51
55
52
-
53
- protected final Log logger = LogFactory .getLog (getClass ());
56
+ private static final Log logger = LogFactory .getLog (DefaultCorsProcessor .class );
54
57
55
58
56
59
@ Override
57
- public boolean processPreFlightRequest (CorsConfiguration config , HttpServletRequest request ,
60
+ public boolean processRequest (CorsConfiguration config , HttpServletRequest request ,
58
61
HttpServletResponse response ) throws IOException {
59
62
60
- Assert .isTrue (CorsUtils .isPreFlightRequest (request ));
61
-
62
- ServerHttpResponse serverResponse = new ServletServerHttpResponse (response );
63
- if (responseHasCors (serverResponse )) {
64
- return true ;
65
- }
66
-
67
- ServerHttpRequest serverRequest = new ServletServerHttpRequest (request );
68
- if (handleInternal (serverRequest , serverResponse , config , true )) {
69
- serverResponse .flush ();
63
+ if (!CorsUtils .isCorsRequest (request )) {
70
64
return true ;
71
65
}
72
66
73
- return false ;
74
- }
75
-
76
- @ Override
77
- public boolean processActualRequest (CorsConfiguration config , HttpServletRequest request ,
78
- HttpServletResponse response ) throws IOException {
79
-
80
- Assert .isTrue (CorsUtils .isCorsRequest (request ) && !CorsUtils .isPreFlightRequest (request ));
81
-
82
67
ServletServerHttpResponse serverResponse = new ServletServerHttpResponse (response );
68
+ ServletServerHttpRequest serverRequest = new ServletServerHttpRequest (request );
69
+
83
70
if (responseHasCors (serverResponse )) {
84
71
return true ;
85
72
}
86
73
87
- ServletServerHttpRequest serverRequest = new ServletServerHttpRequest (request );
88
- if (handleInternal (serverRequest , serverResponse , config , false )) {
89
- serverResponse .flush ();
90
- return true ;
74
+ boolean preFlightRequest = CorsUtils .isPreFlightRequest (request );
75
+
76
+ if (config == null ) {
77
+ if (preFlightRequest ) {
78
+ rejectRequest (serverResponse );
79
+ return false ;
80
+ }
81
+ else {
82
+ return true ;
83
+ }
91
84
}
92
85
93
- return false ;
86
+ return handleInternal ( serverRequest , serverResponse , config , preFlightRequest ) ;
94
87
}
95
88
96
89
private boolean responseHasCors (ServerHttpResponse response ) {
@@ -107,32 +100,45 @@ private boolean responseHasCors(ServerHttpResponse response) {
107
100
return hasAllowOrigin ;
108
101
}
109
102
103
+ /**
104
+ * Invoked when one of the CORS checks failed.
105
+ * The default implementation sets the response status to 403 and writes
106
+ * "Invalid CORS request" to the response.
107
+ */
108
+ protected void rejectRequest (ServerHttpResponse response ) throws IOException {
109
+ response .setStatusCode (HttpStatus .FORBIDDEN );
110
+ response .getBody ().write ("Invalid CORS request" .getBytes (UTF8_CHARSET ));
111
+ }
112
+
113
+ /**
114
+ * Handle the given request.
115
+ */
110
116
protected boolean handleInternal (ServerHttpRequest request , ServerHttpResponse response ,
111
- CorsConfiguration config , boolean isPreFlight ) throws IOException {
117
+ CorsConfiguration config , boolean preFlightRequest ) throws IOException {
112
118
113
119
String requestOrigin = request .getHeaders ().getOrigin ();
114
120
String allowOrigin = checkOrigin (config , requestOrigin );
115
121
116
- HttpMethod requestMethod = getMethodToUse (request , isPreFlight );
122
+ HttpMethod requestMethod = getMethodToUse (request , preFlightRequest );
117
123
List <HttpMethod > allowMethods = checkMethods (config , requestMethod );
118
124
119
- List <String > requestHeaders = getHeadersToUse (request , isPreFlight );
125
+ List <String > requestHeaders = getHeadersToUse (request , preFlightRequest );
120
126
List <String > allowHeaders = checkHeaders (config , requestHeaders );
121
127
122
- if (allowOrigin == null || allowMethods == null || (isPreFlight && allowHeaders == null )) {
123
- handleInvalidCorsRequest (response );
128
+ if (allowOrigin == null || allowMethods == null || (preFlightRequest && allowHeaders == null )) {
129
+ rejectRequest (response );
124
130
return false ;
125
131
}
126
132
127
133
HttpHeaders responseHeaders = response .getHeaders ();
128
134
responseHeaders .setAccessControlAllowOrigin (allowOrigin );
129
135
responseHeaders .add (HttpHeaders .VARY , HttpHeaders .ORIGIN );
130
136
131
- if (isPreFlight ) {
137
+ if (preFlightRequest ) {
132
138
responseHeaders .setAccessControlAllowMethods (allowMethods );
133
139
}
134
140
135
- if (isPreFlight && !allowHeaders .isEmpty ()) {
141
+ if (preFlightRequest && !allowHeaders .isEmpty ()) {
136
142
responseHeaders .setAccessControlAllowHeaders (allowHeaders );
137
143
}
138
144
@@ -144,10 +150,11 @@ protected boolean handleInternal(ServerHttpRequest request, ServerHttpResponse r
144
150
responseHeaders .setAccessControlAllowCredentials (true );
145
151
}
146
152
147
- if (isPreFlight && config .getMaxAge () != null ) {
153
+ if (preFlightRequest && config .getMaxAge () != null ) {
148
154
responseHeaders .setAccessControlMaxAge (config .getMaxAge ());
149
155
}
150
156
157
+ response .flush ();
151
158
return true ;
152
159
}
153
160
@@ -187,14 +194,4 @@ private List<String> getHeadersToUse(ServerHttpRequest request, boolean isPreFli
187
194
return (isPreFlight ? headers .getAccessControlRequestHeaders () : new ArrayList <String >(headers .keySet ()));
188
195
}
189
196
190
- /**
191
- * Invoked when one of the CORS checks failed.
192
- * The default implementation sets the response status to 403 and writes
193
- * "Invalid CORS request" to the response.
194
- */
195
- protected void handleInvalidCorsRequest (ServerHttpResponse response ) throws IOException {
196
- response .setStatusCode (HttpStatus .FORBIDDEN );
197
- response .getBody ().write ("Invalid CORS request" .getBytes (UTF8_CHARSET ));
198
- }
199
-
200
197
}
0 commit comments