Почему Джерси глотает мой заголовок «Content-Encoding»
Почему следующий пример проглатывает мой HTTP-заголовок для "Content-Encoding» в запросе. Я пишу приложение, где мне нужно декодировать пользовательский формат кодирования. Тем не менее, я никогда не могу заполучить "Content-Encoding» Заголовок из запроса. Ни в реальном ресурсе, ни в ReaderInterceptor. В ответе этот заголовок кодирования не проглатывается.
Это поведение можно легко наблюдать в следующем (работающем) примере:
public class Demo extends JerseyTest {
@Override
protected Application configure() {
enable(TestProperties.DUMP_ENTITY);
enable(TestProperties.LOG_TRAFFIC);
return new ResourceConfig(MyResource.class, MyInterceptor.class);
}
public static final String PATH = "path";
public static final String ENCODING = "my-encoding";
public static final String CUSTOM_HEADER = "X-Content-Encoding";
public static final String QUESTION = "question", ANSWER = "answer";
@Path(PATH)
public static class MyResource {
@POST
public Response handle(String value, @Context HttpHeaders httpHeaders) {
assertEquals(ENCODING, httpHeaders.getHeaderString(CUSTOM_HEADER));
// Here, the "Content-Encoding" header mysteriously disappeared.
assertEquals(ENCODING, httpHeaders.getHeaderString(HttpHeaders.CONTENT_ENCODING));
return Response
.ok(ANSWER)
.header(CUSTOM_HEADER, ENCODING)
.header(HttpHeaders.CONTENT_ENCODING, ENCODING)
.build();
}
}
public static class MyInterceptor implements ReaderInterceptor, WriterInterceptor {
@Override
public Object aroundReadFrom(ReaderInterceptorContext context)
throws IOException, WebApplicationException {
assertEquals(ENCODING, context.getHeaders().getFirst(CUSTOM_HEADER));
// Here, the "Content-Encoding" header mysteriously disappeared.
assertEquals(ENCODING, context.getHeaders().getFirst(HttpHeaders.CONTENT_ENCODING));
return context.proceed();
}
@Override
public void aroundWriteTo(WriterInterceptorContext context)
throws IOException, WebApplicationException {
assertEquals(ENCODING, context.getHeaders().getFirst(CUSTOM_HEADER));
// Here, the "Content-Encoding" header can be found.
assertEquals(ENCODING, context.getHeaders().getFirst(HttpHeaders.CONTENT_ENCODING));
context.proceed();
}
}
@Test
public void test() throws Exception {
Response response = target(PATH)
.request()
.header(CUSTOM_HEADER, ENCODING)
.header(HttpHeaders.CONTENT_ENCODING, ENCODING)
.post(Entity.text(QUESTION));
assertEquals(200, response.getStatus());
assertEquals(ENCODING, response.getHeaders().getFirst(CUSTOM_HEADER));
// Here, the "Content-Encoding" header can be found.
assertEquals(ENCODING, response.getHeaders().getFirst(HttpHeaders.CONTENT_ENCODING));
}
}
Есть ли некоторыемагия что происходит за кулисами, когда Джерси пытается исправить мою кодировку контента? (Чего он не может, так как это кодировка с закрытым исходным кодом, которую я на самом деле должен решить, запросив другое приложение на другом сервере в сети.) Я даже не могу обнаружить "Content-Encoding» заголовок в дампе запроса, поэтому я подозреваю, что Джерси вообще не отправляет заголовок.
Я мог бы, конечно, использовать некоторыеX-Content-Encoding» заголовок, это работает, как показано в примере. Но это решение просто глупо. Я уже искал различные,CommonProperties
ServerProperties
ClientProperties
постоянные пулы но я не нашел варианта конфигурации.