コード例 #1
0
 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();
   }
 }