package org.webpieces.httpparser.impl; import java.util.ArrayList; import java.util.List; import org.webpieces.data.api.DataWrapper; import org.webpieces.httpparser.api.Memento; import org.webpieces.httpparser.api.ParsingState; import org.webpieces.httpparser.api.UnparsedState; import org.webpieces.httpparser.api.dto.HttpMessage; import org.webpieces.httpparser.api.dto.HttpPayload; public class MementoImpl implements Memento { //State held to keep parsing messages private List<Integer> leftOverMarkedPositions = new ArrayList<>(); private DataWrapper leftOverData; private int numBytesLeftToRead; //The parsed message that did not get the data for it's body just yet //This is only for the case where a message has a body private HttpPayload halfParsedMessage; //If the stream is expecting chunks of data private boolean inChunkParsingMode; //Return state for client to access private List<HttpPayload> parsedMessages = new ArrayList<>(); private int indexBytePointer; private boolean isHttp2; @Override public List<HttpPayload> getParsedMessages() { return parsedMessages; } public void addMessage(HttpPayload message) { this.parsedMessages.add(message); } public void setParsedMessages(List<HttpPayload> parsedMessages) { this.parsedMessages = parsedMessages; } @Override public DataWrapper getLeftOverData() { return leftOverData; } public void setLeftOverData(DataWrapper data) { this.leftOverData = data; } public void addDemarcation(int i) { leftOverMarkedPositions.add(i); } public List<Integer> getLeftOverMarkedPositions() { return leftOverMarkedPositions; } public void setLeftOverMarkedPositions(List<Integer> leftOverMarkedPositions) { this.leftOverMarkedPositions = leftOverMarkedPositions; } public int getNumBytesLeftToRead() { return numBytesLeftToRead; } public void setNumBytesLeftToRead(int length) { numBytesLeftToRead = length; } public void setHalfParsedMessage(HttpPayload message) { this.halfParsedMessage = message; } @Override public HttpPayload getHalfParsedMessage() { return halfParsedMessage; } public void setReadingHttpMessagePointer(int indexBytePointer) { this.indexBytePointer = indexBytePointer; } public int getReadingHttpMessagePointer() { return indexBytePointer; } public void setInChunkParsingMode(boolean inChunkParsingMode) { this.inChunkParsingMode = inChunkParsingMode; } public boolean isInChunkParsingMode() { return inChunkParsingMode; } @Override public UnparsedState getUnParsedState() { if(inChunkParsingMode) { return new UnparsedState(ParsingState.CHUNK, leftOverData.getReadableSize()); } else if(halfParsedMessage != null) { return new UnparsedState(ParsingState.BODY, leftOverData.getReadableSize()); } return new UnparsedState(ParsingState.HEADERS, leftOverData.getReadableSize()); } public boolean isHttp2() { return isHttp2; } public void setHttp2(boolean isHttp2) { this.isHttp2 = isHttp2; } }