Проблема в создании Частичного Контента (206) в качестве вывода для фрагментированной загрузки zip-файла с использованием остальных веб-сервисов - PullRequest
0 голосов
/ 24 сентября 2018

Я написал веб-сервис rest для создания 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 Server и IAM не используют встроенный Tomcat и Jetty Server, где исключения сделаны в pom.xml. Это связано с различными проектными причинами.

Есть ли какие-либо дополнения / изменения конфигурации, которые мне нужно сделать на внешнемДжетти сервер?

Код как показано ниже

@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 Ответ

0 голосов
/ 24 сентября 2018

Сервер Jetty не должен обрабатывать запросы в динамическом контенте (ваша служба REST).

Единственная поддержка запросов в диапазоне, предоставляемая Jetty, это ...

  • Диапазоны входящего запроса с перекрывающимися диапазонами объединяются в разумные диапазоны перед отправкой в ​​контекст.
  • Недопустимые диапазоны запроса (например, отрицательные значения) приводят к BadMessageException и ответу 400 пользовательскому агенту.
  • Статическое содержимое, обслуживаемое через DefaultServlet, поддерживает ранжированные запросы.

Ваша динамическая конечная точка (ваш API покоя) может считывать запрошенные диапазоны и определять, поддерживается ли обслуживание этих конкретных диапазонов,и затем либо обслуживая его, либо отклоняя диапазоны, либо обслуживая весь контент.

Если вам кажется, что Jetty должна это поддерживать, не стесняйтесь подать запрос на улучшение на https://github.com/eclipse/jetty.project/issues

...