@Override public void onPrepareReception(PortReceiver receiver) throws BufferUnderflowException { request.clear(); response.clear(); do { if (state == STATE_BEGIN) { String line = receiver.getLine(Charset.defaultCharset()); String parts[] = line.split("\\s+"); if (parts.length != 3) { // Invalid request error("Invalid Request"); return; } else if (!request.validateMethod(parts[0])) { error("Unrecognized verb " + parts[0]); return; } else { request.setRequestURI(parts[1]); request.version = (parts[2]); state = receiver.markState(STATE_HEADER); } } if (state == STATE_HEADER) { String line = receiver.getLine(Charset.defaultCharset()); if (line.isEmpty()) { state = receiver.markState(STATE_BODY_VALIDATION); } else { int p = line.indexOf(':'); if (p > 0) { String name = line.substring(0, p).trim(); String value = line.substring(p + 1).trim(); request.processHeader(name, value); } } } if (state == STATE_BODY_VALIDATION) { if (request.contentLength >= 0) { receiver.setLimit(request.contentLength); } else if (request.isChunked) { int chunkLength = Integer.parseInt(receiver.getLine(Charset.defaultCharset()), 16); if (chunkLength == 0) { receiver.getLine(Charset.defaultCharset()); state = receiver.markState(STATE_BEGIN); } else { receiver.setLimit(chunkLength); } } state = receiver.markState(STATE_BODY); break; } } while (true); }