@@ -59,9 +59,11 @@ public final class XdsTestServer {
5959 "succeed-on-retry-attempt-" ;
6060 private static final String CALL_BEHAVIOR_ERROR_CODE =
6161 "error-code-" ;
62+ private static final String CALL_BEHAVIOR_HOSTNAME = "hostname=" ;
6263 private static final Splitter HEADER_VALUE_SPLITTER = Splitter .on (',' )
6364 .trimResults ()
6465 .omitEmptyStrings ();
66+ private static final Splitter HEADER_HOSTNAME_SPLITTER = Splitter .on (' ' );
6567
6668 private static Logger logger = Logger .getLogger (XdsTestServer .class .getName ());
6769
@@ -300,8 +302,40 @@ public void sendHeaders(Metadata responseHeaders) {
300302 };
301303 ServerCall .Listener <ReqT > noopListener = new ServerCall .Listener <ReqT >() {};
302304
303- // sleep if instructed by rpc-behavior
305+ int attemptNum = 0 ;
306+ String attemptNumHeader = requestHeaders .get (ATTEMPT_NUM );
307+ if (attemptNumHeader != null ) {
308+ try {
309+ attemptNum = Integer .valueOf (attemptNumHeader );
310+ } catch (NumberFormatException e ) {
311+ newCall .close (
312+ Status .INVALID_ARGUMENT .withDescription (
313+ String .format (
314+ "Invalid format for grpc-previous-rpc-attempts header (%s)" ,
315+ attemptNumHeader )),
316+ new Metadata ());
317+ return noopListener ;
318+ }
319+ }
320+
304321 for (String callBehavior : callBehaviors ) {
322+ if (callBehavior .startsWith (CALL_BEHAVIOR_HOSTNAME )) {
323+ List <String > splitHeader = HEADER_HOSTNAME_SPLITTER .splitToList (callBehavior );
324+ if (splitHeader .size () > 1 ) {
325+ if (!splitHeader .get (0 ).substring (CALL_BEHAVIOR_HOSTNAME .length ()).equals (host )) {
326+ continue ;
327+ }
328+ callBehavior = splitHeader .get (1 );
329+ } else {
330+ newCall .close (
331+ Status .INVALID_ARGUMENT .withDescription (
332+ String .format ("Invalid format for rpc-behavior header (%s)" , callBehavior )),
333+ new Metadata ()
334+ );
335+ return noopListener ;
336+ }
337+ }
338+
305339 if (callBehavior .startsWith (CALL_BEHAVIOR_SLEEP_VALUE )) {
306340 try {
307341 int timeout = Integer .parseInt (
@@ -321,12 +355,9 @@ public void sendHeaders(Metadata responseHeaders) {
321355 return noopListener ;
322356 }
323357 }
324- }
325358
326- // succeed the retry attempt if instructed by rpc-behavior
327- int succeedOnAttemptNum = Integer .MAX_VALUE ;
328- for (String callBehavior : callBehaviors ) {
329359 if (callBehavior .startsWith (CALL_BEHAVIOR_SUCCEED_ON_RETRY_ATTEMPT_VALUE )) {
360+ int succeedOnAttemptNum = Integer .MAX_VALUE ;
330361 try {
331362 succeedOnAttemptNum = Integer .parseInt (
332363 callBehavior .substring (CALL_BEHAVIOR_SUCCEED_ON_RETRY_ATTEMPT_VALUE .length ()));
@@ -337,35 +368,16 @@ public void sendHeaders(Metadata responseHeaders) {
337368 new Metadata ());
338369 return noopListener ;
339370 }
340- break ;
371+ if (attemptNum == succeedOnAttemptNum ) {
372+ return next .startCall (newCall , requestHeaders );
373+ }
341374 }
342- }
343- int attemptNum = 0 ;
344- String attemptNumHeader = requestHeaders .get (ATTEMPT_NUM );
345- if (attemptNumHeader != null ) {
346- try {
347- attemptNum = Integer .valueOf (attemptNumHeader );
348- } catch (NumberFormatException e ) {
349- newCall .close (
350- Status .INVALID_ARGUMENT .withDescription (
351- String .format (
352- "Invalid format for grpc-previous-rpc-attempts header (%s)" ,
353- attemptNumHeader )),
354- new Metadata ());
375+
376+ // hang if instructed by rpc-behavior
377+ if (callBehavior .equals (CALL_BEHAVIOR_KEEP_OPEN_VALUE )) {
355378 return noopListener ;
356379 }
357- }
358- if (attemptNum == succeedOnAttemptNum ) {
359- return next .startCall (newCall , requestHeaders );
360- }
361380
362- // hang if instructed by rpc-behavior
363- if (callBehaviors .contains (CALL_BEHAVIOR_KEEP_OPEN_VALUE )) {
364- return noopListener ;
365- }
366-
367- // fail if instructed by rpc-behavior
368- for (String callBehavior : callBehaviors ) {
369381 if (callBehavior .startsWith (CALL_BEHAVIOR_ERROR_CODE )) {
370382 try {
371383 int codeValue = Integer .valueOf (
0 commit comments