1
1
/*
2
- * Copyright 2002-2019 the original author or authors.
2
+ * Copyright 2002-2020 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.
17
17
package org .springframework .web .servlet .function ;
18
18
19
19
import java .io .IOException ;
20
+ import java .io .InputStream ;
20
21
import java .nio .file .Files ;
22
+ import java .util .Arrays ;
21
23
import java .util .Collections ;
22
24
import java .util .EnumSet ;
23
25
import java .util .List ;
29
31
30
32
import org .springframework .core .io .ClassPathResource ;
31
33
import org .springframework .core .io .Resource ;
34
+ import org .springframework .http .HttpHeaders ;
32
35
import org .springframework .http .HttpMethod ;
33
36
import org .springframework .http .HttpStatus ;
34
37
import org .springframework .http .MediaType ;
35
38
import org .springframework .http .converter .HttpMessageConverter ;
36
39
import org .springframework .http .converter .ResourceHttpMessageConverter ;
40
+ import org .springframework .http .converter .ResourceRegionHttpMessageConverter ;
37
41
import org .springframework .web .servlet .ModelAndView ;
38
42
import org .springframework .web .testfixture .servlet .MockHttpServletRequest ;
39
43
import org .springframework .web .testfixture .servlet .MockHttpServletResponse ;
@@ -56,10 +60,11 @@ public class ResourceHandlerFunctionTests {
56
60
@ BeforeEach
57
61
public void createContext () {
58
62
this .messageConverter = new ResourceHttpMessageConverter ();
63
+ ResourceRegionHttpMessageConverter regionConverter = new ResourceRegionHttpMessageConverter ();
59
64
this .context = new ServerResponse .Context () {
60
65
@ Override
61
66
public List <HttpMessageConverter <?>> messageConverters () {
62
- return Collections . singletonList (messageConverter );
67
+ return Arrays . asList (messageConverter , regionConverter );
63
68
}
64
69
65
70
};
@@ -73,8 +78,7 @@ public void get() throws IOException, ServletException {
73
78
74
79
ServerResponse response = this .handlerFunction .handle (request );
75
80
assertThat (response .statusCode ()).isEqualTo (HttpStatus .OK );
76
- boolean condition = response instanceof EntityResponse ;
77
- assertThat (condition ).isTrue ();
81
+ assertThat (response ).isInstanceOf (EntityResponse .class );
78
82
@ SuppressWarnings ("unchecked" )
79
83
EntityResponse <Resource > entityResponse = (EntityResponse <Resource >) response ;
80
84
assertThat (entityResponse .entity ()).isEqualTo (this .resource );
@@ -91,15 +95,69 @@ public void get() throws IOException, ServletException {
91
95
assertThat (servletResponse .getContentLength ()).isEqualTo (this .resource .contentLength ());
92
96
}
93
97
98
+ @ Test
99
+ public void getRange () throws IOException , ServletException {
100
+ MockHttpServletRequest servletRequest = new MockHttpServletRequest ("GET" , "/" );
101
+ servletRequest .addHeader ("Range" , "bytes=0-5" );
102
+ ServerRequest request = new DefaultServerRequest (servletRequest , Collections .singletonList (messageConverter ));
103
+
104
+ ServerResponse response = this .handlerFunction .handle (request );
105
+ assertThat (response .statusCode ()).isEqualTo (HttpStatus .OK );
106
+ assertThat (response ).isInstanceOf (EntityResponse .class );
107
+ @ SuppressWarnings ("unchecked" )
108
+ EntityResponse <Resource > entityResponse = (EntityResponse <Resource >) response ;
109
+ assertThat (entityResponse .entity ()).isEqualTo (this .resource );
110
+
111
+ MockHttpServletResponse servletResponse = new MockHttpServletResponse ();
112
+ ModelAndView mav = response .writeTo (servletRequest , servletResponse , this .context );
113
+ assertThat (mav ).isNull ();
114
+
115
+ assertThat (servletResponse .getStatus ()).isEqualTo (206 );
116
+ byte [] expectedBytes = new byte [6 ];
117
+ try (InputStream is = this .resource .getInputStream ()) {
118
+ is .read (expectedBytes );
119
+ }
120
+ byte [] actualBytes = servletResponse .getContentAsByteArray ();
121
+ assertThat (actualBytes ).isEqualTo (expectedBytes );
122
+ assertThat (servletResponse .getContentType ()).isEqualTo (MediaType .TEXT_PLAIN_VALUE );
123
+ assertThat (servletResponse .getContentLength ()).isEqualTo (6 );
124
+ assertThat (servletResponse .getHeader (HttpHeaders .ACCEPT_RANGES )).isEqualTo ("bytes" );
125
+ }
126
+
127
+ @ Test
128
+ public void getInvalidRange () throws IOException , ServletException {
129
+ MockHttpServletRequest servletRequest = new MockHttpServletRequest ("GET" , "/" );
130
+ servletRequest .addHeader ("Range" , "bytes=0-10, 0-10, 0-10, 0-10, 0-10, 0-10" );
131
+ ServerRequest request = new DefaultServerRequest (servletRequest , Collections .singletonList (messageConverter ));
132
+
133
+ ServerResponse response = this .handlerFunction .handle (request );
134
+ assertThat (response .statusCode ()).isEqualTo (HttpStatus .OK );
135
+ assertThat (response ).isInstanceOf (EntityResponse .class );
136
+ @ SuppressWarnings ("unchecked" )
137
+ EntityResponse <Resource > entityResponse = (EntityResponse <Resource >) response ;
138
+ assertThat (entityResponse .entity ()).isEqualTo (this .resource );
139
+
140
+ MockHttpServletResponse servletResponse = new MockHttpServletResponse ();
141
+ ModelAndView mav = response .writeTo (servletRequest , servletResponse , this .context );
142
+ assertThat (mav ).isNull ();
143
+
144
+ assertThat (servletResponse .getStatus ()).isEqualTo (416 );
145
+ byte [] expectedBytes = Files .readAllBytes (this .resource .getFile ().toPath ());
146
+ byte [] actualBytes = servletResponse .getContentAsByteArray ();
147
+ assertThat (actualBytes ).isEqualTo (expectedBytes );
148
+ assertThat (servletResponse .getContentType ()).isEqualTo (MediaType .TEXT_PLAIN_VALUE );
149
+ assertThat (servletResponse .getContentLength ()).isEqualTo (this .resource .contentLength ());
150
+ assertThat (servletResponse .getHeader (HttpHeaders .ACCEPT_RANGES )).isEqualTo ("bytes" );
151
+ }
152
+
94
153
@ Test
95
154
public void head () throws IOException , ServletException {
96
155
MockHttpServletRequest servletRequest = new MockHttpServletRequest ("HEAD" , "/" );
97
156
ServerRequest request = new DefaultServerRequest (servletRequest , Collections .singletonList (messageConverter ));
98
157
99
158
ServerResponse response = this .handlerFunction .handle (request );
100
159
assertThat (response .statusCode ()).isEqualTo (HttpStatus .OK );
101
- boolean condition = response instanceof EntityResponse ;
102
- assertThat (condition ).isTrue ();
160
+ assertThat (response ).isInstanceOf (EntityResponse .class );
103
161
@ SuppressWarnings ("unchecked" )
104
162
EntityResponse <Resource > entityResponse = (EntityResponse <Resource >) response ;
105
163
assertThat (entityResponse .entity ().getFilename ()).isEqualTo (this .resource .getFilename ());
@@ -136,4 +194,5 @@ public void options() throws ServletException, IOException {
136
194
assertThat (actualBytes .length ).isEqualTo (0 );
137
195
}
138
196
197
+
139
198
}
0 commit comments