/**
   * Add to or set a field. If the field is allowed to have multiple values, add will add multiple
   * headers of the same name.
   *
   * @param name the name of the field
   * @param value the value of the field.
   * @exception IllegalArgumentException If the name is a single valued field and already has a
   *     value.
   */
  public void add(Buffer name, Buffer value) throws IllegalArgumentException {
    if (value == null) throw new IllegalArgumentException("null value");

    if (!(name instanceof CachedBuffer)) name = HttpHeaders.CACHE.lookup(name);
    name = name.asImmutableBuffer();

    if (!(value instanceof CachedBuffer)
        && HttpHeaderValues.hasKnownValues(HttpHeaders.CACHE.getOrdinal(name)))
      value = HttpHeaderValues.CACHE.lookup(value);
    value = value.asImmutableBuffer();

    Field field = _names.get(name);
    Field last = null;
    while (field != null) {
      last = field;
      field = field._next;
    }

    // create the field
    field = new Field(name, value);
    _fields.add(field);

    // look for chain to add too
    if (last != null) last._next = field;
    else _names.put(name, field);
  }
  /**
   * Set a field.
   *
   * @param name the name of the field
   * @param list the List value of the field. If null the field is cleared.
   */
  public void put(String name, List<?> list) {
    if (list == null || list.size() == 0) {
      remove(name);
      return;
    }
    Buffer n = HttpHeaders.CACHE.lookup(name);

    Object v = list.get(0);
    if (v != null) put(n, HttpHeaderValues.CACHE.lookup(v.toString()));
    else remove(n);

    if (list.size() > 1) {
      java.util.Iterator<?> iter = list.iterator();
      iter.next();
      while (iter.hasNext()) {
        v = iter.next();
        if (v != null) put(n, HttpHeaderValues.CACHE.lookup(v.toString()));
      }
    }
  }
  /**
   * Set a field.
   *
   * @param name the name of the field
   * @param value the value of the field. If null the field is cleared.
   */
  public void put(Buffer name, Buffer value) {
    remove(name);
    if (value == null) return;

    if (!(name instanceof BufferCache.CachedBuffer)) name = HttpHeaders.CACHE.lookup(name);
    if (!(value instanceof CachedBuffer))
      value = HttpHeaderValues.CACHE.lookup(value).asImmutableBuffer();

    // new value;
    Field field = new Field(name, value);
    _fields.add(field);
    _names.put(name, field);
  }
 /* ------------------------------------------------------------ */
 public int getValueOrdinal() {
   return HttpHeaderValues.CACHE.getOrdinal(_value);
 }
 @Test
 public void testHttpHeaderValues() throws Exception {
   assertTrue(((CachedBuffer) HttpHeaderValues.CACHE.lookup("unknown value")).getOrdinal() < 0);
   assertTrue(((CachedBuffer) HttpHeaderValues.CACHE.lookup("close")).getOrdinal() >= 0);
 }