Search in sources :

Example 36 with MessageBytes

use of org.apache.tomcat.util.buf.MessageBytes in project tomcat by apache.

the class Http11Processor method isCompressable.

/**
     * Check if the resource could be compressed, if the client supports it.
     */
private boolean isCompressable() {
    // Check if content is not already gzipped
    MessageBytes contentEncodingMB = response.getMimeHeaders().getValue("Content-Encoding");
    if ((contentEncodingMB != null) && (contentEncodingMB.indexOf("gzip") != -1)) {
        return false;
    }
    // If force mode, always compress (test purposes only)
    if (protocol.getCompressionLevel() == 2) {
        return true;
    }
    // Check if sufficient length to trigger the compression
    long contentLength = response.getContentLengthLong();
    if ((contentLength == -1) || (contentLength > protocol.getCompressionMinSize())) {
        // Check for compatible MIME-TYPE
        String[] compressableMimeTypes = protocol.getCompressableMimeTypes();
        if (compressableMimeTypes != null) {
            return (startsWithStringArray(compressableMimeTypes, response.getContentType()));
        }
    }
    return false;
}
Also used : MessageBytes(org.apache.tomcat.util.buf.MessageBytes)

Example 37 with MessageBytes

use of org.apache.tomcat.util.buf.MessageBytes in project tomcat by apache.

the class Http11Processor method useCompression.

/**
     * Check if compression should be used for this resource. Already checked
     * that the resource could be compressed if the client supports it.
     */
private boolean useCompression() {
    // Check if browser support gzip encoding
    MessageBytes acceptEncodingMB = request.getMimeHeaders().getValue("accept-encoding");
    if ((acceptEncodingMB == null) || (acceptEncodingMB.indexOf("gzip") == -1)) {
        return false;
    }
    // If force mode, always compress (test purposes only)
    if (protocol.getCompressionLevel() == 2) {
        return true;
    }
    // Check for incompatible Browser
    Pattern noCompressionUserAgents = protocol.getNoCompressionUserAgentsPattern();
    if (noCompressionUserAgents != null) {
        MessageBytes userAgentValueMB = request.getMimeHeaders().getValue("user-agent");
        if (userAgentValueMB != null) {
            String userAgentValue = userAgentValueMB.toString();
            if (noCompressionUserAgents.matcher(userAgentValue).matches()) {
                return false;
            }
        }
    }
    return true;
}
Also used : Pattern(java.util.regex.Pattern) MessageBytes(org.apache.tomcat.util.buf.MessageBytes)

Example 38 with MessageBytes

use of org.apache.tomcat.util.buf.MessageBytes in project tomcat by apache.

the class ChunkedInputFilter method parseHeader.

