package org.webpieces.webserver.test;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import org.webpieces.data.api.DataWrapper;
import org.webpieces.httpcommon.api.Protocol;
import org.webpieces.httpcommon.api.RequestId;
import org.webpieces.httpcommon.api.ResponseId;
import org.webpieces.httpcommon.api.ResponseSender;
import org.webpieces.httpcommon.api.exceptions.HttpException;
import org.webpieces.httpparser.api.common.KnownHeaderName;
import org.webpieces.httpparser.api.dto.HttpChunk;
import org.webpieces.httpparser.api.dto.HttpLastChunk;
import org.webpieces.httpparser.api.dto.HttpRequest;
import org.webpieces.httpparser.api.dto.HttpResponse;
import org.webpieces.nio.api.channels.Channel;
import org.webpieces.util.logging.Logger;
import org.webpieces.util.logging.LoggerFactory;
import com.webpieces.http2parser.api.dto.lib.Http2Header;
public class MockResponseSender implements ResponseSender {
private static final Logger log = LoggerFactory.getLogger(MockResponseSender.class);
private List<FullResponse> payloads = new ArrayList<>();
private FullResponse chunkedResponse;
@Override
public Protocol getProtocol() {
return null;
}
@Override
public CompletableFuture<Void> close() {
return null;
}
@Override
public CompletableFuture<Void> sendData(DataWrapper data, ResponseId id, boolean isLastData) {
if(isLastData) {
log.info("last chunk");
HttpLastChunk chunk = new HttpLastChunk();
chunk.setBody(data);
chunkedResponse.setLastChunk(chunk);
payloads.add(chunkedResponse);
chunkedResponse = null;
} else {
HttpChunk chunk = new HttpChunk();
chunk.setBody(data);
chunkedResponse.addChunk(chunk);
}
return null;
}
@Override
public void sendTrailer(List<Http2Header> headerList, ResponseId id, boolean isComplete) {
throw new UnsupportedOperationException();
}
@Override
public CompletableFuture<Void> sendException(HttpException e) {
return null;
}
@Override
public synchronized CompletableFuture<ResponseId> sendResponse(HttpResponse response, HttpRequest request, RequestId requestId, boolean isComplete) {
if(chunkedResponse == null) {
FullResponse nextResp = new FullResponse(response);
if (response.getHeaderLookupStruct().getHeader(KnownHeaderName.CONTENT_LENGTH) != null) {
payloads.add(nextResp);
} else
chunkedResponse = nextResp;
}
else {
log.error("expecting sendData but got Response instead=" + response);
}
return CompletableFuture.completedFuture(new ResponseId(0));
}
@Override
public Channel getUnderlyingChannel() {
return null;
}
public List<FullResponse> getResponses() {
return payloads;
}
public void clear() {
payloads.clear();
chunkedResponse = null;
}
}