Почему Джерси глотает мой заголовок «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 постоянные пулы но я не нашел варианта конфигурации.

Ответы на вопрос(1)

Ваш ответ на вопрос