@@ -57,6 +57,7 @@ public class RpcCallHandler extends SimpleChannelInboundHandler<A6Request> {
5757 private final Logger logger = LoggerFactory .getLogger (RpcCallHandler .class );
5858
5959 private final static String EXTRA_INFO_REQ_BODY_KEY = "request_body" ;
60+ private final static String EXTRA_INFO_RESP_BODY_KEY = "response_body" ;
6061
6162 private final Cache <Long , A6Conf > cache ;
6263
@@ -106,6 +107,62 @@ protected void channelRead0(ChannelHandlerContext ctx, A6Request request) {
106107 }
107108 }
108109
110+ private Boolean [] fetchExtraInfo (ChannelHandlerContext ctx , PluginFilterChain chain ) {
111+ // fetch the nginx variables
112+ Set <String > varKeys = new HashSet <>();
113+ boolean requiredReqBody = false ;
114+ boolean requiredVars = false ;
115+ boolean requiredRespBody = false ;
116+
117+ for (PluginFilter filter : chain .getFilters ()) {
118+ Collection <String > vars = filter .requiredVars ();
119+ if (!CollectionUtils .isEmpty (vars )) {
120+ varKeys .addAll (vars );
121+ requiredVars = true ;
122+ }
123+
124+ if (filter .requiredBody () != null && filter .requiredBody ()) {
125+ requiredReqBody = true ;
126+ }
127+
128+ if (filter .requiredRespBody () != null && filter .requiredRespBody ()) {
129+ requiredRespBody = true ;
130+ }
131+ }
132+
133+ // fetch the nginx vars
134+ if (requiredVars ) {
135+ for (String varKey : varKeys ) {
136+ boolean offer = queue .offer (varKey );
137+ if (!offer ) {
138+ logger .error ("queue is full" );
139+ errorHandle (ctx , Code .SERVICE_UNAVAILABLE );
140+ }
141+ ExtraInfoRequest extraInfoRequest = new ExtraInfoRequest (varKey , null , null );
142+ ChannelFuture future = ctx .writeAndFlush (extraInfoRequest );
143+ future .addListeners (ChannelFutureListener .FIRE_EXCEPTION_ON_FAILURE );
144+ }
145+ }
146+
147+ // fetch the request body
148+ if (requiredReqBody ) {
149+ queue .offer (EXTRA_INFO_REQ_BODY_KEY );
150+ ExtraInfoRequest extraInfoRequest = new ExtraInfoRequest (null , true , null );
151+ ChannelFuture future = ctx .writeAndFlush (extraInfoRequest );
152+ future .addListeners (ChannelFutureListener .FIRE_EXCEPTION_ON_FAILURE );
153+ }
154+
155+ // fetch the response body
156+ if (requiredRespBody ) {
157+ queue .offer (EXTRA_INFO_RESP_BODY_KEY );
158+ ExtraInfoRequest extraInfoRequest = new ExtraInfoRequest (null , null , true );
159+ ChannelFuture future = ctx .writeAndFlush (extraInfoRequest );
160+ future .addListeners (ChannelFutureListener .FIRE_EXCEPTION_ON_FAILURE );
161+ }
162+
163+ return new Boolean []{requiredVars , requiredReqBody , requiredRespBody };
164+ }
165+
109166 private void handleHttpRespCall (ChannelHandlerContext ctx , PostRequest request ) {
110167 cleanCtx ();
111168
@@ -129,7 +186,14 @@ private void handleHttpRespCall(ChannelHandlerContext ctx, PostRequest request)
129186 return ;
130187 }
131188
132- doPostFilter (ctx );
189+ Boolean [] result = fetchExtraInfo (ctx , chain );
190+ if (Objects .isNull (result )) {
191+ return ;
192+ }
193+ if (!result [0 ] && !result [2 ]) {
194+ // no need to fetch extra info
195+ doPostFilter (ctx );
196+ }
133197 }
134198
135199 private void doPostFilter (ChannelHandlerContext ctx ) {
@@ -141,6 +205,7 @@ private void doPostFilter(ChannelHandlerContext ctx) {
141205 }
142206
143207 postReq .initCtx (conf .getConfig ());
208+ postReq .setVars (nginxVars );
144209
145210 PluginFilterChain chain = conf .getChain ();
146211 chain .postFilter (postReq , postResp );
@@ -159,12 +224,24 @@ private void handleExtraInfo(ChannelHandlerContext ctx, ExtraInfoResponse reques
159224 }
160225
161226 if (EXTRA_INFO_REQ_BODY_KEY .equals (varsKey )) {
162- currReq .setBody (result );
163- } else {
227+ if (!Objects .isNull (currReq )) {
228+ currReq .setBody (result );
229+ }
230+ } else if (EXTRA_INFO_RESP_BODY_KEY .equals (varsKey )) {
231+ if (!Objects .isNull (postReq )) {
232+ postReq .setBody (result );
233+ }
234+ }
235+ else {
164236 nginxVars .put (varsKey , result );
165237 }
238+
166239 if (queue .isEmpty ()) {
167- doFilter (ctx );
240+ if (currReq != null ) {
241+ doFilter (ctx );
242+ } else if (postReq != null ) {
243+ doPostFilter (ctx );
244+ }
168245 }
169246 }
170247
@@ -215,47 +292,12 @@ private void handleHttpReqCall(ChannelHandlerContext ctx, HttpRequest request) {
215292 return ;
216293 }
217294
218- // fetch the nginx variables
219- Set <String > varKeys = new HashSet <>();
220- boolean requiredBody = false ;
221- boolean requiredVars = false ;
222-
223- for (PluginFilter filter : chain .getFilters ()) {
224- Collection <String > vars = filter .requiredVars ();
225- if (!CollectionUtils .isEmpty (vars )) {
226- varKeys .addAll (vars );
227- requiredVars = true ;
228- }
229-
230- if (filter .requiredBody () != null && filter .requiredBody ()) {
231- requiredBody = true ;
232- }
233- }
234-
235- if (varKeys .size () > 0 ) {
236- for (String varKey : varKeys ) {
237- boolean offer = queue .offer (varKey );
238- if (!offer ) {
239- logger .error ("queue is full" );
240- errorHandle (ctx , Code .SERVICE_UNAVAILABLE );
241- return ;
242- }
243- ExtraInfoRequest extraInfoRequest = new ExtraInfoRequest (varKey , null );
244- ChannelFuture future = ctx .writeAndFlush (extraInfoRequest );
245- future .addListeners (ChannelFutureListener .FIRE_EXCEPTION_ON_FAILURE );
246- }
247- }
248-
249- // fetch the request body
250- if (requiredBody ) {
251- queue .offer (EXTRA_INFO_REQ_BODY_KEY );
252- ExtraInfoRequest extraInfoRequest = new ExtraInfoRequest (null , true );
253- ChannelFuture future = ctx .writeAndFlush (extraInfoRequest );
254- future .addListeners (ChannelFutureListener .FIRE_EXCEPTION_ON_FAILURE );
295+ Boolean [] result = fetchExtraInfo (ctx , chain );
296+ if (Objects .isNull (result )) {
297+ return ;
255298 }
256-
257- // no need to fetch the nginx variables or request body, just do filter
258- if (!requiredBody && !requiredVars ) {
299+ if (!result [0 ] && !result [1 ]) {
300+ // no need to fetch extra info
259301 doFilter (ctx );
260302 }
261303 }
0 commit comments