Hi Mark,

On 05.06.2011 12:06, ma...@apache.org wrote:
> Modified: 
> tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java
> URL: 
> http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java?rev=1132362&r1=1132361&r2=1132362&view=diff
> ==============================================================================
> --- tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java 
> (original)
> +++ tomcat/trunk/java/org/apache/coyote/http11/AbstractHttp11Processor.java 
> Sun Jun  5 10:06:49 2011
> @@ -41,6 +41,7 @@ import org.apache.juli.logging.Log;
>  import org.apache.tomcat.util.ExceptionUtils;
>  import org.apache.tomcat.util.buf.Ascii;
>  import org.apache.tomcat.util.buf.ByteChunk;
> +import org.apache.tomcat.util.buf.HexUtils;
>  import org.apache.tomcat.util.buf.MessageBytes;
>  import org.apache.tomcat.util.http.FastHttpDateFormat;
>  import org.apache.tomcat.util.http.MimeHeaders;
> @@ -967,6 +968,78 @@ public abstract class AbstractHttp11Proc
>  
>      abstract boolean prepareSendfile(OutputFilter[] outputFilters);
>      
> +    /**
> +     * Parse host.
> +     */
> +    protected void parseHost(MessageBytes valueMB) {
> +
> +        if (valueMB == null || valueMB.isNull()) {
> +            // HTTP/1.0
> +            // If no host header, use the port info from the endpoint
> +            // The host will be obtained lazily from the socket if required
> +            // using ActionCode#REQ_LOCAL_NAME_ATTRIBUTE
> +            request.setServerPort(endpoint.getPort());
> +            return;
> +        }
> +
> +        ByteChunk valueBC = valueMB.getByteChunk();
> +        byte[] valueB = valueBC.getBytes();
> +        int valueL = valueBC.getLength();
> +        int valueS = valueBC.getStart();
> +        int colonPos = -1;
> +        if (hostNameC.length < valueL) {
> +            hostNameC = new char[valueL];
> +        }
> +
> +        boolean ipv6 = (valueB[valueS] == '[');
> +        boolean bracketClosed = false;
> +        for (int i = 0; i < valueL; i++) {
> +            char b = (char) valueB[i + valueS];
> +            hostNameC[i] = b;
> +            if (b == ']') {
> +                bracketClosed = true;
> +            } else if (b == ':') {
> +                if (!ipv6 || bracketClosed) {
> +                    colonPos = i;
> +                    break;
> +                }
> +            }
> +        }
> +
> +        if (colonPos < 0) {
> +            if (!endpoint.isSSLEnabled()) {
> +                // 80 - Default HTTP port
> +                request.setServerPort(80);
> +            } else {
> +                // 443 - Default HTTPS port
> +                request.setServerPort(443);
> +            }
> +            request.serverName().setChars(hostNameC, 0, valueL);
> +        } else {
> +
> +            request.serverName().setChars(hostNameC, 0, colonPos);
> +
> +            int port = 0;
> +            int mult = 1;
> +            for (int i = valueL - 1; i > colonPos; i--) {
> +                int charValue = HexUtils.getDec(valueB[i + valueS]);

Any idea, why hex digits (including a-f, A-F) are allowed in port numbers?

I know you only moved that code, but it reminded me of an observation I
made long ago and forgot.

> +                if (charValue == -1) {
> +                    // Invalid character
> +                    error = true;
> +                    // 400 - Bad request
> +                    response.setStatus(400);
> +                    adapter.log(request, response, 0);
> +                    break;
> +                }
> +                port = port + (charValue * mult);
> +                mult = 10 * mult;
> +            }
> +            request.setServerPort(port);
> +
> +        }
> +
> +    }

Regards,

Rainer

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to