private boolean parseHeader() throws IOException {
    MimeHeaders headers = request.getMimeHeaders();
    byte chr = 0;
    // Read new bytes if needed
    if (readChunk == null || readChunk.position() >= readChunk.limit()) {
        if (readBytes() < 0) {
            throwEOFException(sm.getString("chunkedInputFilter.eosTrailer"));
        }
    }
    // readBytes() above will set readChunk unless it returns a value < 0
    chr = readChunk.get(readChunk.position());
    // CRLF terminates the request
    if (chr == Constants.CR || chr == Constants.LF) {
        parseCRLF(false);
        return false;
    }
    // Mark the current buffer position
    int startPos = trailingHeaders.getEnd();
    //
    // Reading the header name
    // Header name is always US-ASCII
    //
    boolean colon = false;
    while (!colon) {
        // Read new bytes if needed
        if (readChunk == null || readChunk.position() >= readChunk.limit()) {
            if (readBytes() < 0) {
                throwEOFException(sm.getString("chunkedInputFilter.eosTrailer"));
            }
        }
        // readBytes() above will set readChunk unless it returns a value < 0
        chr = readChunk.get(readChunk.position());
        if ((chr >= Constants.A) && (chr <= Constants.Z)) {
            chr = (byte) (chr - Constants.LC_OFFSET);
        }
        if (chr == Constants.COLON) {
            colon = true;
        } else {
            trailingHeaders.append(chr);
        }
        readChunk.position(readChunk.position() + 1);
    }
    int colonPos = trailingHeaders.getEnd();
    //
    // Reading the header value (which can be spanned over multiple lines)
    //
    boolean eol = false;
    boolean validLine = true;
    int lastSignificantChar = 0;
    while (validLine) {
        boolean space = true;
        // Skipping spaces
        while (space) {
            // Read new bytes if needed
            if (readChunk == null || readChunk.position() >= readChunk.limit()) {
                if (readBytes() < 0) {
                    throwEOFException(sm.getString("chunkedInputFilter.eosTrailer"));
                }
            }
            chr = readChunk.get(readChunk.position());
            if ((chr == Constants.SP) || (chr == Constants.HT)) {
                readChunk.position(readChunk.position() + 1);
                // If we swallow whitespace, make sure it counts towards the
                // limit placed on trailing header size
                int newlimit = trailingHeaders.getLimit() - 1;
                if (trailingHeaders.getEnd() > newlimit) {
                    throwIOException(sm.getString("chunkedInputFilter.maxTrailer"));
                }
                trailingHeaders.setLimit(newlimit);
            } else {
                space = false;
            }
        }
        // Reading bytes until the end of the line
        while (!eol) {
            // Read new bytes if needed
            if (readChunk == null || readChunk.position() >= readChunk.limit()) {
                if (readBytes() < 0) {
                    throwEOFException(sm.getString("chunkedInputFilter.eosTrailer"));
                }
            }
            chr = readChunk.get(readChunk.position());
            if (chr == Constants.CR || chr == Constants.LF) {
                parseCRLF(true);
                eol = true;
            } else if (chr == Constants.SP) {
                trailingHeaders.append(chr);
            } else {
                trailingHeaders.append(chr);
                lastSignificantChar = trailingHeaders.getEnd();
            }
            if (!eol) {
                readChunk.position(readChunk.position() + 1);
            }
        }
        // Read new bytes if needed
        if (readChunk == null || readChunk.position() >= readChunk.limit()) {
            if (readBytes() < 0) {
                throwEOFException(sm.getString("chunkedInputFilter.eosTrailer"));
            }
        }
        chr = readChunk.get(readChunk.position());
        if ((chr != Constants.SP) && (chr != Constants.HT)) {
            validLine = false;
        } else {
            eol = false;
            // Copying one extra space in the buffer (since there must
            // be at least one space inserted between the lines)
            trailingHeaders.append(chr);
        }
    }
    String headerName = new String(trailingHeaders.getBytes(), startPos, colonPos - startPos, StandardCharsets.ISO_8859_1);
    if (allowedTrailerHeaders.contains(headerName.toLowerCase(Locale.ENGLISH))) {
        MessageBytes headerValue = headers.addValue(headerName);
        // Set the header value
        headerValue.setBytes(trailingHeaders.getBytes(), colonPos, lastSignificantChar - colonPos);
    }
    return true;
}
Also used : MimeHeaders(org.apache.tomcat.util.http.MimeHeaders) MessageBytes(org.apache.tomcat.util.buf.MessageBytes)

Example 39 with MessageBytes

use of org.apache.tomcat.util.buf.MessageBytes in project tomcat by apache.

the class TestCookies method test.

