/*
* Copyright 2012 Jason Miller
*
* 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 jj.http.server;
import io.netty.handler.codec.http.HttpHeaderNames;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.Map.Entry;
import org.slf4j.Logger;
import jj.logging.LoggedEvent;
import jj.util.DateFormatHelper;
/**
*
*
* @author jason
*
*/
@AccessLogger
class RequestResponded extends LoggedEvent {
private final HttpServerRequestImpl request;
private final HttpServerResponseImpl response;
RequestResponded(HttpServerRequestImpl request, HttpServerResponseImpl response) {
this.request = request;
this.response = response;
}
@Override
public void describeTo(Logger logger) {
logger.info(
"request for [{}] completed in {} milliseconds (wall time) (stats events!)",
request.uriMatch().uri,
request.wallTime()
);
if (logger.isInfoEnabled()) {
logger.info("{} - - {} \"{} {} {}\" {} {} {} {}",
extractIP(request.remoteAddress()),
DateFormatHelper.nowInAccessLogFormat(),
request.method(),
request.request().uri(),
request.request().protocolVersion(),
response.status().code(),
extractContentLength(),
extractReferer(request),
extractUserAgent(request)
);
}
if (logger.isTraceEnabled()) {
StringBuilder output = new StringBuilder("Request Headers:");
for (Entry<String, String> header : request.allHeaders()) {
output.append("\n").append(header.getKey()).append(" : ").append(header.getValue());
}
logger.trace("{}\n", output);
output = new StringBuilder("Response Headers:");
for (Entry<String, String> header : response.allHeaders()) {
output.append("\n").append(header.getKey()).append(" : ").append(header.getValue());
}
logger.trace("{}\n", output);
}
}
private String extractIP(final SocketAddress remoteAddress) {
return (remoteAddress instanceof InetSocketAddress) ?
((InetSocketAddress)remoteAddress).getAddress().getHostAddress() :
remoteAddress.toString();
}
private String extractReferer(final HttpServerRequest request) {
return request.hasHeader(HttpHeaderNames.REFERER) ?
"\"" + request.header(HttpHeaderNames.REFERER) + "\"" :
"-";
}
private String extractUserAgent(final HttpServerRequest request) {
return request.hasHeader(HttpHeaderNames.USER_AGENT) ?
"\"" + request.header(HttpHeaderNames.USER_AGENT) + "\"" :
"-";
}
private CharSequence extractContentLength() {
if (response.containsHeader(HttpHeaderNames.CONTENT_LENGTH)) {
return response.header(HttpHeaderNames.CONTENT_LENGTH);
}
return "0";
}
}