Search in sources :

Example 6 with MimeHeaders

use of org.apache.tomcat.util.http.MimeHeaders in project tomcat by apache.

the class TestHttp2Limits method populateHeadersPayload.

private void populateHeadersPayload(ByteBuffer headersPayload, List<String[]> customHeaders, String path) throws Exception {
    MimeHeaders headers = new MimeHeaders();
    headers.addValue(":method").setString("GET");
    headers.addValue(":path").setString(path);
    headers.addValue(":authority").setString("localhost:" + getPort());
    for (String[] customHeader : customHeaders) {
        headers.addValue(customHeader[0]).setString(customHeader[1]);
    }
    State state = hpackEncoder.encode(headers, headersPayload);
    if (state != State.COMPLETE) {
        throw new Exception("Unable to build headers");
    }
    headersPayload.flip();
    log.debug("Headers payload generated of size [" + headersPayload.limit() + "]");
}
Also used : MimeHeaders(org.apache.tomcat.util.http.MimeHeaders) State(org.apache.coyote.http2.HpackEncoder.State) IOException(java.io.IOException)

Example 7 with MimeHeaders

use of org.apache.tomcat.util.http.MimeHeaders in project tomcat by apache.

the class Response method getHeaderNames.

@Override
public Collection<String> getHeaderNames() {
    MimeHeaders headers = getCoyoteResponse().getMimeHeaders();
    int n = headers.size();
    List<String> result = new ArrayList<>(n);
    for (int i = 0; i < n; i++) {
        result.add(headers.getName(i).toString());
    }
    return result;
}
Also used : MimeHeaders(org.apache.tomcat.util.http.MimeHeaders) ArrayList(java.util.ArrayList)

Example 8 with MimeHeaders

use of org.apache.tomcat.util.http.MimeHeaders in project tomcat by apache.

the class Response method addSessionCookieInternal.

/**
     * Special method for adding a session cookie as we should be overriding
     * any previous.
     *
     * @param cookie The new session cookie to add the response
     */
public void addSessionCookieInternal(final Cookie cookie) {
    if (isCommitted()) {
        return;
    }
    String name = cookie.getName();
    final String headername = "Set-Cookie";
    final String startsWith = name + "=";
    String header = generateCookieString(cookie);
    boolean set = false;
    MimeHeaders headers = getCoyoteResponse().getMimeHeaders();
    int n = headers.size();
    for (int i = 0; i < n; i++) {
        if (headers.getName(i).toString().equals(headername)) {
            if (headers.getValue(i).toString().startsWith(startsWith)) {
                headers.getValue(i).setString(header);
                set = true;
            }
        }
    }
    if (!set) {
        addHeader(headername, header);
    }
}
Also used : MimeHeaders(org.apache.tomcat.util.http.MimeHeaders)

Example 9 with MimeHeaders

use of org.apache.tomcat.util.http.MimeHeaders in project tomcat by apache.

the class RemoteIpValve method invoke.

/**
     * {@inheritDoc}
     */
