Jetty charset UTF-8 против кодировки UTF-8 - PullRequest
0 голосов
/ 08 октября 2019

Я использую приложение Spring-Web с использованием jetty:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

Предположим, что эта конечная точка http:

@RestController
public class ExampleController {

  @GetMapping(value = "/example", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
  public ExampleResponse example() {
      return new ExampleResponse();
  }

  public static class ExampleResponse {
      private String dummy = "example";

      public String getDummy() {
          return dummy;
      }
  }
}

и свернитесь с конечной точкой и осмотрите заголовок curl -v localhost:8080/example:

* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET /example HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.58.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Tue, 08 Oct 2019 13:52:10 GMT
< Content-Type: application/json;charset=utf-8
< Transfer-Encoding: chunked
< 
* Connection #0 to host localhost left intact

Обратите внимание charset=**utf-8** в заголовке ответа, но я устанавливаю заголовок через аннотацию produces=MediaType.APPLICATION_JSON_UTF8_VALUE в значение application/json;charset=UTF-8. Таким образом, Jetty (с использованием tomcat все работает отлично) устанавливает нижний регистр кодировки в заголовке ответа.

Почему это проблема? Некоторые люди работают с моими конечными точками и проверяют это с помощью JSON Valiadtor (например: https://jsonformatter.curiousconcept.com/).

Этот валидатор ожидает набор символов в UPPERCASE. (См. https://stackoverflow.com/a/48466826/3046582). Так что я могу сделать сthis?

Обновление:

как @Kayaman говорит System.setProperty("org.eclipse.jetty.http.HttpGenerator.STRICT", "true"); перед запуском Spring-Application исправит это.

Я также нашел обходной путь: MimeTypes.CACHE.remove("application/json;charset=utf-8"); решит это.

1 Ответ

1 голос
/ 08 октября 2019

Тогда этот валидатор сломан. spec требует нечувствительности к регистру.

Обратите внимание, что имена наборов символов и языковые теги ограничены набором символов US-ASCII и сопоставляются без учета регистра (см. [RFC2978], Раздел 2.3 и [RFC5646], раздел 2.1.1).

И в примере W3 Org в качестве «типичного» заголовка используется Content-Type: text/html; charset=utf-8.

Но если вопрос в том, почему Jetty строчными это? Ну, я решил скрыться в источниках и нашел, где кодируется .

И оттуда, перейдя к HttpGenerator мы находим

Если системное свойство "org.eclipse.jetty.http.HttpGenerator.STRICT" установлено в значение true, то генератор будет строго передавать точные строки, полученные из методов и полей заголовка. В противном случае используется быстрый нечувствительный к регистру поиск строк, который может изменить регистр и пробелы некоторых методов / заголовков

...