private HttpMessage parseHttpMessage(DataWrapper toBeParsed, List<Integer> markedPositions) { List<String> lines = new ArrayList<>(); //Add the last line.. markedPositions.add(toBeParsed.getReadableSize()); int offset = 0; for(Integer mark : markedPositions) { int len = mark - offset; String line = toBeParsed.createStringFrom(offset, len, iso8859_1); lines.add(line.trim()); offset = mark; } markedPositions.clear(); //buffer processed...release to be re-used now.. toBeParsed.releaseUnderlyingBuffers(pool); String firstLine = lines.get(0).trim(); if(firstLine.startsWith("HTTP/")) { return parseResponse(lines); } else { return parseRequest(lines); } }
public String getBodyAsString() { Charset charset = extractCharset(); //get charset from headers? DataWrapper body = getBody(); if(body == null) return null; return body.createStringFrom(0, body.getReadableSize(), charset); }
String chunkMetaStr = chunkMetaData.createStringFrom(0, chunkMetaData.getReadableSize(), iso8859_1); String hexSize = chunkMetaStr.trim(); if(chunkMetaStr.contains(";")) {
public void uncompressBodyAndAssertContainsString(String text) { Header header = getResponse().getHeaderLookupStruct().getHeader(KnownHeaderName.CONTENT_ENCODING); if(header == null) throw new IllegalStateException("Body is not compressed as no CONTENT_ENCODING header field exists"); else if(!"gzip".equals(header.getValue())) throw new IllegalStateException("Body has wrong compression type="+header.getValue()+" in CONTENT_ENCODING header field"); DataWrapper wrapper = getBody(); byte[] compressed = wrapper.createByteArray(); ByteArrayInputStream in = new ByteArrayInputStream(compressed); byte[] out = new byte[10000]; DataWrapper output = dataGen.emptyWrapper(); try (GZIPInputStream str = new GZIPInputStream(in)) { int read = 0; while((read = str.read(out)) > 0) { ByteBuffer buffer = ByteBuffer.wrap(out, 0, read); DataWrapper byteWrapper = dataGen.wrapByteBuffer(buffer); output = dataGen.chainDataWrappers(output, byteWrapper); out = new byte[10000]; } } catch(IOException e) { throw new RuntimeException(e); } Charset charset = extractCharset(); String bodyAsString = output.createStringFrom(0, output.getReadableSize(), charset); if(!bodyAsString.contains(text)) throw new IllegalStateException("Expected compressed body to contain='"+text+"' but body was="+bodyAsString); }
private void readInBody(MementoImpl memento, boolean stripAndCompareLastTwo) { HttpPayload message = memento.getHalfParsedMessage(); DataWrapper dataToRead = memento.getLeftOverData(); int readableSize = dataToRead.getReadableSize(); int numBytesNeeded = memento.getNumBytesLeftToRead(); if(numBytesNeeded <= readableSize) { List<? extends DataWrapper> split = dataGen.split(dataToRead, numBytesNeeded); DataWrapper data = split.get(0); if(stripAndCompareLastTwo) { List<? extends DataWrapper> splitPieces = dataGen.split(data, data.getReadableSize()-2); data = splitPieces.get(0); DataWrapper trailer = splitPieces.get(1); String trailerStr = trailer.createStringFrom(0, trailer.getReadableSize(), iso8859_1); if(!TRAILER_STR.equals(trailerStr)) throw new IllegalStateException("The chunk did not end with \\r\\n . The format is invalid"); } message.setBody(data); memento.setLeftOverData(split.get(1)); memento.setNumBytesLeftToRead(0); memento.getParsedMessages().add(message); //clear any cached message we were waiting for more data for memento.setHalfParsedMessage(null); return; } }