Проблема в создании Частичного Контента (206) в качестве вывода для фрагментированной загрузки zip-файла с использованием остальных веб-сервисов
Я написал остальной веб-сервис для создания zip-файла кусками, используя тип mime application_octet_stream
с помощью весенней загрузки (2.0.5.RELEASE), но я не могу получить partial_content(206)
как вывод, когда я определяю диапазон, используя команду curl, как показано ниже, но я получаю 200(ОК) в качестве ответа, т.е. я не могу получить файл в терминах кусков.
curl http://localhost:8080/resource/getlist -i -H "Range: bytes=0-100"
PS: Приложение весенней загрузки развернуто на внешнем сервере Jetty, и я не использую встроенный сервер Tomcat и Jetty, где исключения выполняются в pom.xml. Это связано с различными проектными причинами.
Есть ли какие-либо дополнения / изменения конфигурации, которые мне нужно сделать на внешнем сервере Jetty?
Код как ниже
@RestController
@RequestMapping("/resource")
public class ListResource {
/* Logger **/
private static final Logger _LOG = LoggerFactory.getLogger(ListResource.class);
@Autowired
private AppContext appContext;
private static final String DATE_FORMAT_FOR_ETAG = "yyyy-MM-dd HH:mm:ss'Z'";
private static final DateFormat eTagDateFormat = new SimpleDateFormat(DATE_FORMAT_FOR_ETAG, Locale.US);
private static final String ACCEPT_RANGES_BYTES = "bytes";
@RequestMapping(path = "/getlist", method = RequestMethod.HEAD)
public ResponseEntity<?> fetchListHead() throws IOException {
return fetchList(true);
}
@RequestMapping(path = "/getlist", method = RequestMethod.GET,produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
public ResponseEntity<?> fetchListGet() throws IOException {
return fetchList(false);
}
private ResponseEntity<?> fetchList(final boolean justHead) throws IOException {
File file = null;
try {
file = new File("/home/resource/hello.zip");
byte[] readBytes = Files.readAllBytes(file.toPath());
ByteArrayResource resource = new ByteArrayResource(readBytes);
ResponseEntity.BodyBuilder responseBuilder = ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getName() + "\"")
.header(HttpHeaders.ACCEPT_RANGES, ACCEPT_RANGES_BYTES)
.lastModified(new Date().getTime())
.eTag(getETag(file))
.cacheControl(CacheControl.maxAge(3600, TimeUnit.SECONDS).cachePublic().mustRevalidate())
.contentLength(file.length())
.contentType(MediaType.parseMediaType(MediaType.APPLICATION_OCTET_STREAM_VALUE));
return justHead ? responseBuilder.build() : responseBuilder.body(resource);
} catch (Exception e) {
_LOG.error("Error in gettingResource:{}", e.getMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
}
private String getETag(File file) {
String tag = "";
if (file != null) {
tag = eTagDateFormat.format(new Date(file.getAbsoluteFile().lastModified()));
}
return tag;
}
}
1 ответ
Это не роль сервера Jetty для обработки удаленных запросов к динамическому контенту (службе REST).
Единственная поддерживаемая поддержка запросов, которую обеспечивает Jetty, это...
- Диапазоны входящего запроса с перекрывающимися диапазонами объединяются в разумные диапазоны перед отправкой в контекст.
- Недопустимые диапазоны запросов (например, отрицательные значения) приводят к ошибке BadMessageException и 400 к пользовательскому агенту.
- Статический контент подается через
DefaultServlet
поддерживает дальние запросы.
Ваша динамическая конечная точка (ваш API покоя) может считывать запрошенные диапазоны и определять, поддерживается ли обслуживание этих конкретных диапазонов, а затем либо обслуживать его, либо отклонять диапазоны, либо обслуживать весь контент.
Если вам кажется, что Jetty должна это поддержать, не стесняйтесь подать запрос на улучшение по адресу https://github.com/eclipse/jetty.project/issues