2929import org .zaproxy .zap .extension .httppanel .Message ;
3030import org .zaproxy .zap .model .InvalidMessageException ;
3131
32+ /**
33+ * Iterates the Cartesian product of payload lists with the first fuzz position (by {@code
34+ * MessageLocation} sort order) changing fastest.
35+ */
3236public class MultipleMessageLocationsBreadthFirstReplacer <T extends Message >
3337 implements MultipleMessageLocationsReplacer <T > {
3438
@@ -44,8 +48,8 @@ public class MultipleMessageLocationsBreadthFirstReplacer<T extends Message>
4448 private boolean initialised ;
4549 private boolean setup ;
4650
47- private int tailIndex ;
48- private MessageLocationReplacementGenerator <?, ?> tail ;
51+ private int headIndex ;
52+ private MessageLocationReplacementGenerator <?, ?> head ;
4953
5054 private long numberOfReplacements ;
5155
@@ -65,6 +69,7 @@ public void init(
6569 listCurrentReplacements =
6670 new MessageLocationReplacement <?>[messageLocationReplacementGenerator .size ()];
6771
72+ numberOfReplacements = 1 ;
6873 replacementGenerators = new ArrayList <>(messageLocationReplacementGenerator .size ());
6974 for (MessageLocationReplacementGenerator <?, ?> mlr : messageLocationReplacementGenerator ) {
7075 if (mlr .hasNext ()) {
@@ -76,10 +81,11 @@ public void init(
7681 replacementGenerators .add (mlr );
7782 }
7883 }
79- numberOfReplacements = 0 ;
8084
81- tailIndex = replacementGenerators .size () - 1 ;
82- tail = replacementGenerators .get (tailIndex );
85+ headIndex = 0 ;
86+ if (!replacementGenerators .isEmpty ()) {
87+ head = replacementGenerators .get (headIndex );
88+ }
8389 initialised = true ;
8490 setup = true ;
8591 }
@@ -91,7 +97,7 @@ public long getNumberOfReplacements() {
9197
9298 @ Override
9399 public boolean hasNext () {
94- for (int i = tailIndex ; i >= 0 ; i -- ) {
100+ for (int i = headIndex ; i < replacementGenerators . size () ; i ++ ) {
95101 if (replacementGenerators .get (i ).hasNext ()) {
96102 return true ;
97103 }
@@ -100,16 +106,16 @@ public boolean hasNext() {
100106 }
101107
102108 @ Override
103- public T next () throws InvalidMessageException {
109+ public T next () throws ReplacementException , InvalidMessageException {
104110 if (setup ) {
105111 setup ();
106112 setup = false ;
107113 }
108114
109- if (!tail .hasNext ()) {
110- tail .reset ();
115+ if (!head .hasNext ()) {
116+ head .reset ();
111117
112- for (int i = tailIndex - 1 ; i >= 0 ; i -- ) {
118+ for (int i = headIndex + 1 ; i < replacementGenerators . size () ; i ++ ) {
113119 if (replacementGenerators .get (i ).hasNext ()) {
114120 listCurrentReplacements [i ] = replacementGenerators .get (i ).next ();
115121 break ;
@@ -120,7 +126,7 @@ public T next() throws InvalidMessageException {
120126 }
121127 }
122128
123- listCurrentReplacements [tailIndex ] = tail .next ();
129+ listCurrentReplacements [headIndex ] = head .next ();
124130
125131 currentReplacements .clear ();
126132 currentReplacements .addAll (Arrays .asList (listCurrentReplacements ));
@@ -129,7 +135,7 @@ public T next() throws InvalidMessageException {
129135 }
130136
131137 private void setup () {
132- for (int i = 0 ; i < tailIndex ; i ++) {
138+ for (int i = headIndex + 1 ; i < replacementGenerators . size () ; i ++) {
133139 if (replacementGenerators .get (i ).hasNext ()) {
134140 listCurrentReplacements [i ] = replacementGenerators .get (i ).next ();
135141 }
0 commit comments