@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);
  }