Проблема в создании Частичного Контента (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

Другие вопросы по тегам