/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* Copyright (c) 2014, MPL CodeInside http://codeinside.ru
*/
package ru.codeinside.gws.p.router.web.wrap;
import ru.codeinside.gws.api.ServerLog;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
final public class HttpServletResponseLogger extends HttpServletResponseWrapper {
final ServerLog serverLog;
final HttpServletResponse response;
String statusMessage = "OK";
boolean hasHeaders;
int length = -1;
ServletOutputStream os;
PrintWriter pw;
public HttpServletResponseLogger(ServerLog serverLog, HttpServletResponse response) throws IOException {
super(response);
this.serverLog = serverLog;
this.response = response;
}
@Override
public void setStatus(int sc, String sm) {
statusMessage = sm;
super.setStatus(sc, sm);
}
@Override
public void sendError(int sc) throws IOException {
statusMessage = "Error" + sc;
super.sendError(sc);
logHeaders();
}
@Override
public void sendError(int sc, String msg) throws IOException {
statusMessage = msg;
super.sendError(sc, msg);
logHeaders();
}
@Override
public void setContentLength(int len) {
length = len;
super.setContentLength(len);
}
@Override
public ServletOutputStream getOutputStream() throws IOException {
if (os == null) {
logHeaders();
os = new ServletOutputStreamLogger(response.getOutputStream(), serverLog.getHttpOutStream());
}
return os;
}
@Override
public PrintWriter getWriter() throws IOException {
if (pw == null) {
pw = new PrintWriter(new OutputStreamWriter(getOutputStream(), response.getCharacterEncoding()), true);
}
return pw;
}
@Override
public void flushBuffer() throws IOException {
logHeaders();
if (pw != null) {
pw.flush();
}
if (os != null) {
os.flush();
}
}
private void logHeaders() {
if (!hasHeaders) {
hasHeaders = true;
PrintWriter pw = new PrintWriter(serverLog.getHttpOutStream(), true);
pw.print("HTTP/1.1 ");
pw.print(response.getStatus());
pw.print(" ");
pw.println(statusMessage);
String contentType = response.getContentType();
if (contentType != null) {
pw.println("Content-Type: " + contentType);
}
if (length >= 0) {
pw.println("Content-Length: " + length);
}
for (String header : response.getHeaderNames()) {
for (String value : response.getHeaders(header)) {
pw.println(header + ": " + value);
}
}
pw.println();
}
}
}