private void test(boolean useRfc6265, String header, Cookie... expected) {
    MimeHeaders mimeHeaders = new MimeHeaders();
    ServerCookies serverCookies = new ServerCookies(4);
    CookieProcessor cookieProcessor;
    if (useRfc6265) {
        cookieProcessor = new Rfc6265CookieProcessor();
    } else {
        cookieProcessor = new LegacyCookieProcessor();
    }
    MessageBytes cookieHeaderValue = mimeHeaders.addValue("Cookie");
    byte[] bytes = header.getBytes(StandardCharsets.UTF_8);
    cookieHeaderValue.setBytes(bytes, 0, bytes.length);
    cookieProcessor.parseCookieHeader(mimeHeaders, serverCookies);
    Assert.assertEquals(expected.length, serverCookies.getCookieCount());
    for (int i = 0; i < expected.length; i++) {
        Cookie cookie = expected[i];
        ServerCookie actual = serverCookies.getCookie(i);
        Assert.assertEquals(cookie.getVersion(), actual.getVersion());
        Assert.assertEquals(cookie.getName(), actual.getName().toString());
        actual.getValue().getByteChunk().setCharset(StandardCharsets.UTF_8);
        Assert.assertEquals(cookie.getValue(), org.apache.tomcat.util.http.parser.Cookie.unescapeCookieValueRfc2109(actual.getValue().toString()));
        if (cookie.getVersion() == 1) {
            Assert.assertEquals(cookie.getDomain(), actual.getDomain().toString());
            Assert.assertEquals(cookie.getPath(), actual.getPath().toString());
        }
    }
}
Also used : Cookie(javax.servlet.http.Cookie) MessageBytes(org.apache.tomcat.util.buf.MessageBytes)

Example 40 with MessageBytes

use of org.apache.tomcat.util.buf.MessageBytes in project tomcat by apache.

the class LegacyCookieProcessor method parseCookieHeader.

@Override
public void parseCookieHeader(MimeHeaders headers, ServerCookies serverCookies) {
    if (headers == null) {
        // nothing to process
        return;
    }
    // process each "cookie" header
    int pos = headers.findHeader("Cookie", 0);
    while (pos >= 0) {
        MessageBytes cookieValue = headers.getValue(pos);
        if (cookieValue != null && !cookieValue.isNull()) {
            if (cookieValue.getType() != MessageBytes.T_BYTES) {
                Exception e = new Exception();
                // TODO: Review this in light of HTTP/2
                log.debug("Cookies: Parsing cookie as String. Expected bytes.", e);
                cookieValue.toBytes();
            }
            if (log.isDebugEnabled()) {
                log.debug("Cookies: Parsing b[]: " + cookieValue.toString());
            }
            ByteChunk bc = cookieValue.getByteChunk();
            processCookieHeader(bc.getBytes(), bc.getOffset(), bc.getLength(), serverCookies);
        }
        // search from the next position
        pos = headers.findHeader("Cookie", ++pos);
    }
}
Also used : ByteChunk(org.apache.tomcat.util.buf.ByteChunk) MessageBytes(org.apache.tomcat.util.buf.MessageBytes)

Aggregations

MessageBytes (org.apache.tomcat.util.buf.MessageBytes)73 MimeHeaders (org.apache.tomcat.util.http.MimeHeaders)15 ByteChunk (org.apache.tomcat.util.buf.ByteChunk)14 IOException (java.io.IOException)11 Test (org.junit.Test)11 Context (org.apache.catalina.Context)10 LoggingBaseTest (org.apache.catalina.startup.LoggingBaseTest)8 Pattern (java.util.regex.Pattern)6 AbstractEndpoint (org.apache.tomcat.util.net.AbstractEndpoint)6 Principal (java.security.Principal)5 Wrapper (org.apache.catalina.Wrapper)5 CharChunk (org.apache.tomcat.util.buf.CharChunk)5 Host (org.apache.catalina.Host)4 ServletException (jakarta.servlet.ServletException)3 Cookie (jakarta.servlet.http.Cookie)3 UnsupportedEncodingException (java.io.UnsupportedEncodingException)3 HashSet (java.util.HashSet)3 ServletException (javax.servlet.ServletException)3 Cookie (javax.servlet.http.Cookie)3 Container (org.apache.catalina.Container)3