I think you missed a return here as forbidden will close the channel, so there is not need to call ctx.fireChannelRead(..) or I'm wrong ?