Spring WebFlux: потоковая необработанная строка ответа HTTP с заголовками для HTTP-ответа смешанной замены - PullRequest
0 голосов
/ 04 февраля 2019

Используя Spring WebFlux, я хотел бы вернуть HTTP-ответ Mixed-Replace, который выглядит примерно так:

HTTP/1.1 200 Ok
Content-Type: multipart/x-mixed-replace; boundary=--icecream

--icecream
Content-Type: image/jpeg
Content-Length: [length]

[data]

--icecream
Content-Type: image/jpeg
Content-Length: [length]

[data]

, где данные передаются из Flux (думаю, Flux.interval(1000).map(fetchImageFrame)), но я не могу найтиспособ потоковой передачи необработанных данных ответов HTTP, большинство примеров дает мне доступ только к телу HTTP, но не ко всему ответу, где я могу контролировать заголовки HTTP.

1 Ответ

0 голосов
/ 13 февраля 2019

Вы пытались обернуть ваш Flux ответ в ResponseEntity и установить требуемые заголовки для ResponseEntity?

Что-то вроде:

@GetMapping(value = "/stream")
ResponseEntity<Flux<byte[]>> streamObjects() {
    Flux<byte[]> flux = Flux.fromStream(fetchImageFrame()).delayElements(Duration.ofSeconds(5));
    HttpHeaders headers = HttpHeaders.writableHttpHeaders(HttpHeaders.EMPTY);
    headers.add("Content-Type", "multipart/x-mixed-replace; boundary=--icecream");
    return new ResponseEntity<>(flux, headers, HttpStatus.OK);
}

private Stream<byte[]> fetchImageFrame() {
    return List.of(
            load("image1.jpg"),
            load("image2.jpg"),
            load("image3.jpg"),
            load("image4.jpg")
    ).stream();
}

private byte[] load(String name) {
    try {
        byte[] raw = Files.readAllBytes(Paths.get(name));
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        String headers =
                "--icecream\r\n" +
                "Content-Type: image/jpeg\r\n" +
                "Content-Length: " + raw.length + "\r\n\r\n";
        bos.write(headers.getBytes());
        bos.write(raw);
        return bos.toByteArray();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}
...