@Override
public void invoke(Request request, Response response) throws IOException, ServletException {
    final String originalRemoteAddr = request.getRemoteAddr();
    final String originalRemoteHost = request.getRemoteHost();
    final String originalScheme = request.getScheme();
    final boolean originalSecure = request.isSecure();
    final int originalServerPort = request.getServerPort();
    final String originalProxiesHeader = request.getHeader(proxiesHeader);
    final String originalRemoteIpHeader = request.getHeader(remoteIpHeader);
    if (internalProxies != null && internalProxies.matcher(originalRemoteAddr).matches()) {
        String remoteIp = null;
        // In java 6, proxiesHeaderValue should be declared as a java.util.Deque
        LinkedList<String> proxiesHeaderValue = new LinkedList<>();
        StringBuilder concatRemoteIpHeaderValue = new StringBuilder();
        for (Enumeration<String> e = request.getHeaders(remoteIpHeader); e.hasMoreElements(); ) {
            if (concatRemoteIpHeaderValue.length() > 0) {
                concatRemoteIpHeaderValue.append(", ");
            }
            concatRemoteIpHeaderValue.append(e.nextElement());
        }
        String[] remoteIpHeaderValue = commaDelimitedListToStringArray(concatRemoteIpHeaderValue.toString());
        int idx;
        // loop on remoteIpHeaderValue to find the first trusted remote ip and to build the proxies chain
        for (idx = remoteIpHeaderValue.length - 1; idx >= 0; idx--) {
            String currentRemoteIp = remoteIpHeaderValue[idx];
            remoteIp = currentRemoteIp;
            if (internalProxies.matcher(currentRemoteIp).matches()) {
            // do nothing, internalProxies IPs are not appended to the
            } else if (trustedProxies != null && trustedProxies.matcher(currentRemoteIp).matches()) {
                proxiesHeaderValue.addFirst(currentRemoteIp);
            } else {
                // decrement idx because break statement doesn't do it
                idx--;
                break;
            }
        }
        // continue to loop on remoteIpHeaderValue to build the new value of the remoteIpHeader
        LinkedList<String> newRemoteIpHeaderValue = new LinkedList<>();
        for (; idx >= 0; idx--) {
            String currentRemoteIp = remoteIpHeaderValue[idx];
            newRemoteIpHeaderValue.addFirst(currentRemoteIp);
        }
        if (remoteIp != null) {
            request.setRemoteAddr(remoteIp);
            request.setRemoteHost(remoteIp);
            // 6.0
            if (proxiesHeaderValue.size() == 0) {
                request.getCoyoteRequest().getMimeHeaders().removeHeader(proxiesHeader);
            } else {
                String commaDelimitedListOfProxies = listToCommaDelimitedString(proxiesHeaderValue);
                request.getCoyoteRequest().getMimeHeaders().setValue(proxiesHeader).setString(commaDelimitedListOfProxies);
            }
            if (newRemoteIpHeaderValue.size() == 0) {
                request.getCoyoteRequest().getMimeHeaders().removeHeader(remoteIpHeader);
            } else {
                String commaDelimitedRemoteIpHeaderValue = listToCommaDelimitedString(newRemoteIpHeaderValue);
                request.getCoyoteRequest().getMimeHeaders().setValue(remoteIpHeader).setString(commaDelimitedRemoteIpHeaderValue);
            }
        }
        if (protocolHeader != null) {
            String protocolHeaderValue = request.getHeader(protocolHeader);
            if (protocolHeaderValue == null) {
            // don't modify the secure,scheme and serverPort attributes
            // of the request
            } else if (protocolHeaderHttpsValue.equalsIgnoreCase(protocolHeaderValue)) {
                request.setSecure(true);
                // use request.coyoteRequest.scheme instead of request.setScheme() because request.setScheme() is no-op in Tomcat 6.0
                request.getCoyoteRequest().scheme().setString("https");
                setPorts(request, httpsServerPort);
            } else {
                request.setSecure(false);
                // use request.coyoteRequest.scheme instead of request.setScheme() because request.setScheme() is no-op in Tomcat 6.0
                request.getCoyoteRequest().scheme().setString("http");
                setPorts(request, httpServerPort);
            }
        }
        if (log.isDebugEnabled()) {
            log.debug("Incoming request " + request.getRequestURI() + " with originalRemoteAddr '" + originalRemoteAddr + "', originalRemoteHost='" + originalRemoteHost + "', originalSecure='" + originalSecure + "', originalScheme='" + originalScheme + "' will be seen as newRemoteAddr='" + request.getRemoteAddr() + "', newRemoteHost='" + request.getRemoteHost() + "', newScheme='" + request.getScheme() + "', newSecure='" + request.isSecure() + "'");
        }
    } else {
        if (log.isDebugEnabled()) {
            log.debug("Skip RemoteIpValve for request " + request.getRequestURI() + " with originalRemoteAddr '" + request.getRemoteAddr() + "'");
        }
    }
    if (requestAttributesEnabled) {
        request.setAttribute(AccessLog.REMOTE_ADDR_ATTRIBUTE, request.getRemoteAddr());
        request.setAttribute(Globals.REMOTE_ADDR_ATTRIBUTE, request.getRemoteAddr());
        request.setAttribute(AccessLog.REMOTE_HOST_ATTRIBUTE, request.getRemoteHost());
        request.setAttribute(AccessLog.PROTOCOL_ATTRIBUTE, request.getProtocol());
        request.setAttribute(AccessLog.SERVER_PORT_ATTRIBUTE, Integer.valueOf(request.getServerPort()));
    }
    try {
        getNext().invoke(request, response);
    } finally {
        request.setRemoteAddr(originalRemoteAddr);
        request.setRemoteHost(originalRemoteHost);
        request.setSecure(originalSecure);
        MimeHeaders headers = request.getCoyoteRequest().getMimeHeaders();
        // use request.coyoteRequest.scheme instead of request.setScheme() because request.setScheme() is no-op in Tomcat 6.0
        request.getCoyoteRequest().scheme().setString(originalScheme);
        request.setServerPort(originalServerPort);
        if (originalProxiesHeader == null || originalProxiesHeader.length() == 0) {
            headers.removeHeader(proxiesHeader);
        } else {
            headers.setValue(proxiesHeader).setString(originalProxiesHeader);
        }
        if (originalRemoteIpHeader == null || originalRemoteIpHeader.length() == 0) {
            headers.removeHeader(remoteIpHeader);
        } else {
            headers.setValue(remoteIpHeader).setString(originalRemoteIpHeader);
        }
    }
}
Also used : MimeHeaders(org.apache.tomcat.util.http.MimeHeaders) LinkedList(java.util.LinkedList)

Example 10 with MimeHeaders

use of org.apache.tomcat.util.http.MimeHeaders in project tomcat by apache.

the class AjpProcessor method prepareResponse.

/**
     * When committing the response, we have to validate the set of headers, as
     * well as setup the response filters.
     */
@Override
protected final void prepareResponse() throws IOException {
    response.setCommitted(true);
    tmpMB.recycle();
    responseMsgPos = -1;
    responseMessage.reset();
    responseMessage.appendByte(Constants.JK_AJP13_SEND_HEADERS);
    // Responses with certain status codes are not permitted to include a
    // response body.
    int statusCode = response.getStatus();
    if (statusCode < 200 || statusCode == 204 || statusCode == 205 || statusCode == 304) {
        // No entity body
        swallowResponse = true;
    }
    // Responses to HEAD requests are not permitted to include a response
    // body.
    MessageBytes methodMB = request.method();
    if (methodMB.equals("HEAD")) {
        // No entity body
        swallowResponse = true;
    }
    // HTTP header contents
    responseMessage.appendInt(statusCode);
    // Reason phrase is optional but mod_jk + httpd 2.x fails with a null
    // reason phrase - bug 45026
    tmpMB.setString(Integer.toString(response.getStatus()));
    responseMessage.appendBytes(tmpMB);
    // Special headers
    MimeHeaders headers = response.getMimeHeaders();
    String contentType = response.getContentType();
    if (contentType != null) {
        headers.setValue("Content-Type").setString(contentType);
    }
    String contentLanguage = response.getContentLanguage();
    if (contentLanguage != null) {
        headers.setValue("Content-Language").setString(contentLanguage);
    }
    long contentLength = response.getContentLengthLong();
    if (contentLength >= 0) {
        headers.setValue("Content-Length").setLong(contentLength);
    }
    // Other headers
    int numHeaders = headers.size();
    responseMessage.appendInt(numHeaders);
    for (int i = 0; i < numHeaders; i++) {
        MessageBytes hN = headers.getName(i);
        int hC = Constants.getResponseAjpIndex(hN.toString());
        if (hC > 0) {
            responseMessage.appendInt(hC);
        } else {
            responseMessage.appendBytes(hN);
        }
        MessageBytes hV = headers.getValue(i);
        responseMessage.appendBytes(hV);
    }
    // Write to buffer
    responseMessage.end();
    socketWrapper.write(true, responseMessage.getBuffer(), 0, responseMessage.getLen());
    socketWrapper.flush(true);
}
Also used : MimeHeaders(org.apache.tomcat.util.http.MimeHeaders) MessageBytes(org.apache.tomcat.util.buf.MessageBytes)

Aggregations

MimeHeaders (org.apache.tomcat.util.http.MimeHeaders)18 MessageBytes (org.apache.tomcat.util.buf.MessageBytes)6 ByteBuffer (java.nio.ByteBuffer)3 ByteChunk (org.apache.tomcat.util.buf.ByteChunk)3 Test (org.junit.Test)2 IOException (java.io.IOException)1 InputStream (java.io.InputStream)1 ArrayList (java.util.ArrayList)1 LinkedList (java.util.LinkedList)1 Locale (java.util.Locale)1 Pattern (java.util.regex.Pattern)1 Cookie (javax.servlet.http.Cookie)1 BufferedInputFilter (org.apache.coyote.http11.filters.BufferedInputFilter)1 ChunkedInputFilter (org.apache.coyote.http11.filters.ChunkedInputFilter)1 ChunkedOutputFilter (org.apache.coyote.http11.filters.ChunkedOutputFilter)1 GzipOutputFilter (org.apache.coyote.http11.filters.GzipOutputFilter)1 IdentityInputFilter (org.apache.coyote.http11.filters.IdentityInputFilter)1 IdentityOutputFilter (org.apache.coyote.http11.filters.IdentityOutputFilter)1 SavedRequestInputFilter (org.apache.coyote.http11.filters.SavedRequestInputFilter)1 VoidInputFilter (org.apache.coyote.http11.filters.VoidInputFilter)1