On 05/06/2011 14:09, Rainer Jung wrote:
> 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.

I can't think of any good reason. Happy to limit that to the digits 0-9.

Mark



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

Reply via email to