Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
爱吃血肠
spring-framework
提交
578af59f
S
spring-framework
项目概览
爱吃血肠
/
spring-framework
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
spring-framework
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
578af59f
编写于
9月 20, 2016
作者:
B
Brian Clozel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Polish byte-range resource handling
上级
129d7bef
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
35 addition
and
30 deletion
+35
-30
spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/ResourceWebHandler.java
...ngframework/web/reactive/resource/ResourceWebHandler.java
+2
-3
spring-web-reactive/src/test/java/org/springframework/web/reactive/resource/ResourceWebHandlerTests.java
...mework/web/reactive/resource/ResourceWebHandlerTests.java
+4
-4
spring-web/src/main/java/org/springframework/http/codec/ResourceHttpMessageWriter.java
...springframework/http/codec/ResourceHttpMessageWriter.java
+22
-16
spring-web/src/test/java/org/springframework/http/codec/ResourceHttpMessageWriterTests.java
...gframework/http/codec/ResourceHttpMessageWriterTests.java
+7
-7
未找到文件。
spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/ResourceWebHandler.java
浏览文件 @
578af59f
...
...
@@ -54,7 +54,6 @@ import org.springframework.web.reactive.HandlerMapping;
import
org.springframework.web.reactive.accept.CompositeContentTypeResolver
;
import
org.springframework.web.reactive.accept.PathExtensionContentTypeResolver
;
import
org.springframework.web.server.MethodNotAllowedException
;
import
org.springframework.web.server.ResponseStatusException
;
import
org.springframework.web.server.ServerWebExchange
;
import
org.springframework.web.server.WebHandler
;
...
...
@@ -331,6 +330,7 @@ public class ResourceWebHandler
// Content phase
if
(
HttpMethod
.
HEAD
.
equals
(
exchange
.
getRequest
().
getMethod
()))
{
setHeaders
(
exchange
,
resource
,
mediaType
);
exchange
.
getResponse
().
getHeaders
().
set
(
HttpHeaders
.
ACCEPT_RANGES
,
"bytes"
);
logger
.
trace
(
"HEAD request - skipping content"
);
return
Mono
.
empty
();
}
...
...
@@ -340,7 +340,7 @@ public class ResourceWebHandler
null
,
ResolvableType
.
forClass
(
Resource
.
class
),
mediaType
,
exchange
.
getRequest
(),
exchange
.
getResponse
(),
Collections
.
emptyMap
());
}
catch
(
IOException
|
ResponseStatusException
ex
)
{
catch
(
IOException
ex
)
{
return
Mono
.
error
(
ex
);
}
});
...
...
@@ -503,7 +503,6 @@ public class ResourceWebHandler
HttpHeaders
resourceHeaders
=
((
HttpResource
)
resource
).
getResponseHeaders
();
exchange
.
getResponse
().
getHeaders
().
putAll
(
resourceHeaders
);
}
headers
.
set
(
HttpHeaders
.
ACCEPT_RANGES
,
"bytes"
);
}
...
...
spring-web-reactive/src/test/java/org/springframework/web/reactive/resource/ResourceWebHandlerTests.java
浏览文件 @
578af59f
...
...
@@ -525,10 +525,10 @@ public class ResourceWebHandlerTests {
this
.
request
.
addHeader
(
"Range"
,
"bytes= foo bar"
);
this
.
exchange
.
getAttributes
().
put
(
PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE
,
"foo.txt"
);
TestSubscriber
.
subscribe
(
this
.
handler
.
handle
(
this
.
exchange
))
.
assertErrorWith
(
throwable
->
{
assertThat
(
throwable
,
instanceOf
(
IllegalArgumentException
.
class
));
}
);
TestSubscriber
.
subscribe
(
this
.
handler
.
handle
(
this
.
exchange
))
.
assertComplete
();
assertEquals
(
HttpStatus
.
REQUESTED_RANGE_NOT_SATISFIABLE
,
this
.
response
.
getStatusCode
(
));
assertEquals
(
"bytes"
,
this
.
response
.
getHeaders
().
getFirst
(
"Accept-Ranges"
)
);
}
@Test
...
...
spring-web/src/main/java/org/springframework/http/codec/ResourceHttpMessageWriter.java
浏览文件 @
578af59f
...
...
@@ -104,24 +104,30 @@ public class ResourceHttpMessageWriter extends AbstractServerHttpMessageWriter<R
public
Mono
<
Void
>
write
(
Publisher
<?
extends
Resource
>
inputStream
,
ResolvableType
streamType
,
ResolvableType
elementType
,
MediaType
mediaType
,
ServerHttpRequest
request
,
ServerHttpResponse
response
,
Map
<
String
,
Object
>
hints
)
{
Map
<
String
,
Object
>
mergedHints
=
new
HashMap
<>(
hints
);
mergedHints
.
putAll
(
resolveWriteHints
(
streamType
,
elementType
,
mediaType
,
request
));
if
(
mergedHints
.
containsKey
(
HTTP_RANGE_REQUEST_HINT
))
{
response
.
setStatusCode
(
HttpStatus
.
PARTIAL_CONTENT
);
List
<
HttpRange
>
httpRanges
=
(
List
<
HttpRange
>)
mergedHints
.
get
(
HTTP_RANGE_REQUEST_HINT
);
if
(
httpRanges
.
size
()
>
1
)
{
final
String
boundary
=
MimeTypeUtils
.
generateMultipartBoundaryString
();
mergedHints
.
put
(
ResourceRegionHttpMessageWriter
.
BOUNDARY_STRING_HINT
,
boundary
);
try
{
response
.
getHeaders
().
set
(
HttpHeaders
.
ACCEPT_RANGES
,
"bytes"
);
Map
<
String
,
Object
>
mergedHints
=
new
HashMap
<>(
hints
);
mergedHints
.
putAll
(
resolveWriteHints
(
streamType
,
elementType
,
mediaType
,
request
));
if
(
mergedHints
.
containsKey
(
HTTP_RANGE_REQUEST_HINT
))
{
response
.
setStatusCode
(
HttpStatus
.
PARTIAL_CONTENT
);
List
<
HttpRange
>
httpRanges
=
(
List
<
HttpRange
>)
mergedHints
.
get
(
HTTP_RANGE_REQUEST_HINT
);
if
(
httpRanges
.
size
()
>
1
)
{
final
String
boundary
=
MimeTypeUtils
.
generateMultipartBoundaryString
();
mergedHints
.
put
(
ResourceRegionHttpMessageWriter
.
BOUNDARY_STRING_HINT
,
boundary
);
}
Flux
<
ResourceRegion
>
regions
=
Flux
.
from
(
inputStream
)
.
flatMap
(
resource
->
Flux
.
fromIterable
(
HttpRange
.
toResourceRegions
(
httpRanges
,
resource
)));
return
this
.
resourceRegionHttpMessageWriter
.
write
(
regions
,
ResolvableType
.
forClass
(
ResourceRegion
.
class
),
mediaType
,
response
,
mergedHints
);
}
else
{
return
write
(
inputStream
,
elementType
,
mediaType
,
response
,
mergedHints
);
}
Flux
<
ResourceRegion
>
regions
=
Flux
.
from
(
inputStream
)
.
flatMap
(
resource
->
Flux
.
fromIterable
(
HttpRange
.
toResourceRegions
(
httpRanges
,
resource
)));
return
this
.
resourceRegionHttpMessageWriter
.
write
(
regions
,
ResolvableType
.
forClass
(
ResourceRegion
.
class
),
mediaType
,
response
,
mergedHints
);
}
else
{
return
write
(
inputStream
,
elementType
,
mediaType
,
response
,
mergedHints
);
catch
(
IllegalArgumentException
exc
)
{
response
.
setStatusCode
(
HttpStatus
.
REQUESTED_RANGE_NOT_SATISFIABLE
);
return
response
.
setComplete
();
}
}
...
...
spring-web/src/test/java/org/springframework/http/codec/ResourceHttpMessageWriterTests.java
浏览文件 @
578af59f
...
...
@@ -20,9 +20,7 @@ import java.nio.charset.StandardCharsets;
import
java.util.Collections
;
import
org.junit.Before
;
import
org.junit.Rule
;
import
org.junit.Test
;
import
org.junit.rules.ExpectedException
;
import
org.reactivestreams.Publisher
;
import
reactor.core.publisher.Flux
;
import
reactor.core.publisher.Mono
;
...
...
@@ -36,6 +34,7 @@ import org.springframework.core.io.buffer.DataBufferUtils;
import
org.springframework.core.io.buffer.support.DataBufferTestUtils
;
import
org.springframework.http.HttpHeaders
;
import
org.springframework.http.HttpRange
;
import
org.springframework.http.HttpStatus
;
import
org.springframework.http.MediaType
;
import
org.springframework.mock.http.server.reactive.test.MockServerHttpRequest
;
import
org.springframework.mock.http.server.reactive.test.MockServerHttpResponse
;
...
...
@@ -60,9 +59,6 @@ public class ResourceHttpMessageWriterTests {
private
Resource
resource
;
@Rule
public
ExpectedException
expectedException
=
ExpectedException
.
none
();
@Before
public
void
setUp
()
throws
Exception
{
...
...
@@ -84,6 +80,7 @@ public class ResourceHttpMessageWriterTests {
assertThat
(
this
.
response
.
getHeaders
().
getContentType
(),
is
(
MediaType
.
TEXT_PLAIN
));
assertThat
(
this
.
response
.
getHeaders
().
getContentLength
(),
is
(
39L
));
assertThat
(
this
.
response
.
getHeaders
().
getFirst
(
HttpHeaders
.
ACCEPT_RANGES
),
is
(
"bytes"
));
Mono
<
String
>
result
=
reduceToString
(
this
.
response
.
getBody
(),
this
.
response
.
bufferFactory
());
TestSubscriber
.
subscribe
(
result
).
assertComplete
().
assertValues
(
"Spring Framework test resource content."
);
...
...
@@ -98,6 +95,7 @@ public class ResourceHttpMessageWriterTests {
assertThat
(
this
.
response
.
getHeaders
().
getContentType
(),
is
(
MediaType
.
TEXT_PLAIN
));
assertThat
(
this
.
response
.
getHeaders
().
getFirst
(
HttpHeaders
.
CONTENT_RANGE
),
is
(
"bytes 0-5/39"
));
assertThat
(
this
.
response
.
getHeaders
().
getFirst
(
HttpHeaders
.
ACCEPT_RANGES
),
is
(
"bytes"
));
assertThat
(
this
.
response
.
getHeaders
().
getContentLength
(),
is
(
6L
));
Mono
<
String
>
result
=
reduceToString
(
this
.
response
.
getBody
(),
this
.
response
.
bufferFactory
());
...
...
@@ -105,12 +103,14 @@ public class ResourceHttpMessageWriterTests {
}
@Test
public
void
should
ThrowErrorInvalidRange
()
throws
Exception
{
public
void
should
SetRangeNotSatisfiableStatus
()
throws
Exception
{
this
.
request
.
getHeaders
().
set
(
HttpHeaders
.
RANGE
,
"invalid"
);
this
.
expectedException
.
expect
(
IllegalArgumentException
.
class
);
TestSubscriber
.
subscribe
(
this
.
writer
.
write
(
Mono
.
just
(
resource
),
null
,
ResolvableType
.
forClass
(
Resource
.
class
),
MediaType
.
TEXT_PLAIN
,
this
.
request
,
this
.
response
,
Collections
.
emptyMap
()));
assertThat
(
this
.
response
.
getHeaders
().
getFirst
(
HttpHeaders
.
ACCEPT_RANGES
),
is
(
"bytes"
));
assertThat
(
this
.
response
.
getStatusCode
(),
is
(
HttpStatus
.
REQUESTED_RANGE_NOT_SATISFIABLE
));
}
private
Mono
<
String
>
reduceToString
(
Publisher
<
DataBuffer
>
buffers
,
DataBufferFactory
bufferFactory
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录