Skip to content

Commit a748617

Browse files
committed
#557 added support for response delay when response is dynamically created
1 parent 57d3411 commit a748617

15 files changed

+129
-208
lines changed

mockserver-core/src/main/java/org/mockserver/mock/action/ActionHandler.java

Lines changed: 34 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -89,101 +89,91 @@ public void processAction(final HttpRequest request, final ResponseWriter respon
8989
httpStateHandler.log(new ExpectationMatchLogEntry(request, expectation));
9090
switch (action.getType()) {
9191
case RESPONSE: {
92-
final HttpResponse httpResponse = (HttpResponse) action;
93-
scheduler.schedule(new Runnable() {
92+
scheduler.submit(new Runnable() {
9493
public void run() {
95-
HttpResponse response = httpResponseActionHandler.handle(httpResponse);
96-
writeResponseActionResponse(response, responseWriter, request, action);
94+
final HttpResponse response = httpResponseActionHandler.handle((HttpResponse) action);
95+
writeResponseActionResponse(response, responseWriter, request, action, synchronous);
9796
}
98-
}, httpResponse.getDelay(), synchronous);
97+
}, synchronous);
9998
break;
10099
}
101100
case RESPONSE_TEMPLATE: {
102-
final HttpTemplate httpTemplate = (HttpTemplate) action;
103-
scheduler.schedule(new Runnable() {
101+
scheduler.submit(new Runnable() {
104102
public void run() {
105-
HttpResponse response = httpResponseTemplateActionHandler.handle(httpTemplate, request);
106-
writeResponseActionResponse(response, responseWriter, request, action);
103+
final HttpResponse response = httpResponseTemplateActionHandler.handle((HttpTemplate) action, request);
104+
writeResponseActionResponse(response, responseWriter, request, action, synchronous);
107105
}
108-
}, httpTemplate.getDelay(), synchronous);
106+
}, synchronous);
109107
break;
110108
}
111109
case RESPONSE_CLASS_CALLBACK: {
112-
final HttpClassCallback classCallback = (HttpClassCallback) action;
113110
scheduler.submit(new Runnable() {
114111
public void run() {
115-
HttpResponse response = httpResponseClassCallbackActionHandler.handle(classCallback, request);
116-
writeResponseActionResponse(response, responseWriter, request, action);
112+
final HttpResponse response = httpResponseClassCallbackActionHandler.handle((HttpClassCallback) action, request);
113+
writeResponseActionResponse(response, responseWriter, request, action, synchronous);
117114
}
118115
}, synchronous);
119116
break;
120117
}
121118
case RESPONSE_OBJECT_CALLBACK: {
122-
final HttpObjectCallback objectCallback = (HttpObjectCallback) action;
123119
scheduler.submit(new Runnable() {
124120
public void run() {
125-
httpResponseObjectCallbackActionHandler.handle(ActionHandler.this, objectCallback, request, responseWriter);
121+
httpResponseObjectCallbackActionHandler.handle(ActionHandler.this, (HttpObjectCallback) action, request, responseWriter, synchronous);
126122
}
127123
}, synchronous);
128124
break;
129125
}
130126
case FORWARD: {
131-
final HttpForward httpForward = (HttpForward) action;
132127
scheduler.schedule(new Runnable() {
133128
public void run() {
134-
final HttpForwardActionResult responseFuture = httpForwardActionHandler.handle(httpForward, request);
129+
final HttpForwardActionResult responseFuture = httpForwardActionHandler.handle((HttpForward) action, request);
135130
writeForwardActionResponse(responseFuture, responseWriter, request, action, synchronous);
136131
}
137-
}, httpForward.getDelay(), synchronous);
132+
}, synchronous, action.getDelay());
138133
break;
139134
}
140135
case FORWARD_TEMPLATE: {
141-
final HttpTemplate httpTemplate = (HttpTemplate) action;
142136
scheduler.schedule(new Runnable() {
143137
public void run() {
144-
final HttpForwardActionResult responseFuture = httpForwardTemplateActionHandler.handle(httpTemplate, request);
138+
final HttpForwardActionResult responseFuture = httpForwardTemplateActionHandler.handle((HttpTemplate) action, request);
145139
writeForwardActionResponse(responseFuture, responseWriter, request, action, synchronous);
146140
}
147-
}, httpTemplate.getDelay(), synchronous);
141+
}, synchronous, action.getDelay());
148142
break;
149143
}
150144
case FORWARD_CLASS_CALLBACK: {
151-
final HttpClassCallback classCallback = (HttpClassCallback) action;
152-
scheduler.submit(new Runnable() {
145+
scheduler.schedule(new Runnable() {
153146
public void run() {
154-
final HttpForwardActionResult responseFuture = httpForwardClassCallbackActionHandler.handle(classCallback, request);
147+
final HttpForwardActionResult responseFuture = httpForwardClassCallbackActionHandler.handle((HttpClassCallback) action, request);
155148
writeForwardActionResponse(responseFuture, responseWriter, request, action, synchronous);
156149
}
157-
}, synchronous);
150+
}, synchronous, action.getDelay());
158151
break;
159152
}
160153
case FORWARD_OBJECT_CALLBACK: {
161-
final HttpObjectCallback objectCallback = (HttpObjectCallback) action;
162-
scheduler.submit(new Runnable() {
154+
scheduler.schedule(new Runnable() {
163155
public void run() {
164-
httpForwardObjectCallbackActionHandler.handle(ActionHandler.this, objectCallback, request, responseWriter, synchronous);
156+
httpForwardObjectCallbackActionHandler.handle(ActionHandler.this, (HttpObjectCallback) action, request, responseWriter, synchronous);
165157
}
166-
}, synchronous);
158+
}, synchronous, action.getDelay());
167159
break;
168160
}
169161
case FORWARD_REPLACE: {
170-
final HttpOverrideForwardedRequest httpOverrideForwardedRequest = (HttpOverrideForwardedRequest) action;
171162
scheduler.schedule(new Runnable() {
172163
public void run() {
173-
final HttpForwardActionResult responseFuture = httpOverrideForwardedRequestCallbackActionHandler.handle(httpOverrideForwardedRequest, request);
164+
final HttpForwardActionResult responseFuture = httpOverrideForwardedRequestCallbackActionHandler.handle((HttpOverrideForwardedRequest) action, request);
174165
writeForwardActionResponse(responseFuture, responseWriter, request, action, synchronous);
175166
}
176-
}, httpOverrideForwardedRequest.getDelay(), synchronous);
167+
}, synchronous, action.getDelay());
177168
break;
178169
}
179170
case ERROR: {
180-
final HttpError httpError = (HttpError) action;
181171
scheduler.schedule(new Runnable() {
182172
public void run() {
183-
httpErrorActionHandler.handle(httpError, ctx);
184-
mockServerLogger.info(EXPECTATION_RESPONSE, request, "returning error:{}for request:{}for action:{}", httpError, request, action);
173+
httpErrorActionHandler.handle((HttpError) action, ctx);
174+
mockServerLogger.info(EXPECTATION_RESPONSE, request, "returning error:{}for request:{}for action:{}", action, request, action);
185175
}
186-
}, httpError.getDelay(), synchronous);
176+
}, synchronous, action.getDelay());
187177
break;
188178
}
189179
}
@@ -236,9 +226,13 @@ public void run() {
236226
}
237227
}
238228

