15
15
*/
16
16
package org .springframework .security .test .web .servlet .request ;
17
17
18
- import javax .servlet .ServletContext ;
19
-
18
+ import org .springframework .beans .Mergeable ;
20
19
import org .springframework .http .MediaType ;
21
20
import org .springframework .mock .web .MockHttpServletRequest ;
22
21
import org .springframework .security .web .csrf .CsrfToken ;
23
22
import org .springframework .test .web .servlet .MockMvc ;
24
23
import org .springframework .test .web .servlet .RequestBuilder ;
24
+ import org .springframework .test .web .servlet .request .MockHttpServletRequestBuilder ;
25
25
import org .springframework .test .web .servlet .request .RequestPostProcessor ;
26
26
import org .springframework .web .util .UriComponentsBuilder ;
27
27
28
+ import javax .servlet .ServletContext ;
29
+
28
30
import static org .springframework .security .test .web .servlet .request .SecurityMockMvcRequestPostProcessors .csrf ;
29
31
import static org .springframework .test .web .servlet .request .MockMvcRequestBuilders .post ;
30
32
@@ -86,15 +88,23 @@ public static LogoutRequestBuilder logout(String logoutUrl) {
86
88
* @author Rob Winch
87
89
* @since 4.0
88
90
*/
89
- public static final class LogoutRequestBuilder implements RequestBuilder {
91
+ public static final class LogoutRequestBuilder implements RequestBuilder , Mergeable {
90
92
private String logoutUrl = "/logout" ;
91
93
private RequestPostProcessor postProcessor = csrf ();
94
+ private Mergeable parent ;
92
95
93
96
@ Override
94
97
public MockHttpServletRequest buildRequest (ServletContext servletContext ) {
95
- MockHttpServletRequest request = post (this .logoutUrl )
96
- .accept (MediaType .TEXT_HTML , MediaType .ALL )
97
- .buildRequest (servletContext );
98
+ MockHttpServletRequestBuilder logoutRequest = post (this .logoutUrl )
99
+ .accept (MediaType .TEXT_HTML , MediaType .ALL );
100
+
101
+ if (this .parent != null ) {
102
+ logoutRequest = (MockHttpServletRequestBuilder ) logoutRequest .merge (this .parent );
103
+ }
104
+
105
+ MockHttpServletRequest request = logoutRequest .buildRequest (servletContext );
106
+ logoutRequest .postProcessRequest (request );
107
+
98
108
return this .postProcessor .postProcessRequest (request );
99
109
}
100
110
@@ -122,6 +132,24 @@ public LogoutRequestBuilder logoutUrl(String logoutUrl, Object... uriVars) {
122
132
return this ;
123
133
}
124
134
135
+ @ Override
136
+ public boolean isMergeEnabled () {
137
+ return true ;
138
+ }
139
+
140
+ @ Override
141
+ public Object merge (Object parent ) {
142
+ if (parent == null ) {
143
+ return this ;
144
+ }
145
+ if (parent instanceof Mergeable ) {
146
+ this .parent = (Mergeable ) parent ;
147
+ return this ;
148
+ } else {
149
+ throw new IllegalArgumentException ("Cannot merge with [" + parent .getClass ().getName () + "]" );
150
+ }
151
+ }
152
+
125
153
private LogoutRequestBuilder () {
126
154
}
127
155
}
@@ -132,22 +160,31 @@ private LogoutRequestBuilder() {
132
160
* @author Rob Winch
133
161
* @since 4.0
134
162
*/
135
- public static final class FormLoginRequestBuilder implements RequestBuilder {
163
+ public static final class FormLoginRequestBuilder implements RequestBuilder , Mergeable {
136
164
private String usernameParam = "username" ;
137
165
private String passwordParam = "password" ;
138
166
private String username = "user" ;
139
167
private String password = "password" ;
140
168
private String loginProcessingUrl = "/login" ;
141
169
private MediaType acceptMediaType = MediaType .APPLICATION_FORM_URLENCODED ;
170
+ private Mergeable parent ;
142
171
143
172
private RequestPostProcessor postProcessor = csrf ();
144
173
145
174
@ Override
146
175
public MockHttpServletRequest buildRequest (ServletContext servletContext ) {
147
- MockHttpServletRequest request = post (this .loginProcessingUrl )
148
- .accept (this .acceptMediaType ).param (this .usernameParam , this .username )
149
- .param (this .passwordParam , this .password )
150
- .buildRequest (servletContext );
176
+ MockHttpServletRequestBuilder loginRequest = post (this .loginProcessingUrl )
177
+ .accept (this .acceptMediaType )
178
+ .param (this .usernameParam , this .username )
179
+ .param (this .passwordParam , this .password );
180
+
181
+ if (this .parent != null ) {
182
+ loginRequest = (MockHttpServletRequestBuilder ) loginRequest .merge (this .parent );
183
+ }
184
+
185
+ MockHttpServletRequest request = loginRequest .buildRequest (servletContext );
186
+ loginRequest .postProcessRequest (request );
187
+
151
188
return this .postProcessor .postProcessRequest (request );
152
189
}
153
190
@@ -258,6 +295,24 @@ public FormLoginRequestBuilder acceptMediaType(MediaType acceptMediaType) {
258
295
return this ;
259
296
}
260
297
298
+ @ Override
299
+ public boolean isMergeEnabled () {
300
+ return true ;
301
+ }
302
+
303
+ @ Override
304
+ public Object merge (Object parent ) {
305
+ if (parent == null ) {
306
+ return this ;
307
+ }
308
+ if (parent instanceof Mergeable ) {
309
+ this .parent = (Mergeable ) parent ;
310
+ return this ;
311
+ } else {
312
+ throw new IllegalArgumentException ("Cannot merge with [" + parent .getClass ().getName () + "]" );
313
+ }
314
+ }
315
+
261
316
private FormLoginRequestBuilder () {
262
317
}
263
318
}
0 commit comments