package org.jooby.issues; import java.io.IOException; import java.io.InputStream; import org.jooby.test.ServerFeature; import org.junit.Test; import com.google.common.io.ByteStreams; public class Issue542c extends ServerFeature { { get("/download/video.mp4", (req, rsp) -> { rsp.download("video.mp4", "/assets/video.mp4"); }); } @Test public void shouldGetFullContent() throws Exception { request() .get("/download/video.mp4") .expect(200) .header("Content-Length", "383631"); } @Test public void shouldGetPartialContent() throws Exception { request() .get("/download/video.mp4") .header("Range", "bytes=0-99") .expect(206) .expect(bytes(0, 100)) .header("Accept-Ranges", "bytes") .header("Content-Range", "bytes 0-99/383631") .header("Content-Length", "100"); request() .get("/download/video.mp4") .header("Range", "bytes=100-199") .expect(206) .expect(bytes(100, 200)) .header("Accept-Ranges", "bytes") .header("Content-Range", "bytes 100-199/383631") .header("Content-Length", "100"); } @Test public void shouldGetPartialContentByPrefix() throws Exception { request() .get("/download/video.mp4") .header("Range", "bytes=0-") .expect(206) .expect(bytes(0, 383631)) .header("Accept-Ranges", "bytes") .header("Content-Range", "bytes 0-383630/383631") .header("Content-Length", "383631"); } @Test public void shouldGetPartialContentBySuffix() throws Exception { request() .get("/download/video.mp4") .header("Range", "bytes=-100") .expect(206) .expect(bytes(383631 - 100, 383631)) .header("Accept-Ranges", "bytes") .header("Content-Range", "bytes 383531-383630/383631") .header("Content-Length", "100"); } @Test public void shouldGet416() throws Exception { request() .get("/download/video.mp4") .header("Range", "bytes=200-100") .expect(416) .header("Content-Range", "bytes */383631"); } private byte[] bytes(final int offset, final int len) throws IOException { try (InputStream stream = getClass().getResourceAsStream("/assets/video.mp4")) { byte[] range = new byte[len - offset]; byte[] bytes = ByteStreams.toByteArray(stream); System.arraycopy(bytes, offset, range, 0, len - offset); return range; } } }