239-
void writeResponseActionResponse(HttpResponse response, ResponseWriter responseWriter, HttpRequest request, Action action) {
240-
responseWriter.writeResponse(request, response, false);
241-
mockServerLogger.info(EXPECTATION_RESPONSE, request, "returning response:{}for request:{}for action:{}", response, request, action);
229+
void writeResponseActionResponse(final HttpResponse response, final ResponseWriter responseWriter, final HttpRequest request, final Action action, boolean synchronous) {
230+
scheduler.schedule(new Runnable() {
231+
public void run() {
232+
responseWriter.writeResponse(request, response, false);
233+
mockServerLogger.info(EXPECTATION_RESPONSE, request, "returning response:{}for request:{}for action:{}", response, request, action);
234+
}
235+
}, synchronous, action.getDelay(), response.getDelay());
242236
}
243237

244238
void writeForwardActionResponse(final HttpForwardActionResult responseFuture, final ResponseWriter responseWriter, final HttpRequest request, final Action action, boolean synchronous) {
@@ -248,7 +242,7 @@ public void run() {
248242
HttpResponse response = responseFuture.getHttpResponse().get();
249243
responseWriter.writeResponse(request, response, false);
250244
httpStateHandler.log(new RequestResponseLogEntry(request, response));
251-
mockServerLogger.info(FORWARDED_REQUEST, request, "returning response:{}for forwarded request\n\n in json:{}\n\n in curl:{}", response, responseFuture.getHttpRequest(), httpRequestToCurlSerializer.toCurl(responseFuture.getHttpRequest()));
245+
mockServerLogger.info(FORWARDED_REQUEST, request, "returning response:{}for forwarded request\n\n in json:{}\n\n in curl:{}for action:{}", response, responseFuture.getHttpRequest(), httpRequestToCurlSerializer.toCurl(responseFuture.getHttpRequest()), action);
252246
} catch (Exception ex) {
253247
mockServerLogger.error(request, ex, ex.getMessage());
254248
}

mockserver-core/src/main/java/org/mockserver/mock/action/HttpResponseObjectCallbackActionHandler.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.mockserver.model.HttpRequest;
88
import org.mockserver.model.HttpResponse;
99
import org.mockserver.responsewriter.ResponseWriter;
10+
import org.mockserver.scheduler.Scheduler;
1011

1112
import java.util.UUID;
1213

@@ -22,13 +23,13 @@ public HttpResponseObjectCallbackActionHandler(HttpStateHandler httpStateHandler
2223
this.webSocketClientRegistry = httpStateHandler.getWebSocketClientRegistry();
2324
}
2425

25-
public void handle(final ActionHandler actionHandler, final HttpObjectCallback httpObjectCallback, final HttpRequest request, final ResponseWriter responseWriter) {
26+
public void handle(final ActionHandler actionHandler, final HttpObjectCallback httpObjectCallback, final HttpRequest request, final ResponseWriter responseWriter, final boolean synchronous) {
2627
String clientId = httpObjectCallback.getClientId();
2728
String webSocketCorrelationId = UUID.randomUUID().toString();
2829
webSocketClientRegistry.registerCallbackHandler(webSocketCorrelationId, new WebSocketResponseCallback() {
2930
@Override
3031
public void handle(HttpResponse response) {
31-
actionHandler.writeResponseActionResponse(response.removeHeader(WEB_SOCKET_CORRELATION_ID_HEADER_NAME), responseWriter, request, httpObjectCallback);
32+
actionHandler.writeResponseActionResponse(response.removeHeader(WEB_SOCKET_CORRELATION_ID_HEADER_NAME), responseWriter, request, httpObjectCallback, synchronous);
3233
}
3334
});
3435
webSocketClientRegistry.sendClientMessage(clientId, request.clone().withHeader(WEB_SOCKET_CORRELATION_ID_HEADER_NAME, webSocketCorrelationId));

mockserver-core/src/main/java/org/mockserver/model/Action.java

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,39 @@
22

33
import com.fasterxml.jackson.annotation.JsonIgnore;
44

5+
import java.util.concurrent.TimeUnit;
6+
57
/**
68
* @author jamesdbloom
79
*/
8-
public abstract class Action extends ObjectWithJsonToString {
10+
public abstract class Action<T extends Action> extends ObjectWithJsonToString {
11+
12+
private Delay delay;
13+
14+
/**
15+
* The delay before responding with this request as a Delay object, for example new Delay(TimeUnit.SECONDS, 3)
16+
*
17+
* @param delay a Delay object, for example new Delay(TimeUnit.SECONDS, 3)
18+
*/
19+
public T withDelay(Delay delay) {
20+
this.delay = delay;
21+
return (T) this;
22+
}
23+
24+
/**
25+
* The delay before responding with this request as a Delay object, for example new Delay(TimeUnit.SECONDS, 3)
26+
*
27+
* @param timeUnit a the time unit, for example TimeUnit.SECONDS
28+
* @param value a the number of time units to delay the response
29+
*/
30+
public T withDelay(TimeUnit timeUnit, long value) {
31+
this.delay = new Delay(timeUnit, value);
32+
return (T) this;
33+
}
34+
35+
public Delay getDelay() {
36+
return delay;
37+
}
938

1039
@JsonIgnore
1140
public abstract Type getType();

mockserver-core/src/main/java/org/mockserver/model/HttpClassCallback.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
/**
66
* @author jamesdbloom
77
*/
8-
public class HttpClassCallback extends Action {
8+
public class HttpClassCallback extends Action<HttpClassCallback> {
99

1010
private String callbackClass;
1111
private Type actionType;

mockserver-core/src/main/java/org/mockserver/model/HttpError.java

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@
77
/**
88
* @author jamesdbloom
99
*/
10-
public class HttpError extends Action {
11-
private Delay delay;
10+
public class HttpError extends Action<HttpError> {
1211
private Boolean dropConnection;
1312
private byte[] responseBytes;
1413

@@ -44,31 +43,6 @@ public byte[] getResponseBytes() {
4443
return responseBytes;
4544
}
4645

47-
/**
48-
* The delay before responding with this request as a Delay object, for example new Delay(TimeUnit.SECONDS, 3)
49-
*
50-
* @param delay a Delay object, for example new Delay(TimeUnit.SECONDS, 3)
51-
*/
52-
public HttpError withDelay(Delay delay) {
53-
this.delay = delay;
54-
return this;
55-
}
56-
57-
/**
58-
* The delay before responding with this request as a Delay object, for example new Delay(TimeUnit.SECONDS, 3)
59-
*
60-
* @param timeUnit a the time unit, for example TimeUnit.SECONDS
61-
* @param value a the number of time units to delay the response
62-
*/
63-
public HttpError withDelay(TimeUnit timeUnit, long value) {
64-
this.delay = new Delay(timeUnit, value);
65-
return this;
66-
}
67-
68-
public Delay getDelay() {
69-
return delay;
70-
}
71-
7246
@Override
7347
@JsonIgnore
7448
public Type getType() {

mockserver-core/src/main/java/org/mockserver/model/HttpForward.java

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,11 @@
77
/**
88
* @author jamesdbloom
99
*/
10-
public class HttpForward extends Action {
10+
public class HttpForward extends Action<HttpForward> {
1111

1212
private String host;
1313
private Integer port = 80;
1414
private Scheme scheme = Scheme.HTTP;
15-
private Delay delay;
1615

1716
/**
1817
* Static builder to create a callback.
@@ -69,31 +68,6 @@ public HttpForward withScheme(Scheme scheme) {
6968
return this;
7069
}
7170

72-
/**
73-
* The delay before responding with this request as a Delay object, for example new Delay(TimeUnit.SECONDS, 3)
74-
*
75-
* @param delay a Delay object, for example new Delay(TimeUnit.SECONDS, 3)
76-
*/
77-
public HttpForward withDelay(Delay delay) {
78-
this.delay = delay;
79-
return this;
80-
}
81-
82-
/**
83-
* The delay before responding with this request as a Delay object, for example new Delay(TimeUnit.SECONDS, 3)
84-
*
85-
* @param timeUnit a the time unit, for example TimeUnit.SECONDS
86-
* @param value a the number of time units to delay the response
87-
*/
88-
public HttpForward withDelay(TimeUnit timeUnit, long value) {
89-
this.delay = new Delay(timeUnit, value);
90-
return this;
91-
}
92-
93-
public Delay getDelay() {
94-
return delay;
95-
}
96-
9771
public enum Scheme {
9872
HTTP,
9973
HTTPS

mockserver-core/src/main/java/org/mockserver/model/HttpObjectCallback.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
/**
66
* @author jamesdbloom
77
*/
8-
public class HttpObjectCallback extends Action {
8+
public class HttpObjectCallback extends Action<HttpObjectCallback> {
99

1010
private String clientId;
1111
private Type actionType;

mockserver-core/src/main/java/org/mockserver/model/HttpOverrideForwardedRequest.java

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,9 @@
77
/**
88
* @author jamesdbloom
99
*/
10-
public class HttpOverrideForwardedRequest extends Action {
10+
public class HttpOverrideForwardedRequest extends Action<HttpOverrideForwardedRequest> {
1111

1212
private HttpRequest httpRequest;
13-
private Delay delay;
1413

1514
/**
1615
* Static builder which will allow overriding proxied request with the specified request.
@@ -35,31 +34,6 @@ public HttpOverrideForwardedRequest withHttpRequest(HttpRequest httpRequest) {
3534
return this;
3635
}
3736

38-
/**
39-
* The delay before responding with this request as a Delay object, for example new Delay(TimeUnit.SECONDS, 3)
40-
*
41-
* @param delay a Delay object, for example new Delay(TimeUnit.SECONDS, 3)
42-
*/
43-
public HttpOverrideForwardedRequest withDelay(Delay delay) {
44-
this.delay = delay;
45-
return this;
46-
}
47-
48-
/**
49-
* The delay before responding with this request as a Delay object, for example new Delay(TimeUnit.SECONDS, 3)
50-
*
51-
* @param timeUnit a the time unit, for example TimeUnit.SECONDS
52-
* @param value a the number of time units to delay the response
53-
*/
54-
public HttpOverrideForwardedRequest withDelay(TimeUnit timeUnit, long value) {
55-
this.delay = new Delay(timeUnit, value);
56-
return this;
57-
}
58-
59-
public Delay getDelay() {
60-
return delay;
61-
}
62-
6337
@Override
6438
@JsonIgnore
6539
public Type getType() {

0 commit comments

Comments
 (0)