2014-01-07 4 views
1

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

  • процесса указанные фильтры
  • эхо запрос обратно отправитель

Я подаю запрос от 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(); 
    } 

} 

MyEchoHandler:

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 при использовании фильтров ,

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

Спасибо заранее!

+0

Можете ли вы объяснить, почему вы чувствуете, что вам нужен пользовательский фильтр? Я хотел бы лучше понять, что вы пытаетесь выполнить, прежде чем продолжить. – rlubke

+0

Мне нужна цепочка фильтров для добавления поддержки кодирования с чередованием –

ответ

0

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

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

+0

Я бы хотел, чтобы это было так, я постоянно получаю ошибки в кодировке, когда я отправляю запрос 1.1. Вот почему я пытаюсь добавить в ChunkedInputFilter. –

+0

Я бы рекомендовал зарегистрировать проблему https://java.net/jira/browse/GRIZZLY/. Если вы можете связать тестовый пример с помощью Dropbox или другого сервиса обмена (вложения JIRA отключены), мы можем дать вам руку. – rlubke

1

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

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

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

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