private void doParse(final StreamSourceChannel channel) throws IOException { int c = 0; final Pooled<ByteBuffer> pooled = exchange.getConnection().getBufferPool().allocate(); try { final ByteBuffer buffer = pooled.getResource(); do { buffer.clear(); c = channel.read(buffer); if (c > 0) { buffer.flip(); while (buffer.hasRemaining()) { byte n = buffer.get(); switch (state) { case 0: { if (n == '=') { name = builder.toString(); builder.setLength(0); state = 2; } else if (n == '&') { data.add(builder.toString(), ""); builder.setLength(0); state = 0; } else if (n == '%' || n == '+') { state = 1; builder.append((char) n); } else { builder.append((char) n); } break; } case 1: { if (n == '=') { name = URLDecoder.decode(builder.toString(), charset); builder.setLength(0); state = 2; } else if (n == '&') { data.add(URLDecoder.decode(builder.toString(), charset), ""); builder.setLength(0); state = 0; } else { builder.append((char) n); } break; } case 2: { if (n == '&') { data.add(name, builder.toString()); builder.setLength(0); state = 0; } else if (n == '%' || n == '+') { state = 3; builder.append((char) n); } else { builder.append((char) n); } break; } case 3: { if (n == '&') { data.add(name, URLDecoder.decode(builder.toString(), charset)); builder.setLength(0); state = 0; } else { builder.append((char) n); } break; } } } } } while (c > 0); if (c == -1) { if (state == 2) { data.add(name, builder.toString()); } else if (state == 3) { data.add(name, URLDecoder.decode(builder.toString(), charset)); } else if (builder.length() > 0) { if (state == 1) { data.add(URLDecoder.decode(builder.toString(), charset), ""); } else { data.add(builder.toString(), ""); } } state = 4; exchange.putAttachment(FORM_DATA, data); } } finally { pooled.free(); } }