나는 간단한 Grizzly 웹 서버를 구현하려고하고있어 그, HTTP 요청을받는 즉시, 윌 :그리 즐 2.2.19 FilterChain 대 HttpHandler를
- 프로세스 지정된 필터
- 에코를 요청 위로
RunServer.java을 : 내가 soapUI의 요청을 제출하고 내가 기대하지 않는 행동을보고하고
보낸 사람 :
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 요청 사람이 설명 할 수있는 경우
는//filterChainBuilder.add(new StringFilter(Charset.forName("UTF-8")));
나는 그것을 알아낼 수 없습니다
, 나는 감사하겠습니다 : 나는의 runserver에서 UTF-8 문자열 필터를 주석 처리하지 않으면 이상하게 handleRead() 메소드는, 하지 불을 수행 그것.
하지만 더 중요한 것은 MyEchoHandler의 service() 메소드가 실행되지 않는다는 것입니다.
그에만 불 나는 경우 runserver에서 NetworkListener에 FilterChain을 설정하는 라인을 주석 경우 :
//listener.setFilterChain(filterChainBuilder.build());
나는 FilterChain을 사용 피할을 때, 나는 실제로 다시 soapUI에 대한 응답을받을 수 있나요 ,하지만 필자는 실제로 FilterChain이 필요합니다.
필터의 사용에 찬성하여 핸들러를 모두 피하는 것이 좋을지 모르지만 필터를 사용하는 동안 soapUI에 대한 응답을 얻을 수 없었습니다. .
내 방식의 오류를 정확하게 지적 할 수있는 사람이 있습니까?
미리 감사드립니다.
사용자 정의 FilterChain이 필요한 이유를 설명 할 수 있습니까? 계속하기 전에 성취하려는 것을 더 잘 이해하고 싶습니다. – rlubke
청크 인코딩 지원을 추가하려면 필터 체인이 필요합니다. –