|
18 | 18 | import java.io.InputStream; |
19 | 19 | import java.io.OutputStream; |
20 | 20 | import java.net.InetSocketAddress; |
21 | | -import java.util.Arrays; |
22 | 21 | import java.util.concurrent.ExecutorService; |
23 | 22 | import java.util.concurrent.Executors; |
24 | 23 |
|
@@ -51,35 +50,40 @@ void close() { |
51 | 50 | private void handle(HttpExchange exchange) throws IOException { |
52 | 51 | String fileName = exchange.getRequestURI().getPath().substring(1); |
53 | 52 | String range = exchange.getRequestHeaders().getFirst("Range"); |
54 | | - logger.info("Request: {} range={}", fileName, range); |
55 | | - byte[] bytes; |
| 53 | + Integer rangeFrom = null; |
| 54 | + Integer rangeTo = null; |
| 55 | + if (range != null) { |
| 56 | + assert range.startsWith("bytes="); |
| 57 | + assert range.contains("-"); |
| 58 | + rangeFrom = Integer.parseInt(range.substring("bytes=".length(), range.indexOf('-'))); |
| 59 | + rangeTo = Integer.parseInt(range.substring(range.indexOf('-') + 1)) + 1; |
| 60 | + } |
| 61 | + logger.info("Request: {} range=[{},{})", fileName, rangeFrom, rangeTo); |
56 | 62 | ClassLoader classloader = Thread.currentThread().getContextClassLoader(); |
57 | 63 | try (InputStream is = classloader.getResourceAsStream(fileName)) { |
58 | | - bytes = is == null ? null : is.readAllBytes(); |
59 | | - } |
60 | | - if (bytes == null) { |
61 | | - logger.info("Response: {} 404", fileName); |
62 | | - exchange.sendResponseHeaders(HttpStatus.SC_NOT_FOUND, 0); |
63 | | - } else { |
64 | | - Integer rangeFrom = null; |
65 | | - Integer rangeTo = null; |
66 | | - if (range != null) { |
67 | | - assert range.startsWith("bytes="); |
68 | | - assert range.contains("-"); |
69 | | - rangeFrom = Integer.parseInt(range.substring("bytes=".length(), range.indexOf('-'))); |
70 | | - rangeTo = Integer.parseInt(range.substring(range.indexOf('-') + 1)) + 1; |
71 | | - } |
72 | | - int httpStatus; |
73 | | - if (range == null) { |
74 | | - httpStatus = HttpStatus.SC_OK; |
| 64 | + if (is == null) { |
| 65 | + logger.info("Response: {} 404", fileName); |
| 66 | + exchange.sendResponseHeaders(HttpStatus.SC_NOT_FOUND, 0); |
75 | 67 | } else { |
76 | | - httpStatus = HttpStatus.SC_PARTIAL_CONTENT; |
77 | | - bytes = Arrays.copyOfRange(bytes, rangeFrom, rangeTo); |
78 | | - } |
79 | | - logger.info("Response: {} {}", fileName, httpStatus); |
80 | | - exchange.sendResponseHeaders(httpStatus, bytes.length); |
81 | | - try (OutputStream os = exchange.getResponseBody()) { |
82 | | - os.write(bytes); |
| 68 | + try (OutputStream os = exchange.getResponseBody()) { |
| 69 | + int httpStatus; |
| 70 | + int numBytes; |
| 71 | + if (range == null) { |
| 72 | + httpStatus = HttpStatus.SC_OK; |
| 73 | + numBytes = is.available(); |
| 74 | + } else { |
| 75 | + httpStatus = HttpStatus.SC_PARTIAL_CONTENT; |
| 76 | + is.skipNBytes(rangeFrom); |
| 77 | + numBytes = rangeTo - rangeFrom; |
| 78 | + } |
| 79 | + logger.info("Response: {} {}", fileName, httpStatus); |
| 80 | + exchange.sendResponseHeaders(httpStatus, numBytes); |
| 81 | + while (numBytes > 0) { |
| 82 | + byte[] bytes = is.readNBytes(Math.min(1<<20, numBytes)); |
| 83 | + os.write(bytes); |
| 84 | + numBytes -= bytes.length; |
| 85 | + } |
| 86 | + } |
83 | 87 | } |
84 | 88 | } |
85 | 89 | } |
|
0 commit comments