2016-02-10 1 views
1

Я вижу, что мой Джерси + сервер причала реагирует на заголовок 100 continue, прежде чем запрос будет передан моему обработчику. Я не хочу отправлять 100-Continue и скорее отправлять ответ 3xx на основе URI/Заголовков запроса.100 Продолжайте с Jersey2 + с Jetty9 +

Это класс org.glassfish.jersey.servlet.WebComponent, который вызывает в request.getInputStream()

public Value<Integer> service(
     final URI baseUri, 
     final URI requestUri, 
     final HttpServletRequest servletRequest, 
     final HttpServletResponse servletResponse) throws ServletException, IOException { 

    ContainerRequest requestContext = new ContainerRequest(baseUri, requestUri, 
      servletRequest.getMethod(), getSecurityContext(servletRequest), new ServletPropertiesDelegate(servletRequest)); 
    requestContext.setEntityStream(servletRequest.getInputStream()); 
    addRequestHeaders(servletRequest, requestContext); 

и Jetty посылает 100 Продолжить заголовок, когда входной поток на запросе просят. От org.eclipse.jetty.server.Request

@Override 
public ServletInputStream getInputStream() throws IOException 
{ 
    if (_inputState != __NONE && _inputState != _STREAM) 
     throw new IllegalStateException("READER"); 
    _inputState = _STREAM; 

    if (_channel.isExpecting100Continue()) 
     _channel.continue100(_input.available()); 

    return _input; 
} 

он вызовов в HttpChannel, чтобы отправить 100 Продолжить Header

/** 
* If the associated response has the Expect header set to 100 Continue, 
* then accessing the input stream indicates that the handler/servlet 
* is ready for the request body and thus a 100 Continue response is sent. 
* 
* @throws IOException if the InputStream cannot be created 
*/ 
public void continue100(int available) throws IOException 
{ 
    // If the client is expecting 100 CONTINUE, then send it now. 
    // TODO: consider using an AtomicBoolean ? 
    if (isExpecting100Continue()) 
    { 
     _expect100Continue = false; 

     // is content missing? 
     if (available == 0) 
     { 
      if (_response.isCommitted()) 
       throw new IOException("Committed before 100 Continues"); 

      // TODO: break this dependency with HttpGenerator 
      boolean committed = sendResponse(HttpGenerator.CONTINUE_100_INFO, null, false); 
      if (!committed) 
       throw new IOException("Concurrent commit while trying to send 100-Continue"); 
     } 
    } 
} 

Как предотвратить джерси + причалом от отправки обратно 100 продолжаться до запрос достигает меток пути URI с мечеными мечами?

ответ

2

С Expect: 100-Continue обработкой ..

Если вы хотите ответить, что часть запроса, то:

  • Не пытайтесь доступом к параметрам запроса (это необходимо для чтения входного потока в обрабатывать все возможные источники параметров)
  • Не пытайтесь получить доступ к потоку ввода запроса (это означает, что вы принимаете 100-Continue Ожидание и готовы принять фактическое содержимое тела запроса)
  • Не пытайтесь получить доступ к считывателю запросов (это также открывает входной поток запроса)
  • Не пытайтесь использовать уровень асинхронного ввода-вывода сервлета (это открывает входной поток ввода запроса и ответ)
  • Использовать HttpServletResponse для отправки вашего альтернативного кода состояния и/или тела ответа.

Это все стандартное поведение Servlet/Jetty.

+0

Согласен. Но это не отвечает на мой вопрос. Я понимаю, что это требования на уровне Jetty. Но так как метод getInputStream() вызывается Джерси до того, как код попадает в любой из моих кодов, означает ли это, что комбинация Jersey + Jetty неправильно реализует 100? –

+0

Перечитайте вопрос. Наверное, я ответил только на половину вопроса, со стороны Jetty. Проблема заключается не в стороне Jetty, а в предположении Джерси, что ей не нужно иметь дело с альтернативной обработкой ожиданий «100-Continue». –

+0

Вопрос только для использования Jetty + Jersey. Я понимаю, что Jetty работает сам по себе, а поддержка 100 Continue правильно реализована. Однако при использовании Jetty в качестве контейнера с Джерси он сломан. Вопрос состоял в том, чтобы сделать jersey + jetty combo для использования 100 продолжить успешно, на который здесь не ответил –

Смежные вопросы