@@ -59,9 +59,11 @@ public final class XdsTestServer {
59
59
"succeed-on-retry-attempt-" ;
60
60
private static final String CALL_BEHAVIOR_ERROR_CODE =
61
61
"error-code-" ;
62
+ private static final String CALL_BEHAVIOR_HOSTNAME = "hostname=" ;
62
63
private static final Splitter HEADER_VALUE_SPLITTER = Splitter .on (',' )
63
64
.trimResults ()
64
65
.omitEmptyStrings ();
66
+ private static final Splitter HEADER_HOSTNAME_SPLITTER = Splitter .on (' ' );
65
67
66
68
private static Logger logger = Logger .getLogger (XdsTestServer .class .getName ());
67
69
@@ -300,8 +302,40 @@ public void sendHeaders(Metadata responseHeaders) {
300
302
};
301
303
ServerCall .Listener <ReqT > noopListener = new ServerCall .Listener <ReqT >() {};
302
304
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
+
304
321
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
+
305
339
if (callBehavior .startsWith (CALL_BEHAVIOR_SLEEP_VALUE )) {
306
340
try {
307
341
int timeout = Integer .parseInt (
@@ -321,12 +355,9 @@ public void sendHeaders(Metadata responseHeaders) {
321
355
return noopListener ;
322
356
}
323
357
}
324
- }
325
358
326
- // succeed the retry attempt if instructed by rpc-behavior
327
- int succeedOnAttemptNum = Integer .MAX_VALUE ;
328
- for (String callBehavior : callBehaviors ) {
329
359
if (callBehavior .startsWith (CALL_BEHAVIOR_SUCCEED_ON_RETRY_ATTEMPT_VALUE )) {
360
+ int succeedOnAttemptNum = Integer .MAX_VALUE ;
330
361
try {
331
362
succeedOnAttemptNum = Integer .parseInt (
332
363
callBehavior .substring (CALL_BEHAVIOR_SUCCEED_ON_RETRY_ATTEMPT_VALUE .length ()));
@@ -337,35 +368,16 @@ public void sendHeaders(Metadata responseHeaders) {
337
368
new Metadata ());
338
369
return noopListener ;
339
370
}
340
- break ;
371
+ if (attemptNum == succeedOnAttemptNum ) {
372
+ return next .startCall (newCall , requestHeaders );
373
+ }
341
374
}
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 )) {
355
378
return noopListener ;
356
379
}
357
- }
358
- if (attemptNum == succeedOnAttemptNum ) {
359
- return next .startCall (newCall , requestHeaders );
360
- }
361
380
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 ) {
369
381
if (callBehavior .startsWith (CALL_BEHAVIOR_ERROR_CODE )) {
370
382
try {
371
383
int codeValue = Integer .valueOf (
0 commit comments