wCtx.init(indexStart, indexEnd, data, false); while (!wCtx.finished) { switch (currentState) {
void getReadyForBody(final WriteContext wCtx) { partBodyStreamStorage = partBodyStreamStorageFactory.newStreamStorageForPartBody(headers, partIndex); endOfLineBuffer.recycle(delimiterPrefixes.peek(), partBodyStreamStorage); delimiterType.reset(); goToState(State.READ_BODY); wCtx.setFinishedIfNoMoreData(); }
wCtx.init(indexStart, indexEnd, data, false); while (!wCtx.finished) { switch (currentState) {
void identifyDelimiter(final WriteContext wCtx, final State onDelimiter, final State onCloseDelimiter) { int byteOfData; while ((byteOfData = wCtx.read()) != -1) { delimiterType.addDelimiterByte((byte)byteOfData); if (delimiterType.index >= 2) { DelimiterType.Type type = delimiterType.getDelimiterType(); if (DelimiterType.Type.ENCAPSULATION == type) { goToState(onDelimiter); wCtx.setFinishedIfNoMoreData(); return; } else if (DelimiterType.Type.CLOSE == type) { goToState(onCloseDelimiter); // Need to continue because we encountered a close delimiter and we might not have more data coming // but we want to switch state and notify. wCtx.setNotFinished(); return; } else { goToState(State.ERROR); nioMultipartParserListener.onError("Unexpected characters follow a boundary", null); wCtx.setFinished(); return; } } } wCtx.setFinishedIfNoMoreData(); }
void identifyDelimiter(final WriteContext wCtx, final State onDelimiter, final State onCloseDelimiter) { int byteOfData; while ((byteOfData = wCtx.read()) != -1) { delimiterType.addDelimiterByte((byte)byteOfData); if (delimiterType.index >= 2) { DelimiterType.Type type = delimiterType.getDelimiterType(); if (DelimiterType.Type.ENCAPSULATION == type) { goToState(onDelimiter); wCtx.setFinishedIfNoMoreData(); return; } else if (DelimiterType.Type.CLOSE == type) { goToState(onCloseDelimiter); // Need to continue because we encountered a close delimiter and we might not have more data coming // but we want to switch state and notify. wCtx.setNotFinished(); return; } else { goToState(State.ERROR); nioMultipartParserListener.onError("Unexpected characters follow a boundary", null); wCtx.setFinished(); return; } } } wCtx.setFinishedIfNoMoreData(); }
void partComplete(final WriteContext wCtx){ // First flush the output stream and close it... try{ partBodyStreamStorage.flush(); partBodyStreamStorage.close(); }catch (Exception e){ goToState(State.ERROR); nioMultipartParserListener.onError("Unable to read/write the body data", e); return; } // Switch state if (delimiterType.getDelimiterType() == DelimiterType.Type.CLOSE){ if (delimiterPrefixes.size() > 1){ goToState(State.NESTED_PART_READ); }else { goToState(State.ALL_PARTS_READ); } }else { goToState(State.GET_READY_FOR_HEADERS); } nioMultipartParserListener.onPartFinished(partBodyStreamStorage, headers); partIndex++; wCtx.setFinishedIfNoMoreData(); }
void partComplete(final WriteContext wCtx){ // First flush the output stream and close it... try{ partBodyStreamStorage.flush(); partBodyStreamStorage.close(); }catch (Exception e){ goToState(State.ERROR); nioMultipartParserListener.onError("Unable to read/write the body data", e); return; } // Switch state if (delimiterType.getDelimiterType() == DelimiterType.Type.CLOSE){ if (delimiterPrefixes.size() > 1){ goToState(State.NESTED_PART_READ); }else { goToState(State.ALL_PARTS_READ); } }else { goToState(State.GET_READY_FOR_HEADERS); } nioMultipartParserListener.onPartFinished(partBodyStreamStorage, headers); partIndex++; wCtx.setFinishedIfNoMoreData(); }
void readHeaders(final WriteContext wCtx) { int byteOfData; while ((byteOfData = wCtx.read()) != -1) { if (endOfLineBuffer.write((byte)byteOfData)) { parseHeaders(); String contentType = MultipartUtils.getHeader(MultipartUtils.CONTENT_TYPE, headers); if (MultipartUtils.isMultipart(contentType)) { goToState(State.GET_READY_FOR_NESTED_MULTIPART); } else { goToState(State.GET_READY_FOR_BODY); } wCtx.setFinishedIfNoMoreData(); return; } } wCtx.setFinishedIfNoMoreData(); }
void skipEpilogue(final WriteContext wCtx){ wCtx.setFinished(); }
void readHeaders(final WriteContext wCtx) { int byteOfData; while ((byteOfData = wCtx.read()) != -1) { if (endOfLineBuffer.write((byte)byteOfData)) { parseHeaders(); String contentType = MultipartUtils.getHeader(MultipartUtils.CONTENT_TYPE, headers); if (MultipartUtils.isMultipart(contentType)) { goToState(State.GET_READY_FOR_NESTED_MULTIPART); } else { goToState(State.GET_READY_FOR_BODY); } wCtx.setFinishedIfNoMoreData(); return; } } wCtx.setFinishedIfNoMoreData(); }
void skipEpilogue(final WriteContext wCtx){ wCtx.setFinished(); }
void nestedPartRead(final WriteContext wCtx){ delimiterPrefixes.pop(); delimiterType.reset(); endOfLineBuffer.recycle(getPreambleDelimiterPrefix(delimiterPrefixes.peek()), null); goToState(State.SKIP_PREAMBLE); nioMultipartParserListener.onNestedPartFinished(); wCtx.setFinishedIfNoMoreData(); }
void allPartsRead(final WriteContext wCtx) { goToState(State.SKIP_EPILOGUE); nioMultipartParserListener.onAllPartsFinished(); wCtx.setFinishedIfNoMoreData(); }
void getReadyForHeaders(final WriteContext wCtx) { headersByteArrayOutputStream.reset(); endOfLineBuffer.recycle(HEADER_DELIMITER, headersByteArrayOutputStream); headers = new HashMap<String, List<String>>(); goToState(State.READ_HEADERS); wCtx.setFinishedIfNoMoreData(); }
void getReadyForNestedMultipart(final WriteContext wCtx) { if (delimiterPrefixes.size() > maxLevelOfNestedMultipart + 1) { goToState(State.ERROR); nioMultipartParserListener.onError("Reached maximum number of nested multiparts: " + maxLevelOfNestedMultipart, null); } else { byte[] delimiter = getDelimiterPrefix(MultipartUtils.getHeader(MultipartUtils.CONTENT_TYPE, headers)); delimiterType.reset(); delimiterPrefixes.push(delimiter); endOfLineBuffer.recycle(getPreambleDelimiterPrefix(delimiter), null); goToState(State.SKIP_PREAMBLE); nioMultipartParserListener.onNestedPartStarted(headers); } wCtx.setFinishedIfNoMoreData(); }
void readBody(final WriteContext wCtx) { int byteOfData; while ((byteOfData = wCtx.read()) != -1) { if (endOfLineBuffer.write((byte)byteOfData)) { goToState(State.IDENTIFY_BODY_DELIMITER); wCtx.setFinishedIfNoMoreData(); return; } } wCtx.setFinishedIfNoMoreData(); }
void nestedPartRead(final WriteContext wCtx){ delimiterPrefixes.pop(); delimiterType.reset(); endOfLineBuffer.recycle(getPreambleDelimiterPrefix(delimiterPrefixes.peek()), null); goToState(State.SKIP_PREAMBLE); nioMultipartParserListener.onNestedPartFinished(); wCtx.setFinishedIfNoMoreData(); }
void getReadyForHeaders(final WriteContext wCtx) { headersByteArrayOutputStream.reset(); endOfLineBuffer.recycle(HEADER_DELIMITER, headersByteArrayOutputStream); headers = new HashMap<String, List<String>>(); goToState(State.READ_HEADERS); wCtx.setFinishedIfNoMoreData(); }
void allPartsRead(final WriteContext wCtx) { goToState(State.SKIP_EPILOGUE); nioMultipartParserListener.onAllPartsFinished(); wCtx.setFinishedIfNoMoreData(); }
void getReadyForNestedMultipart(final WriteContext wCtx) { if (delimiterPrefixes.size() > maxLevelOfNestedMultipart + 1) { goToState(State.ERROR); nioMultipartParserListener.onError("Reached maximum number of nested multiparts: " + maxLevelOfNestedMultipart, null); } else { byte[] delimiter = getDelimiterPrefix(MultipartUtils.getHeader(MultipartUtils.CONTENT_TYPE, headers)); delimiterType.reset(); delimiterPrefixes.push(delimiter); endOfLineBuffer.recycle(getPreambleDelimiterPrefix(delimiter), null); goToState(State.SKIP_PREAMBLE); nioMultipartParserListener.onNestedPartStarted(headers); } wCtx.setFinishedIfNoMoreData(); }