3939
4040/**
4141 * 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.
4347 *
4448 * @author Sebastien Deleuze
4549 * @author Rossen Stoyanhcev
@@ -49,48 +53,37 @@ public class DefaultCorsProcessor implements CorsProcessor {
4953
5054 private static final Charset UTF8_CHARSET = Charset .forName ("UTF-8" );
5155
52-
53- protected final Log logger = LogFactory .getLog (getClass ());
56+ private static final Log logger = LogFactory .getLog (DefaultCorsProcessor .class );
5457
5558
5659 @ Override
57- public boolean processPreFlightRequest (CorsConfiguration config , HttpServletRequest request ,
60+ public boolean processRequest (CorsConfiguration config , HttpServletRequest request ,
5861 HttpServletResponse response ) throws IOException {
5962
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 )) {
7064 return true ;
7165 }
7266
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-
8267 ServletServerHttpResponse serverResponse = new ServletServerHttpResponse (response );
68+ ServletServerHttpRequest serverRequest = new ServletServerHttpRequest (request );
69+
8370 if (responseHasCors (serverResponse )) {
8471 return true ;
8572 }
8673
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+ }
9184 }
9285
93- return false ;
86+ return handleInternal ( serverRequest , serverResponse , config , preFlightRequest ) ;
9487 }
9588
9689 private boolean responseHasCors (ServerHttpResponse response ) {
@@ -107,32 +100,45 @@ private boolean responseHasCors(ServerHttpResponse response) {
107100 return hasAllowOrigin ;
108101 }
109102
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+ */
110116 protected boolean handleInternal (ServerHttpRequest request , ServerHttpResponse response ,
111- CorsConfiguration config , boolean isPreFlight ) throws IOException {
117+ CorsConfiguration config , boolean preFlightRequest ) throws IOException {
112118
113119 String requestOrigin = request .getHeaders ().getOrigin ();
114120 String allowOrigin = checkOrigin (config , requestOrigin );
115121
116- HttpMethod requestMethod = getMethodToUse (request , isPreFlight );
122+ HttpMethod requestMethod = getMethodToUse (request , preFlightRequest );
117123 List <HttpMethod > allowMethods = checkMethods (config , requestMethod );
118124
119- List <String > requestHeaders = getHeadersToUse (request , isPreFlight );
125+ List <String > requestHeaders = getHeadersToUse (request , preFlightRequest );
120126 List <String > allowHeaders = checkHeaders (config , requestHeaders );
121127
122- if (allowOrigin == null || allowMethods == null || (isPreFlight && allowHeaders == null )) {
123- handleInvalidCorsRequest (response );
128+ if (allowOrigin == null || allowMethods == null || (preFlightRequest && allowHeaders == null )) {
129+ rejectRequest (response );
124130 return false ;
125131 }
126132
127133 HttpHeaders responseHeaders = response .getHeaders ();
128134 responseHeaders .setAccessControlAllowOrigin (allowOrigin );
129135 responseHeaders .add (HttpHeaders .VARY , HttpHeaders .ORIGIN );
130136
131- if (isPreFlight ) {
137+ if (preFlightRequest ) {
132138 responseHeaders .setAccessControlAllowMethods (allowMethods );
133139 }
134140
135- if (isPreFlight && !allowHeaders .isEmpty ()) {
141+ if (preFlightRequest && !allowHeaders .isEmpty ()) {
136142 responseHeaders .setAccessControlAllowHeaders (allowHeaders );
137143 }
138144
@@ -144,10 +150,11 @@ protected boolean handleInternal(ServerHttpRequest request, ServerHttpResponse r
144150 responseHeaders .setAccessControlAllowCredentials (true );
145151 }
146152
147- if (isPreFlight && config .getMaxAge () != null ) {
153+ if (preFlightRequest && config .getMaxAge () != null ) {
148154 responseHeaders .setAccessControlMaxAge (config .getMaxAge ());
149155 }
150156
157+ response .flush ();
151158 return true ;
152159 }
153160
@@ -187,14 +194,4 @@ private List<String> getHeadersToUse(ServerHttpRequest request, boolean isPreFli
187194 return (isPreFlight ? headers .getAccessControlRequestHeaders () : new ArrayList <String >(headers .keySet ()));
188195 }
189196
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-
200197}
0 commit comments