2014-01-07 6 views
1

나는 간단한 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에 대한 응답을 얻을 수 없었습니다. .

내 방식의 오류를 정확하게 지적 할 수있는 사람이 있습니까?

미리 감사드립니다.

+0

사용자 정의 FilterChain이 필요한 이유를 설명 할 수 있습니까? 계속하기 전에 성취하려는 것을 더 잘 이해하고 싶습니다. – rlubke

+0

청크 인코딩 지원을 추가하려면 필터 체인이 필요합니다. –

답변

0

즉, HttpHandler 지원을 제공하는 기본적으로 설치되어있는 FilterChain이 사용자의 HttpHandler가 호출되지 않는 이유입니다.

청크 인코딩 지원은 이미 제공됩니다. 응답이 커밋 될 때 콘텐츠 길이가 설정되지 않은 경우 응답은 청크 분할 전송 인코딩을 사용합니다.

+0

그럴 경우, 1.1 요청을 제출할 때마다 지속적으로 청크 분할 인코딩 오류가 발생합니다. 그래서 ChunkedInputFilter를 추가하려고합니다. –

+0

https://java.net/jira/browse/GRIZZLY/ 문제를 로깅하는 것이 좋습니다. 드롭 박스 또는 다른 공유 서비스 (JIRA 첨부 파일이 비활성화되어 있음)를 통해 테스트 케이스를 연결할 수 있다면 우리는 당신에게 도움을 줄 수 있습니다. – rlubke

1

나는이 문제도 다루었으며 알아 내기에는 꽤 시간이 걸렸습니다.

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

StringFilter는 문자열을 바이트로 디코딩/인코딩하므로 특수 길이 접두사를 사용합니다.들어오는 메시지를 디코딩 할 수없는 경우 건너 뜁니다. 따라서 'handleRead'메서드가 실행되지 않는 것처럼 보입니다.