/*
* Copyright 2008-2017 by Emeric Vernat
*
* This file is part of Java Melody.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.bull.javamelody;
import java.io.IOException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.bull.javamelody.HtmlInjectorResponseStream.HtmlToInject;
/**
* Implémentation de FilterServletResponseWrapper qui fonctionne avec le HtmlInjectorResponseStream.
* @author Emeric Vernat
*/
class HtmlInjectorServletResponseWrapper extends FilterServletResponseWrapper {
private static final String INJECTOR_WRAPPED_REQUEST_KEY = "javamelody.injectorWrapped";
private final HtmlToInject htmlToInject;
/**
* Constructeur qui crée un adapteur de HttpServletResponse wrappant la response spécifiée.
* @param request HttpServletRequest
* @param response HttpServletResponse
* @param htmlToInject HtmlToInject
*/
HtmlInjectorServletResponseWrapper(HttpServletRequest request, HttpServletResponse response,
HtmlToInject htmlToInject) {
super(response);
assert request != null;
assert response != null;
assert htmlToInject != null;
this.htmlToInject = htmlToInject;
request.setAttribute(INJECTOR_WRAPPED_REQUEST_KEY, Boolean.TRUE);
}
static boolean acceptsRequest(HttpServletRequest request) {
// we need to inject only in html pages
// and we only accept wrapping once
// (against filtering of request and then of include/forward for the same request for example)
final String accept = request.getHeader("accept");
return accept != null && accept.contains("text/html")
&& request.getAttribute(INJECTOR_WRAPPED_REQUEST_KEY) == null;
}
/** {@inheritDoc} */
@Override
public ServletOutputStream createOutputStream() throws IOException {
if (!isContentTypeHtml()) {
return getHttpServletResponse().getOutputStream();
}
return new HtmlInjectorResponseStream(getHttpServletResponse(), htmlToInject);
}
/** {@inheritDoc} */
@Override
public void setContentType(String contentType) {
super.setContentType(contentType);
if (!isContentTypeHtml() && getStream() instanceof HtmlInjectorResponseStream) {
((HtmlInjectorResponseStream) getStream()).cancelInjection();
}
}
private boolean isContentTypeHtml() {
// if contentType is null we suppose that it is text/html like a browser would do
final String contentType = getContentType();
return contentType == null || contentType.contains("text/html");
}
}