ResponseWrapper.java 5.58 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  javax.servlet.ServletOutputStream
 *  javax.servlet.http.HttpServletRequest
 *  javax.servlet.http.HttpServletResponse
 *  javax.servlet.http.HttpServletResponseWrapper
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.granite.httpcache.impl;

import com.adobe.granite.httpcache.api.CacheFile;
import com.adobe.granite.httpcache.api.Headers;
import com.adobe.granite.httpcache.impl.OuterCacheFilter;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

class ResponseWrapper
extends HttpServletResponseWrapper {
    private static Logger logger = LoggerFactory.getLogger(ResponseWrapper.class);
    private final HttpServletRequest request;
    private final OuterCacheFilter filter;
    private boolean cacheChecked;
    private CacheFile cacheFile;
    private final Headers headers = new Headers();
    private int status = 200;
    private String contentType;
    private String encoding;

    public ResponseWrapper(HttpServletRequest request, HttpServletResponse wrappedResponse, OuterCacheFilter filter) {
        super(wrappedResponse);
        this.request = request;
        this.filter = filter;
    }

    public CacheFile finish() {
        CacheFile cacheFile = this.cacheFile;
        if (cacheFile != null) {
            try {
                this.flushBuffer();
            }
            catch (IOException e) {
                cacheFile.discard();
                return null;
            }
        }
        return cacheFile;
    }

    public ServletOutputStream getOutputStream() throws IOException {
        ServletOutputStream sos = super.getOutputStream();
        CacheFile cacheFile = this.getCacheFile();
        return cacheFile != null ? cacheFile.getOutputStream(sos) : sos;
    }

    public PrintWriter getWriter() throws IOException {
        PrintWriter writer = super.getWriter();
        CacheFile cacheFile = this.getCacheFile();
        return cacheFile != null ? cacheFile.getWriter(writer, this.getCharacterEncoding()) : writer;
    }

    private CacheFile getCacheFile() {
        if (!this.cacheChecked) {
            if (this.contentType != null) {
                String contentType = this.contentType;
                if (this.encoding != null) {
                    contentType = ResponseWrapper.setMediaTypeParameter(contentType, "charset", this.encoding);
                }
                this.headers.setHeader("Content-Type", contentType);
            }
            this.cacheFile = this.filter.onFetch(this.request, this);
            this.cacheChecked = true;
        }
        return this.cacheFile;
    }

    public int getStatus() {
        return this.status;
    }

    public void setStatus(int sc) {
        this.status = sc;
        super.setStatus(sc);
    }

    public void setStatus(int sc, String sm) {
        this.status = sc;
        super.setStatus(sc, sm);
    }

    public void sendError(int sc) throws IOException {
        this.status = sc;
        super.sendError(sc);
    }

    public void sendError(int sc, String msg) throws IOException {
        this.status = sc;
        super.sendError(sc, msg);
    }

    public void sendRedirect(String location) throws IOException {
        this.status = 302;
        super.sendRedirect(location);
    }

    public Headers getHeaders() {
        return this.headers;
    }

    public void setContentType(String type) {
        this.contentType = type;
        super.setContentType(type);
    }

    public void setCharacterEncoding(String charset) {
        if (this.cacheFile == null && !this.isCommitted()) {
            this.encoding = charset;
        }
        super.setCharacterEncoding(charset);
    }

    static String setMediaTypeParameter(String type, String paramName, String paramValue) {
        int end;
        String pattern = paramName + "=";
        int index = type.indexOf(pattern);
        if (index == -1) {
            if (paramValue == null) {
                return type;
            }
            return String.format("%s;%s=%s", type, paramName, paramValue);
        }
        int start = type.lastIndexOf(59, index);
        if (start == -1) {
            start = 0;
        }
        if ((end = type.indexOf(59, index)) == -1) {
            end = type.length();
        }
        if (paramValue == null) {
            return String.format("%s%s", type.substring(0, start), type.substring(end));
        }
        return String.format("%s;%s=%s%s", type.substring(0, start), paramName, paramValue, type.substring(end));
    }

    public void setDateHeader(String name, long date) {
        this.headers.setHeader(name, date);
        super.setDateHeader(name, date);
    }

    public void setIntHeader(String name, int value) {
        this.headers.setHeader(name, value);
        super.setIntHeader(name, value);
    }

    public void setHeader(String name, String value) {
        this.headers.setHeader(name, value);
        super.setHeader(name, value);
    }

    public void addDateHeader(String name, long date) {
        this.headers.addHeader(name, date);
        super.addDateHeader(name, date);
    }

    public void addIntHeader(String name, int value) {
        this.headers.addHeader(name, value);
        super.addIntHeader(name, value);
    }

    public void addHeader(String name, String value) {
        this.headers.addHeader(name, value);
        super.addHeader(name, value);
    }
}