Информация об изменениях

Сообщение Re[6]: Как в Spring Boot включить Content-Length в ответ? от 06.05.2022 18:46

Изменено 06.05.2022 19:04 vsb

Re[6]: Как в Spring Boot включить Content-Length в ответ?
Это не совсем правильный ответ. Во-первых Spring работает не так. Если он может вычислить длину ответа, он его вычисляет и проставляет Content-Length. Например если контролер отдаёт строку, то спринг корректно вычислит Content-Length, хоть гигабайт отдавай. Если он не может вычислить, то он действительно просто пишет в ServletOutputStream. И при этом Jetty ничего не вычисляет ни при какой ситуации. Вот пример кода и как он работает:

@RestController
public class TestController {

    @JsonInclude(NON_NULL)
    public static class Test1Response {
        private String s;
    }

    @GetMapping("/test1")
    public ResponseEntity<?> getTest1() {
        return ResponseEntity.ok(new Test1Response());
    }

    @GetMapping("/test2")
    public String getTest2() {
        return Strings.repeat("1", 1024 * 1024 * 1024);
    }
}


% curl -v http://127.0.0.1:8080/test1
> GET /test1 HTTP/1.1
> Host: 127.0.0.1:8080
> User-Agent: curl/7.79.1
> Accept: */*
> 
< HTTP/1.1 200 
< Content-Type: application/json
< Transfer-Encoding: chunked
< Date: Fri, 06 May 2022 18:44:03 GMT
< 
{}                                                                                                 
% curl -v http://127.0.0.1:8080/test2 >/dev/null
> GET /test2 HTTP/1.1
> Host: 127.0.0.1:8080
> User-Agent: curl/7.79.1
> Accept: */*
> 
< HTTP/1.1 200 
< Content-Type: text/plain;charset=UTF-8
< Content-Length: 1073741824
< Date: Fri, 06 May 2022 18:44:16 GMT
<
Re[6]: Как в Spring Boot включить Content-Length в ответ?
Это не совсем правильный ответ. Во-первых Spring работает не так. Если он может вычислить длину ответа, он его вычисляет и проставляет Content-Length. Например если контролер отдаёт строку, то спринг корректно вычислит Content-Length, хоть гигабайт отдавай. Если он не может вычислить, то он действительно просто пишет в ServletOutputStream. И при этом Jetty ничего не вычисляет ни при какой ситуации. Вот пример кода и как он работает:

@RestController
public class TestController {

    @JsonInclude(NON_NULL)
    public static class Test1Response {
        private String s;
    }

    @GetMapping("/test1")
    public ResponseEntity<?> getTest1() {
        return ResponseEntity.ok(new Test1Response());
    }

    @GetMapping("/test2")
    public String getTest2() {
        return Strings.repeat("1", 1024 * 1024 * 1024);
    }
}


% curl -v http://127.0.0.1:8080/test1
> GET /test1 HTTP/1.1
> Host: 127.0.0.1:8080
> User-Agent: curl/7.79.1
> Accept: */*
> 
< HTTP/1.1 200 
< Content-Type: application/json
< Transfer-Encoding: chunked
< Date: Fri, 06 May 2022 18:44:03 GMT
< 
{}                                                                                                 
% curl -v http://127.0.0.1:8080/test2 >/dev/null
> GET /test2 HTTP/1.1
> Host: 127.0.0.1:8080
> User-Agent: curl/7.79.1
> Accept: */*
> 
< HTTP/1.1 200 
< Content-Type: text/plain;charset=UTF-8
< Content-Length: 1073741824
< Date: Fri, 06 May 2022 18:44:16 GMT
<


Конкретное место, которое в Spring отвечает за вычисление длины ответа это org.springframework.http.converter.AbstractHttpMessageConverter#getContentLength

У обработчика строкового типа этот метод реализован, у jackson — нет.