Grizzly 2.2.19 FilterChain против HttpHandler

Я пытаюсь реализовать простой веб-сервер Grizzly, который при получении HTTP-запроса будет:

  • Обработать указанные фильтры
  • Повторить запрос обратно отправителю

Я отправляю запрос из soapUI и вижу поведение, которого не ожидаю:

RunServer.java:

public class RunServer{
    public static final String HOST = "localhost";
    public static final int PORT = 5151;

    public static void main(String[] args) {
        final HttpServer server = HttpServer.createSimpleServer();

        NetworkListener listener = new NetworkListener("echoCalls", "localhost", 5151);

        FilterChainBuilder filterChainBuilder = FilterChainBuilder.stateless();

        filterChainBuilder.add(new TransportFilter());

        filterChainBuilder.add(new StringFilter(Charset.forName("UTF-8")));
        //filterChainBuilder.add(new StringFilter(Charset.forName("ISO-8859-1")));
        //filterChainBuilder.add(new StringFilter(Charset.forName("ASCII")));

        filterChainBuilder.add(new MyEchoFilter());

        listener.setFilterChain(filterChainBuilder.build());

        server.addListener(listener);

        server.getServerConfiguration().addHttpHandler(new MyEchoHandler(), "/echo");

        try{
            server.start();
            System.out.println("Press any key to stop the server...");
            System.in.read();
        }catch(IOException ioe){
            System.err.println(ioe.toString());
        }finally{
            server.stop();
        }

    }

}

MyEchoFilter.java:

public class MyEchoFilter extends BaseFilter{

    public NextAction handleRead(FilterChainContext ctx)throws IOException{

        System.err.println(">>>MyEchoFilter.handleRead()...");

        //|why not working? no response, eventual time out. soapui just hangs up after return NextAction...

        final Object peerAddress = ctx.getAddress();
        final Object message = ctx.getMessage();
        ctx.write(peerAddress, message, null);

        return ctx.getStopAction();
    }

    public NextAction handleWrite(FilterChainContext ctx) throws IOException{
        System.err.println(">>>MyEchoFilter.handleWrite()...");

        return ctx.getStopAction();
    }

    public NextAction handleConnect(FilterChainContext ctx) throws IOException{
        System.err.println(">>>MyEchoFilter.handleConnect()...");

        return ctx.getStopAction();
    }

    public NextAction handleAccept(FilterChainContext ctx) throws IOException{
        System.err.println(">>>MyEchoFilter.handleAccept()...");

        return ctx.getStopAction();
    }

    public NextAction handleClose(FilterChainContext ctx) throws IOException{
        System.err.println(">>>MyEchoFilter.handleClose()...");

        return ctx.getStopAction();
    }

}

МойЭхоХандлер:

public class MyEchoHandler extends HttpHandler{

    public void service(Request req, Response res) throws Exception{

        System.err.println(">>>handler service method...");

        BufferedReader requestStream = new BufferedReader(new InputStreamReader(req.getInputStream()));

        String reqStrLn;
        StringBuffer callContent = new StringBuffer();
        while((reqStrLn = requestStream.readLine()) != null) callContent.append(reqStrLn);

        res.setContentLength(callContent.length());
        res.getWriter().write(callContent.toString());
    }
}

В приведенном выше коде метод handleAccept() запускается при инициировании запроса soapUI. Как ни странно, метод handleRead() не срабатывает, пока я не закомментирую строковый фильтр UTF-8 в RunServer:

//filterChainBuilder.add(new StringFilter(Charset.forName("UTF-8")));

Я не могу понять это, если кто-нибудь может объяснить, я был бы признателен.

Но, что более важно, метод service() в MyEchoHandler также не срабатывает.

Это срабатывает, только если я закомментирую строку, которая устанавливает FilterChain в NetworkListener, в RunServer:

//listener.setFilterChain(filterChainBuilder.build());

Когда я делаю избегаю использования FilterChain, я действительно получаю ответ на soapUI, но мне действительно нужен FilterChain.

Может показаться, что я упускаю здесь часть смысла, что я должен избегать обработчиков вообще, в пользу использования фильтров, но я не смог получить ответ на soapUI при использовании фильтров.

Может ли кто-нибудь помочь мне определить ошибку моего пути?

Заранее спасибо!


person Chad Baker    schedule 07.01.2014    source источник
comment
Можете ли вы объяснить, почему вы считаете, что вам нужен пользовательский FilterChain? Я хотел бы лучше понять, чего вы пытаетесь достичь, прежде чем продолжить.   -  person rlubke    schedule 07.01.2014
comment
Мне нужна цепочка фильтров, чтобы добавить поддержку фрагментированного кодирования.   -  person Chad Baker    schedule 10.01.2014


Ответы (2)


Поскольку я столкнулся с этой проблемой, и мне действительно потребовалось довольно много времени, чтобы понять.

filterChainBuilder.add(new StringFilter(Charset.forName("UTF-8")));

StringFilter декодирует/кодирует строки как байты и поэтому использует специальный префикс длины. Если входящие сообщения не могут быть декодированы, они пропускаются. Поэтому похоже, что метод handleRead не срабатывает.

person sanados    schedule 23.02.2015

Короче говоря, причина, по которой ваш HttpHandler не вызывается, заключается в том, что вы забиваете FilterChain, установленный по умолчанию, который обеспечивает поддержку HttpHandler.

Что касается поддержки фрагментированного кодирования, она уже предоставлена ​​вам. Если во время фиксации ответа длина содержимого не была установлена, тогда в ответе будет использоваться фрагментированное кодирование передачи.

person rlubke    schedule 10.01.2014
comment
Я бы хотел, чтобы это было так, я постоянно получаю ошибки кодирования по частям всякий раз, когда отправляю запрос 1.1. Вот почему я пытаюсь добавить в ChunkedInputFilter. - person Chad Baker; 10.01.2014
comment
Я бы рекомендовал зарегистрировать проблему java.net/jira/browse/GRIZZLY. Если вы можете связать тестовый пример через Dropbox или какой-либо другой сервис обмена (вложения JIRA отключены), мы можем вам помочь. - person rlubke; 11.01.2014