1
1
/*
2
- * Copyright 2002-2018 the original author or authors.
2
+ * Copyright 2002-2019 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
19
19
import java .io .IOException ;
20
20
import java .nio .charset .StandardCharsets ;
21
21
import java .util .ArrayList ;
22
- import java .util .Arrays ;
23
22
import java .util .List ;
24
23
import javax .servlet .http .HttpServletRequest ;
25
24
import javax .servlet .http .HttpServletResponse ;
36
35
import org .springframework .http .server .ServletServerHttpResponse ;
37
36
import org .springframework .lang .Nullable ;
38
37
import org .springframework .util .CollectionUtils ;
39
- import org .springframework .web .util .WebUtils ;
40
38
41
39
/**
42
40
* The default implementation of {@link CorsProcessor}, as defined by the
45
43
* <p>Note that when input {@link CorsConfiguration} is {@code null}, this
46
44
* implementation does not reject simple or actual requests outright but simply
47
45
* avoid adding CORS headers to the response. CORS processing is also skipped
48
- * if the response already contains CORS headers, or if the request is detected
49
- * as a same-origin one.
46
+ * if the response already contains CORS headers.
50
47
*
51
48
* @author Sebastien Deleuze
52
49
* @author Rossen Stoyanchev
@@ -62,44 +59,31 @@ public class DefaultCorsProcessor implements CorsProcessor {
62
59
public boolean processRequest (@ Nullable CorsConfiguration config , HttpServletRequest request ,
63
60
HttpServletResponse response ) throws IOException {
64
61
62
+ response .addHeader (HttpHeaders .VARY , HttpHeaders .ORIGIN );
63
+ response .addHeader (HttpHeaders .VARY , HttpHeaders .ACCESS_CONTROL_REQUEST_METHOD );
64
+ response .addHeader (HttpHeaders .VARY , HttpHeaders .ACCESS_CONTROL_REQUEST_HEADERS );
65
+
65
66
if (!CorsUtils .isCorsRequest (request )) {
66
67
return true ;
67
68
}
68
69
69
- ServletServerHttpResponse serverResponse = new ServletServerHttpResponse (response );
70
- if (responseHasCors (serverResponse )) {
70
+ if (response .getHeader (HttpHeaders .ACCESS_CONTROL_ALLOW_ORIGIN ) != null ) {
71
71
logger .trace ("Skip: response already contains \" Access-Control-Allow-Origin\" " );
72
72
return true ;
73
73
}
74
74
75
- ServletServerHttpRequest serverRequest = new ServletServerHttpRequest (request );
76
- if (WebUtils .isSameOrigin (serverRequest )) {
77
- logger .trace ("Skip: request is from same origin" );
78
- return true ;
79
- }
80
-
81
75
boolean preFlightRequest = CorsUtils .isPreFlightRequest (request );
82
76
if (config == null ) {
83
77
if (preFlightRequest ) {
84
- rejectRequest (serverResponse );
78
+ rejectRequest (new ServletServerHttpResponse ( response ) );
85
79
return false ;
86
80
}
87
81
else {
88
82
return true ;
89
83
}
90
84
}
91
85
92
- return handleInternal (serverRequest , serverResponse , config , preFlightRequest );
93
- }
94
-
95
- private boolean responseHasCors (ServerHttpResponse response ) {
96
- try {
97
- return (response .getHeaders ().getAccessControlAllowOrigin () != null );
98
- }
99
- catch (NullPointerException npe ) {
100
- // SPR-11919 and https://issues.jboss.org/browse/WFLY-3474
101
- return false ;
102
- }
86
+ return handleInternal (new ServletServerHttpRequest (request ), new ServletServerHttpResponse (response ), config , preFlightRequest );
103
87
}
104
88
105
89
/**
@@ -110,6 +94,7 @@ private boolean responseHasCors(ServerHttpResponse response) {
110
94
protected void rejectRequest (ServerHttpResponse response ) throws IOException {
111
95
response .setStatusCode (HttpStatus .FORBIDDEN );
112
96
response .getBody ().write ("Invalid CORS request" .getBytes (StandardCharsets .UTF_8 ));
97
+ response .flush ();
113
98
}
114
99
115
100
/**
@@ -122,9 +107,6 @@ protected boolean handleInternal(ServerHttpRequest request, ServerHttpResponse r
122
107
String allowOrigin = checkOrigin (config , requestOrigin );
123
108
HttpHeaders responseHeaders = response .getHeaders ();
124
109
125
- responseHeaders .addAll (HttpHeaders .VARY , Arrays .asList (HttpHeaders .ORIGIN ,
126
- HttpHeaders .ACCESS_CONTROL_REQUEST_METHOD , HttpHeaders .ACCESS_CONTROL_REQUEST_HEADERS ));
127
-
128
110
if (allowOrigin == null ) {
129
111
logger .debug ("Reject: '" + requestOrigin + "' origin is not allowed" );
130
112
rejectRequest (response );
0 commit comments