client A ----------> netty server --------> client B
request request
client A <---------- netty server <----------- client B
response response
제가 설계중인 릴레이서버는 위의 도식과 같이 a에서 서버로 request 요청을 보내면 서버는 b로 request 요청을 전달합니다. 반대로 b에서 response를 보내면 서버는 이를 a로 전달합니다.
이처럼 서버는 request와 response 둘다 받아야 하는데요.(어떻게 보면 http 서버이자 클라이언트인 것이죠) 문제는 네티에서 제공하는 server codec과 client codec을 사용할 경우 request -> response 또는 response -> request 와 같이만 동작을 합니다.
당연한 얘기이죠. 하지만 저는 a와 b가 request,response를 보냈을 때 네티가 어떠한 과정(이 주제의 핵심입니다)을 거쳐 지금 들어온 bytebuf가 request인지 response인지를 알아낸 다음 적절한 디코더와 인코더를 추가하고 싶습니다.
제가 시도했던 방법으로는 pipeline에
ch.pipeline()
.addLast(new HttpRequestDecoder());
.addLast(new HttpResponseDecoder());
.
.
.
이런식으로 두개의 디코더를 추가하면 순서대로 통과하면서 해당하는 decoder에서 디코딩을 할 줄 알았습니다.
하지만 response가 왔을 때 첫번째 코덱인 requestdecoder에서 에러를 일으키더군요... 그리고 두번째인 responsecodec에는 들어가지 않는 것 같습니다.
제가 생각한 대로 로직을 구현할 수 있을까요?
아니면 bytebuf를 디코딩 해서 request인지 response인지 알아낸 후(방법이 있다면 어떻게 알아내는지도 궁금합니다.)에 적절한 codec을 유동적으로 추가해 줘야 할까요?