package org.webpieces.httpfrontend.api;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import org.webpieces.data.api.DataWrapper;
import org.webpieces.data.api.DataWrapperGenerator;
import org.webpieces.data.api.DataWrapperGeneratorFactory;
import org.webpieces.httpcommon.Responses;
import org.webpieces.httpcommon.api.RequestId;
import org.webpieces.httpcommon.api.ResponseSender;
import org.webpieces.httpparser.api.dto.HttpRequest;
import org.webpieces.httpparser.api.dto.HttpResponse;
class RequestListenerForTestWithResponses extends RequestListenerForTest {
private final boolean sendChunked;
private final DataWrapperGenerator dataGen = DataWrapperGeneratorFactory.createDataWrapperGenerator();
List<HttpResponse> responseList;
Map<RequestId, HttpRequest> requestMap = new HashMap<>();
RequestListenerForTestWithResponses(HttpResponse response, boolean sendChunked) {
this.sendChunked = sendChunked;
responseList = new ArrayList<>();
responseList.add(response);
}
RequestListenerForTestWithResponses(List<HttpResponse> responseList, boolean sendChunked) {
this.responseList = responseList;
this.sendChunked = sendChunked;
}
private void sendResponse(HttpResponse response, HttpRequest req, RequestId requestId, ResponseSender sender) {
if(!sendChunked) {
sender.sendResponse(response, req, requestId, true);
} else {
// Strip body from response, then send it using sendData.
HttpResponse newResponse = Responses.copyResponseExceptBody(response);
DataWrapper data = response.getBodyNonNull();
newResponse.setBody(dataGen.emptyWrapper());
sender.sendResponse(newResponse, req, requestId, false).thenAccept(responseId -> sender.sendData(data, responseId, true));
}
}
@Override
public void incomingRequest(HttpRequest req, RequestId requestId, boolean isComplete, ResponseSender sender) {
super.incomingRequest(req, requestId, isComplete, sender);
requestMap.put(requestId, req);
if(isComplete) {
for(HttpResponse response: responseList) {
sendResponse(response, req, requestId, sender);
}
}
}
@Override
public CompletableFuture<Void> incomingData(DataWrapper data, RequestId id, boolean isComplete, ResponseSender sender) {
return super.incomingData(data, id, isComplete, sender).thenAccept(v -> {
if(isComplete)
for(HttpResponse response: responseList) {
sendResponse(response, requestMap.get(id), id, sender);
}
});
}
}