Сохраняйте пробел после точки с запятой в ответе заголовка Content-type с помощью tomcat

У нас есть старый клиент, использующий сервлет, развернутый на tomcat 8.5. Этот устаревший клиент ожидает ответа заголовка типа контента в этом формате (обратите внимание на пробел между точкой с запятой и «набором символов»):

Content-type: text/xml; charset=utf-8

Однако на стороне сервера Tomcat всегда обрезает эти пробелы, хотя мы принудительно делаем это в сервлете:

response.setContentType("text/xml; charset=utf-8");

Или даже в фильтре с пользовательским расширением HttpServletResponseWrapper, как предлагается в этот вопрос.

Что бы я ни пытался, заголовок типа содержимого всегда возвращается без пробела.

Content-type: text/xml;charset=utf-8

В качестве справки я нашел это в официальной документации tomcat. :

Tomcat удаляет пустые символы между ';' и ключевое слово 'charset'

Я знаю, что стандарт http говорит, что пробел после точки с запятой является необязательным, как упоминалось в этом другом SO post, но поскольку клиент с проблемой запускает устаревшую версию, мне интересно, есть ли способ заставить tomcat сохранить этот пробел.

Я думаю о других вариантах, таких как изменение заголовка типа контента в apache или nginx (выше tomcat), но, если это возможно, я бы предпочел решение на уровне tomcat.

Любая помощь будет оценена по достоинству.


person troig    schedule 21.03.2018    source источник
comment
Похоже на исходный код для этого часть tomcat указывает, что нет возможности отключить его   -  person Zachary Craig    schedule 21.03.2018
comment
Привет @zack6849! Спасибо за комментарий. Я вижу это, но поскольку методы получения и установки для contentType являются общедоступными, мне интересно, есть ли какой-либо обходной путь, чтобы переопределить их или что-то в этом роде. Спасибо, в любом случае.   -  person troig    schedule 21.03.2018
comment
Если ваш устаревший клиент разрешал специальные символы, такие как кавычки, вы могли бы сломать жестко запрограммированную обрезку, но, судя по тому, что вы говорите, ваш клиент этого не допускает. В RFC 2616 говорится, что LWS в значениях заголовков можно заменить одним ПРОБЕЛом, но не говорится, что ПРОБЕЛ в значениях заголовков может быть удален. Старый клиент виновен только наполовину.   -  person Eugène Adell    schedule 21.03.2018
comment
Спасибо @EugèneAdell. Что вы имеете в виду, когда говорите «сломать жестко запрограммированную отделку»? Честно говоря, я не уверен, разрешает ли устаревший клиент кавычки или нет, поэтому, возможно, мне стоит попробовать ваше предложение.   -  person troig    schedule 22.03.2018
comment
@ zack6849 показал код Tomcat, где функция обрезки удаляет это необходимое пространство. Я проголосовал за его комментарий за это. Если бы вместо SPACE_charset=.. у вас был SPACE_charset=... или 'SPACE_charset=...', функция обрезки ничего не делала бы, потому что значение больше не начиналось бы с пробелов.   -  person Eugène Adell    schedule 22.03.2018


Ответы (1)


Как написано в комментариях, этого мы не можем избежать, так как это жестко закодировано в tomcat .java#L548" rel="nofollow noreferrer">исходный код

В нашем конкретном случае мы, наконец, смогли немного изменить legacy-client, так что теперь он может обрабатывать заголовок типа контента в стандартном формате (без пробела).

Спасибо @ zack6849 за указание на это.

person troig    schedule 27.04.2018