/** 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); } }