/** Parse host. */
  static void parseHost(
      final DataChunk hostDC, final DataChunk serverNameDC, final HttpRequestPacket request) {

    if (hostDC == null) {
      // HTTP/1.0
      // Default is what the socket tells us. Overriden if a host is
      // found/parsed
      request.setServerPort(request.getLocalPort());
      serverNameDC.setString(request.getLocalName());
      return;
    }

    final BufferChunk valueBC = hostDC.getBufferChunk();
    final int valueS = valueBC.getStart();
    final int valueL = valueBC.getEnd() - valueS;
    int colonPos = -1;

    final Buffer valueB = valueBC.getBuffer();
    final boolean ipv6 = (valueB.get(valueS) == '[');
    boolean bracketClosed = false;
    for (int i = 0; i < valueL; i++) {
      final byte b = valueB.get(i + valueS);
      if (b == ']') {
        bracketClosed = true;
      } else if (b == ':') {
        if (!ipv6 || bracketClosed) {
          colonPos = i;
          break;
        }
      }
    }

    if (colonPos < 0) {
      if (!request.isSecure()) {
        // 80 - Default HTTTP port
        request.setServerPort(80);
      } else {
        // 443 - Default HTTPS port
        request.setServerPort(443);
      }
      serverNameDC.setBuffer(valueB, valueS, valueS + valueL);
    } else {
      serverNameDC.setBuffer(valueB, valueS, valueS + colonPos);

      int port = 0;
      int mult = 1;
      for (int i = valueL - 1; i > colonPos; i--) {
        int charValue = DEC[(int) valueB.get(i + valueS)];
        if (charValue == -1) {
          // Invalid character
          throw new IllegalStateException(
              String.format(
                  "Host header %s contained a non-decimal value in the port definition.",
                  hostDC.toString()));
        }
        port = port + (charValue * mult);
        mult = 10 * mult;
      }
      request.setServerPort(port);
    }
  }