org.artifactory.webapp.wicket.application.HeaderBufferingWebResponse.java Source code

Java tutorial

Introduction

Here is the source code for org.artifactory.webapp.wicket.application.HeaderBufferingWebResponse.java

Source

/*
 * Artifactory is a binaries repository manager.
 * Copyright (C) 2012 JFrog Ltd.
 *
 * Artifactory 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 3 of the License, or
 * (at your option) any later version.
 *
 * Artifactory 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 Artifactory.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.artifactory.webapp.wicket.application;

import org.apache.wicket.protocol.http.BufferedWebResponse;
import org.apache.wicket.protocol.http.IMetaDataBufferingWebResponse;
import org.apache.wicket.request.http.WebResponse;
import org.apache.wicket.util.lang.Args;
import org.apache.wicket.util.time.Time;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;

/**
 * PATCHED BY YOAVA, see RTFACT-4619 and RTFACT-4635
 * <p/>
 * Response that keeps headers in buffers but writes the content directly to the response.
 * <p/>
 * This is necessary to get {@link #reset()} working without removing the JSESSIONID cookie. When
 * {@link HttpServletResponse#reset()} is called it removes all cookies, including the JSESSIONID
 * cookie.
 * <p/>
 * Calling {@link #reset()} on this response only clears the buffered headers. If there is any
 * content written to response it throws {@link IllegalStateException}.
 *
 * @author Matej Knopp
 */
class HeaderBufferingWebResponse extends WebResponse implements IMetaDataBufferingWebResponse {
    private final WebResponse originalResponse;
    private final BufferedWebResponse bufferedResponse;

    public HeaderBufferingWebResponse(WebResponse originalResponse) {
        this.originalResponse = originalResponse;
        bufferedResponse = new BufferedWebResponse(originalResponse);
    }

    private boolean bufferedWritten = false;

    private void writeBuffered() {
        if (!bufferedWritten) {
            bufferedResponse.writeTo(originalResponse);
            bufferedWritten = true;
        }
    }

    private void checkHeader() {
        // patched by yoava, see RTFACT-4619
        //if (bufferedWritten) {
        //    throw new IllegalStateException("Header was already written to response!");
        //}
    }

    @Override
    public void addCookie(Cookie cookie) {
        checkHeader();
        bufferedResponse.addCookie(cookie);
    }

    @Override
    public void clearCookie(Cookie cookie) {
        checkHeader();
        bufferedResponse.clearCookie(cookie);
    }

    private boolean flushed = false;

    @Override
    public void flush() {
        if (!bufferedWritten) {
            bufferedResponse.writeTo(originalResponse);
            bufferedResponse.reset();
        }
        originalResponse.flush();
        flushed = true;
    }

    @Override
    public boolean isRedirect() {
        return bufferedResponse.isRedirect();
    }

    @Override
    public void sendError(int sc, String msg) {
        checkHeader();
        bufferedResponse.sendError(sc, msg);
    }

    @Override
    public void sendRedirect(String url) {
        checkHeader();
        bufferedResponse.sendRedirect(url);
    }

    @Override
    public void setContentLength(long length) {
        checkHeader();
        bufferedResponse.setContentLength(length);
    }

    @Override
    public void setContentType(String mimeType) {
        checkHeader();
        bufferedResponse.setContentType(mimeType);
    }

    @Override
    public void setDateHeader(String name, Time date) {
        Args.notNull(date, "date");
        checkHeader();
        bufferedResponse.setDateHeader(name, date);
    }

    @Override
    public void setHeader(String name, String value) {
        checkHeader();
        bufferedResponse.setHeader(name, value);
    }

    @Override
    public void addHeader(String name, String value) {
        checkHeader();
        bufferedResponse.addHeader(name, value);
    }

    @Override
    public void setStatus(int sc) {
        bufferedResponse.setStatus(sc);
    }

    @Override
    public String encodeURL(CharSequence url) {
        // patched by yoava, see RTFACT-4635
        final String encodedURL = originalResponse.encodeURL(url);
        if (!encodedURL.contains("/")) {
            return "./" + encodedURL;
        }
        return encodedURL;
    }

    @Override
    public String encodeRedirectURL(CharSequence url) {
        return originalResponse.encodeRedirectURL(url);
    }

    @Override
    public void write(CharSequence sequence) {
        writeBuffered();
        originalResponse.write(sequence);
    }

    @Override
    public void write(byte[] array) {
        writeBuffered();
        originalResponse.write(array);
    }

    @Override
    public void write(byte[] array, int offset, int length) {
        writeBuffered();
        originalResponse.write(array, offset, length);
    }

    @Override
    public void reset() {
        if (flushed) {
            throw new IllegalStateException("Response has already been flushed!");
        }
        bufferedResponse.reset();
        bufferedWritten = false;
    }

    @Override
    public void writeMetaData(WebResponse webResponse) {
        bufferedResponse.writeMetaData(webResponse);
    }

    @Override
    public Object getContainerResponse() {
        return originalResponse.getContainerResponse();
    }
}