@Override public void afterPropertiesSet() throws Exception { resolveResourceLocations(); if (logger.isWarnEnabled() && CollectionUtils.isEmpty(this.locations)) { logger.warn("Locations list is empty. No resources will be served unless a " + "custom ResourceResolver is configured as an alternative to PathResourceResolver."); } if (this.resourceResolvers.isEmpty()) { this.resourceResolvers.add(new PathResourceResolver()); } initAllowedLocations(); // Initialize immutable resolver and transformer chains this.resolverChain = new DefaultResourceResolverChain(this.resourceResolvers); this.transformerChain = new DefaultResourceTransformerChain(this.resolverChain, this.resourceTransformers); if (this.resourceHttpMessageConverter == null) { this.resourceHttpMessageConverter = new ResourceHttpMessageConverter(); } if (this.resourceRegionHttpMessageConverter == null) { this.resourceRegionHttpMessageConverter = new ResourceRegionHttpMessageConverter(); } this.contentNegotiationStrategy = initContentNegotiationStrategy(); }
@Override public boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType) { return canWrite(clazz, null, mediaType); }
try { println(out); print(out, "--" + boundaryString); println(out); if (contentType != null) { print(out, "Content-Type: " + contentType.toString()); println(out); print(out, "Content-Range: bytes " + start + '-' + end + '/' + resourceLength); println(out); println(out); println(out); print(out, "--" + boundaryString + "--");
@Override @SuppressWarnings("unchecked") protected void writeInternal(Object object, @Nullable Type type, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { if (object instanceof ResourceRegion) { writeResourceRegion((ResourceRegion) object, outputMessage); } else { Collection<ResourceRegion> regions = (Collection<ResourceRegion>) object; if (regions.size() == 1) { writeResourceRegion(regions.iterator().next(), outputMessage); } else { writeResourceRegionCollection((Collection<ResourceRegion>) object, outputMessage); } } }
List<HttpRange> httpRanges = inputMessage.getHeaders().getRange(); response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT); this.resourceRegionHttpMessageConverter.write( HttpRange.toResourceRegions(httpRanges, resource), mediaType, outputMessage);
@Override @SuppressWarnings("unchecked") protected void writeInternal(Object object, @Nullable Type type, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { if (object instanceof ResourceRegion) { writeResourceRegion((ResourceRegion) object, outputMessage); } else { Collection<ResourceRegion> regions = (Collection<ResourceRegion>) object; if (regions.size() == 1) { writeResourceRegion(regions.iterator().next(), outputMessage); } else { writeResourceRegionCollection((Collection<ResourceRegion>) object, outputMessage); } } }
@Test public void shouldWritePartialContentByteRange() throws Exception { MockHttpOutputMessage outputMessage = new MockHttpOutputMessage(); Resource body = new ClassPathResource("byterangeresource.txt", getClass()); ResourceRegion region = HttpRange.createByteRange(0, 5).toResourceRegion(body); converter.write(region, MediaType.TEXT_PLAIN, outputMessage); HttpHeaders headers = outputMessage.getHeaders(); assertThat(headers.getContentType(), is(MediaType.TEXT_PLAIN)); assertThat(headers.getContentLength(), is(6L)); assertThat(headers.get(HttpHeaders.CONTENT_RANGE).size(), is(1)); assertThat(headers.get(HttpHeaders.CONTENT_RANGE).get(0), is("bytes 0-5/39")); assertThat(outputMessage.getBodyAsString(StandardCharsets.UTF_8), is("Spring")); }
@Override public void afterPropertiesSet() throws Exception { resolveResourceLocations(); if (logger.isWarnEnabled() && CollectionUtils.isEmpty(this.locations)) { logger.warn("Locations list is empty. No resources will be served unless a " + "custom ResourceResolver is configured as an alternative to PathResourceResolver."); } if (this.resourceResolvers.isEmpty()) { this.resourceResolvers.add(new PathResourceResolver()); } initAllowedLocations(); // Initialize immutable resolver and transformer chains this.resolverChain = new DefaultResourceResolverChain(this.resourceResolvers); this.transformerChain = new DefaultResourceTransformerChain(this.resolverChain, this.resourceTransformers); if (this.resourceHttpMessageConverter == null) { this.resourceHttpMessageConverter = new ResourceHttpMessageConverter(); } if (this.resourceRegionHttpMessageConverter == null) { this.resourceRegionHttpMessageConverter = new ResourceRegionHttpMessageConverter(); } this.contentNegotiationStrategy = initContentNegotiationStrategy(); }
@Override @SuppressWarnings("unchecked") protected void writeInternal(Object object, @Nullable Type type, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { if (object instanceof ResourceRegion) { writeResourceRegion((ResourceRegion) object, outputMessage); } else { Collection<ResourceRegion> regions = (Collection<ResourceRegion>) object; if (regions.size() == 1) { writeResourceRegion(regions.iterator().next(), outputMessage); } else { writeResourceRegionCollection((Collection<ResourceRegion>) object, outputMessage); } } }
try { println(out); print(out, "--" + boundaryString); println(out); if (contentType != null) { print(out, "Content-Type: " + contentType.toString()); println(out); print(out, "Content-Range: bytes " + start + '-' + end + '/' + resourceLength); println(out); println(out); println(out); print(out, "--" + boundaryString + "--");
@Test public void shouldWritePartialContentByteRangeNoEnd() throws Exception { MockHttpOutputMessage outputMessage = new MockHttpOutputMessage(); Resource body = new ClassPathResource("byterangeresource.txt", getClass()); ResourceRegion region = HttpRange.createByteRange(7).toResourceRegion(body); converter.write(region, MediaType.TEXT_PLAIN, outputMessage); HttpHeaders headers = outputMessage.getHeaders(); assertThat(headers.getContentType(), is(MediaType.TEXT_PLAIN)); assertThat(headers.getContentLength(), is(32L)); assertThat(headers.get(HttpHeaders.CONTENT_RANGE).size(), is(1)); assertThat(headers.get(HttpHeaders.CONTENT_RANGE).get(0), is("bytes 7-38/39")); assertThat(outputMessage.getBodyAsString(StandardCharsets.UTF_8), is("Framework test resource content.")); }
@Override public boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType) { return canWrite(clazz, null, mediaType); }
messageConverters.add(stringHttpMessageConverter); messageConverters.add(new ResourceHttpMessageConverter()); messageConverters.add(new ResourceRegionHttpMessageConverter()); try { messageConverters.add(new SourceHttpMessageConverter<>());
@Override @SuppressWarnings("unchecked") protected void writeInternal(Object object, @Nullable Type type, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { if (object instanceof ResourceRegion) { writeResourceRegion((ResourceRegion) object, outputMessage); } else { Collection<ResourceRegion> regions = (Collection<ResourceRegion>) object; if (regions.size() == 1) { writeResourceRegion(regions.iterator().next(), outputMessage); } else { writeResourceRegionCollection((Collection<ResourceRegion>) object, outputMessage); } } }
try { println(out); print(out, "--" + boundaryString); println(out); if (contentType != null) { print(out, "Content-Type: " + contentType.toString()); println(out); print(out, "Content-Range: bytes " + start + '-' + end + '/' + resourceLength); println(out); println(out); println(out); print(out, "--" + boundaryString + "--");
List<HttpRange> httpRanges = inputMessage.getHeaders().getRange(); response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT); this.resourceRegionHttpMessageConverter.write( HttpRange.toResourceRegions(httpRanges, resource), mediaType, outputMessage);
messageConverters.add(stringHttpMessageConverter); messageConverters.add(new ResourceHttpMessageConverter()); messageConverters.add(new ResourceRegionHttpMessageConverter()); try { messageConverters.add(new SourceHttpMessageConverter<>());
try { println(out); print(out, "--" + boundaryString); println(out); if (contentType != null) { print(out, "Content-Type: " + contentType.toString()); println(out); print(out, "Content-Range: bytes " + start + '-' + end + '/' + resourceLength); println(out); println(out); println(out); print(out, "--" + boundaryString + "--");
converter.write(regions, MediaType.TEXT_PLAIN, outputMessage);