Erro de gateway inválido após a atualização do back-end do Jetty 8 para 9

3

Eu tenho um aplicativo Java que executa o Jetty 8 como um servidor HTTP embutido. Este é um serviço de back-end, executado na porta 20000. O código do meu serviço real não é relevante. Eu criei um projeto de exemplo no GitHub para demonstrar o problema: link

O código principal é exibido abaixo para referência. Depende de algumas bibliotecas:

 javax.servlet:javax.servlet-api:3.1.0
 commons-io:commons-io:2.5
 org.eclipse.jetty:jetty-server:9.4.6.v20170531 or 8.2.0.v20160908
 org.eclipse.jetty:jetty-servlet:9.4.6.v20170531 or 8.2.0.v20160908

BackendServer.java

package nl.knaw.dans.test;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;

public class BackendServer {
  public static void main(String[] args) throws Exception {
    Server server = new Server(20000);
    ServletContextHandler handler = new ServletContextHandler();
    handler.addServlet(AcceptAllServlet.class, "/acceptAll");
    handler.addServlet(ReadAllServlet.class, "/readAll");
    server.setHandler(handler);
    server.start();
    server.join();
 }
}

AcceptAllServlet

package nl.knaw.dans.test;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class AcceptAllServlet extends HttpServlet {

  @Override protected void doGet(HttpServletRequest req,    HttpServletResponse resp)
  throws ServletException, IOException {
    resp.getWriter().write("AcceptAll Servlet OK!");
    resp.setStatus(200);
  }

  @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp)
  throws ServletException, IOException {
    resp.setStatus(201);
  }
}

ReadAllServlet

package nl.knaw.dans.test;

import org.apache.commons.io.IOUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileOutputStream;
import java.io.IOException;

public class ReadAllServlet extends HttpServlet {
  @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp)
  throws ServletException, IOException {
    resp.getWriter().write("ReadAll Servlet OK!");
    resp.setStatus(200);
  }

  @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp)
  throws ServletException, IOException {

    FileOutputStream fos = new FileOutputStream("target/outfile");
    try {
      IOUtils.copy(req.getInputStream(), fos);
    }
    finally {
      fos.close();
    }

    resp.setStatus(201);
 }

}

O serviço é exposto ao mundo externo através de um Servidor HTTP Apache, que serve como proxy, usando a seguinte configuração:

<VirtualHost *:80>
  ProxyTimeout 600

  <Location / >
    ProxyPass http://localhost:20000/
    ProxyPassReverse http://localhost:20000/
  </Location>
</VirtualHost>

POST -ing arquivos para o serviço de back-end através do Apache funciona bem com o Jetty 8 com arquivos de qualquer tamanho. No entanto, no Jetty 9, estou recebendo um erro 502 Bad Gateway ao postar no AcceptAllServlet e o tamanho do arquivo excede cerca de 256K. Meu palpite é que isso tem algo a ver com o fato do Apache não ter terminado de gravar os dados no serviço de back-end. No entanto, se o servidor de back-end quiser responder 401 Unauthorized , não quero que ele primeiro leia todos os dados que serão rejeitados de qualquer maneira.

Alguma idéia de por que isso aparentemente mudou? Tenho configurado mal o Apache ou estou usando o Jetty incorretamente? Ou isso é um bug?

Obrigado por qualquer ajuda!

    
por Jan van Mansum 18.07.2017 / 14:32

0 respostas