/**
 * Licensed to Apereo under one or more contributor license
 * agreements. See the NOTICE file distributed with this work
 * for additional information regarding copyright ownership.
 * Apereo licenses this file to you 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 the following location:
 *
 *   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 org.apereo.inspektr.common.web;

import javax.servlet.http.HttpServletRequest;

/**
 * Captures information from the HttpServletRequest to log later.
 * 
 * @author Scott Battaglia
 * @version $Revision$ $Date$
 * @since 1.0
 *
 */
public class ClientInfo {

    public static ClientInfo EMPTY_CLIENT_INFO = new ClientInfo();

    /** IP Address of the server (local). */
    private final String serverIpAddress;

    /** IP Address of the client (Remote) */
    private final String clientIpAddress;

    private ClientInfo() {
        this((String) null, (String) null);
    }

    public ClientInfo(final HttpServletRequest request) {
        this(request.getLocalAddr(), request.getRemoteAddr());
    }

    public ClientInfo(final HttpServletRequest request, final String alternateLocalAddrHeaderName) {
        this(request.getLocalAddr(), 
                request.getHeader(alternateLocalAddrHeaderName) != null ? request.getHeader(alternateLocalAddrHeaderName) : request.getRemoteAddr());
    }

    public ClientInfo(final HttpServletRequest request, final String alternateServerAddrHeader, final String alternateLocalAddrHeaderName) {
        this(request.getHeader(alternateServerAddrHeader) != null ? request.getHeader(alternateServerAddrHeader) : request.getLocalAddr(), 
             request.getHeader(alternateLocalAddrHeaderName) != null ? request.getHeader(alternateLocalAddrHeaderName) : request.getRemoteAddr());
    }
    
    public ClientInfo(final String serverIpAddress, final String clientIpAddress) {
        this.serverIpAddress = serverIpAddress == null ? "unknown" : serverIpAddress;
        this.clientIpAddress = clientIpAddress == null ? "unknown" : clientIpAddress;
    }

    public String getServerIpAddress() {
        return this.serverIpAddress;
    }

    public String getClientIpAddress() {
        return this.clientIpAddress;
    }
}

@@ -879,16 +879,84 @@
 Request;
+%0Aimport java.net.Inet4Address;%0Aimport java.net.UnknownHostException;
 %0A%0A/**%0A *
@@ -1570,32 +1570,746 @@
 Addr());%0A    %7D%0A%0A
+    public ClientInfo(final HttpServletRequest request, final boolean useServerHostAddress) throws UnknownHostException %7B%0A        this(useServerHostAddress ? Inet4Address.getLocalHost().getHostAddress() : request.getLocalAddr(), request.getRemoteAddr());%0A    %7D%0A%0A    public ClientInfo(final HttpServletRequest request, final String alternateLocalAddrHeaderName, %0A                      final boolean useServerHostAddress) throws UnknownHostException %7B%0A        this(useServerHostAddress ? Inet4Address.getLocalHost().getHostAddress() : request.getLocalAddr(),%0A            request.getHeader(alternateLocalAddrHeaderName) != null ? request.getHeader(alternateLocalAddrHeaderName) : request.getRemoteAddr());%0A    %7D%0A    %0A
     public Clien
@@ -2423,35 +2423,32 @@
 etLocalAddr(), %0A
-   
              req

Add support for host address of server address