Я пытаюсь реализовать простой 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 при использовании фильтров ,
Может ли кто-нибудь помочь мне определить ошибку моих путей?
Спасибо заранее!
Можете ли вы объяснить, почему вы чувствуете, что вам нужен пользовательский фильтр? Я хотел бы лучше понять, что вы пытаетесь выполнить, прежде чем продолжить. – rlubke
Мне нужна цепочка фильтров для добавления поддержки кодирования с чередованием –