[tests] Stabilize the HTTP server's request log
The TestRequestLog added log entries only after a request had been handled. But the response is already sent at that point, so the following sequence was possible: client sends request A server thread T1 handles request A and sends back response client receives response client sends request B server thread T2 handles request B (and sends back response) server thread T2 logs B server thread T1 logs A Fix this by logging events before handling a request, and then filling in the response data after the request has been handled. This should avoid such inversions, at least for tests using a single single-threaded client. With multiple concurrent or multi-threaded clients, all bets about the log order would be off anyway. Bug: 528187 Change-Id: I99a46df17231fa7c4f75a8c37e2c14dc098c4e22 Signed-off-by: Thomas Wolf <twolf@apache.org>
This commit is contained in:
parent
911b4e0d82
commit
559be66529
|
@ -30,16 +30,18 @@ public class AccessEvent {
|
||||||
|
|
||||||
private final Map<String, String[]> parameters;
|
private final Map<String, String[]> parameters;
|
||||||
|
|
||||||
private final int status;
|
private int status;
|
||||||
|
|
||||||
private final Map<String, String> responseHeaders;
|
private Map<String, String> responseHeaders;
|
||||||
|
|
||||||
AccessEvent(Request req, Response rsp) {
|
AccessEvent(Request req) {
|
||||||
method = req.getMethod();
|
method = req.getMethod();
|
||||||
uri = req.getRequestURI();
|
uri = req.getRequestURI();
|
||||||
requestHeaders = cloneHeaders(req);
|
requestHeaders = cloneHeaders(req);
|
||||||
parameters = clone(req.getParameterMap());
|
parameters = clone(req.getParameterMap());
|
||||||
|
}
|
||||||
|
|
||||||
|
void setResponse(Response rsp) {
|
||||||
status = rsp.getStatus();
|
status = rsp.getStatus();
|
||||||
responseHeaders = cloneHeaders(rsp);
|
responseHeaders = cloneHeaders(rsp);
|
||||||
}
|
}
|
||||||
|
@ -141,7 +143,7 @@ public int getStatus() {
|
||||||
* @return first value of the response header; null if not sent.
|
* @return first value of the response header; null if not sent.
|
||||||
*/
|
*/
|
||||||
public String getResponseHeader(String name) {
|
public String getResponseHeader(String name) {
|
||||||
return responseHeaders.get(name);
|
return responseHeaders != null ? responseHeaders.get(name) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/** {@inheritDoc} */
|
||||||
|
|
|
@ -87,19 +87,23 @@ public void handle(String target, Request baseRequest,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AccessEvent event = null;
|
||||||
|
if (DispatcherType.REQUEST
|
||||||
|
.equals(baseRequest.getDispatcherType())) {
|
||||||
|
event = new AccessEvent((Request) request);
|
||||||
|
synchronized (events) {
|
||||||
|
events.add(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
super.handle(target, baseRequest, request, response);
|
super.handle(target, baseRequest, request, response);
|
||||||
|
|
||||||
if (DispatcherType.REQUEST.equals(baseRequest.getDispatcherType()))
|
if (event != null) {
|
||||||
log((Request) request, (Response) response);
|
event.setResponse((Response) response);
|
||||||
|
}
|
||||||
|
|
||||||
} finally {
|
} finally {
|
||||||
active.release();
|
active.release();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void log(Request request, Response response) {
|
|
||||||
synchronized (events) {
|
|
||||||
events.add(new AccessEvent(request, response));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue