/* * This file is part of the OWASP Proxy, a free intercepting proxy library. * Copyright (C) 2008-2010 Rogan Dawes <rogan@dawes.za.net> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to: * The Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * */ package org.owasp.proxy.http.server; import org.owasp.proxy.http.BufferedRequest; import org.owasp.proxy.http.BufferedResponse; import org.owasp.proxy.http.MutableBufferedRequest; import org.owasp.proxy.http.MutableBufferedResponse; import org.owasp.proxy.http.MutableRequestHeader; import org.owasp.proxy.http.MutableResponseHeader; import org.owasp.proxy.http.RequestHeader; import org.owasp.proxy.http.ResponseHeader; public abstract class BufferedMessageInterceptor { /** * The Action enumeration is returned by the * {@link #directRequest(MutableRequestHeader)} and * {@link #directResponse(BufferedRequest, MutableResponseHeader)} methods, * and describes how the message content should be handled. * * {@value #BUFFER} indicates that the content should be buffered entirely * before being sent to the destination. * * {@value #STREAM} indicates that the content should be streamed directly * to the destination, and a copy of the content stored for processing once * the message has been completely streamed. * * {@value #IGNORE} indicates that the request or response is uninteresting, * and should not be buffered at all. No further methods in this interface * will be invoked for that request/response pair once {@value #IGNORE} has * been returned. * * @author rogan * */ public enum Action { BUFFER, STREAM, IGNORE }; /** * Called to determine what to do with the request. Implementations can * choose to buffer the request to allow for modification, stream the * request directly to the server while buffering the request for later * review, or ignore the request entirely. * * NOTE: if the request is ignored, neither * {@link #directResponse(BufferedRequest, MutableResponseHeader)} nor * {@link #responseContentSizeExceeded(BufferedRequest, ResponseHeader, int)} * will be called, as no BufferedRequest would be available. * * @param request * the request * @return the desired Action */ public Action directRequest(final MutableRequestHeader request) { return Action.STREAM; } /** * Called if the return value from * {@link #directRequest(MutableRequestHeader)} is BUFFER, once the request * has been completely buffered. The request may be modified within this * method. * * NOTE: This method will not be called if the message content is larger * than the maximum message body size set on the * {@link BufferingHttpRequestHandler}. * * See {@link #requestContentSizeExceeded(BufferedRequest, int)} * * @param request * the request */ public void processRequest(final MutableBufferedRequest request) { } /** * Called if the return value from * {@link #directRequest(MutableRequestHeader)} is BUFFER or STREAM, and the * request body is larger than the maximum message body specified. * * @param request * the request, containing max bytes of partial content * @param size * the ultimate size of the request content */ public void requestContentSizeExceeded(final BufferedRequest request, int size) { } /** * Called if the return value from * {@link #directRequest(MutableRequestHeader)} was STREAM, once the request * has been completely sent to the server, and buffered. This method will * not be called if the message content is larger than max bytes. * * See also {@link #requestContentSizeExceeded(BufferedRequest, int)} * * @param request * the request */ public void requestStreamed(final BufferedRequest request) { } /** * Called to determine what to do with the response. Implementations can * choose to buffer the response to allow for modification, stream the * response directly to the client, or ignore the response entirely. * * @param request * the request * @param response * the response * @return the desired Action */ public Action directResponse(final RequestHeader request, final MutableResponseHeader response) { return Action.STREAM; } /** * Called if the return value from * {@link #directResponse(MutableRequestHeader, MutableResponseHeader)} was * BUFFER, once the response has been completely buffered. The response may * be modified within this method, before being sent to the client. * * NOTE: This method will NOT be called if the Action returned by the * corresponding {@link #directRequest(MutableRequestHeader)} method was * Action.IGNORE, as no BufferedRequest would be available. * * NOTE: This method will not be called if the message content is larger * than max bytes. * * See * {@link #responseContentSizeExceeded(BufferedRequest, ResponseHeader, int)} * * @param request * the request * @param response * the response */ public void processResponse(final BufferedRequest request, final MutableBufferedResponse response) { } /** * Called if the return value from * {@link #directResponse(MutableRequestHeader, MutableResponseHeader)} is * BUFFER or STREAM, and the response body is larger than the maximum * message body specified * * @param request * the request * @param response * the response, containing max bytes of partial content * @param size * the eventual size of the response content */ public void responseContentSizeExceeded(final BufferedRequest request, final ResponseHeader response, int size) { } /** * Called if the return value from * {@link #directResponse(MutableRequestHeader, MutableResponseHeader)} was * STREAM, once the response has been completely sent to the client, and * buffered. This method will not be called if the message content is larger * than max bytes. * * See * {@link #responseContentSizeExceeded(BufferedRequest, ResponseHeader, int)} * * @param request * the request * @param response * the response */ public void responseStreamed(final BufferedRequest request, final BufferedResponse response) { } }