merged 1.1 branch into head
[mir.git] / source / mir / session / HTTPAdapters.java
index af01846..4b50f56 100755 (executable)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2001, 2002 The Mir-coders group
+ * Copyright (C) 2001-2006 The Mir-coders group
  *
  * This file is part of Mir.
  *
@@ -19,8 +19,6 @@
  *
  * In addition, as a special exception, The Mir-coders gives permission to link
  * the code of this program with  any library licensed under the Apache Software License,
- * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library
- * (or with modified versions of the above that use the same license as the above),
  * and distribute linked combinations including the two.  You must obey the
  * GNU General Public License in all respects for all of the code used other than
  * the above mentioned libraries.  If you modify this file, you may extend this
  */
 package mir.session;
 
-import java.util.*;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-
 import mir.util.HTTPParsedRequest;
 import org.apache.commons.fileupload.FileItem;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
+
 public class HTTPAdapters {
   public static class HTTPRequestAdapter implements Request {
     private HttpServletRequest request;
+    private String cachedHostName = null;
 
     public HTTPRequestAdapter(HttpServletRequest aRequest) {
       request = aRequest;
@@ -49,15 +55,27 @@ public class HTTPAdapters {
         return request.getRemoteAddr();
 
       if (aHeaderName.equals("hostname")) {
-        return request.getRemoteAddr();
+        if (aHeaderName.equals("hostname")) {
+          if (cachedHostName==null) {
+            try {
+              cachedHostName = InetAddress.getByName(request.getRemoteAddr()).getHostName();
+            }
+            catch (UnknownHostException e) {
+              cachedHostName = request.getRemoteAddr();
+            }
+          }
+
+          return cachedHostName;
+        }
+
       }
 
       return request.getHeader(aHeaderName);
-    };
+    }
 
     public String getParameter(String aName) {
       return request.getParameter(aName);
-    };
+    }
 
     public List getPrefixedParameterNames(String aPrefix) {
       List result = new ArrayList();
@@ -71,15 +89,15 @@ public class HTTPAdapters {
       }
 
       return result;
-    };
+    }
 
     public List getUploadedFiles() {
       return Collections.EMPTY_LIST;
-    };
+    }
 
     public List getParameters(String aName) {
       return Arrays.asList(request.getParameterValues(aName));
-    };
+    }
 
     public HttpServletRequest getRequest() {
       return request;
@@ -88,17 +106,34 @@ public class HTTPAdapters {
 
   public static class HTTPParsedRequestAdapter implements Request {
     private HTTPParsedRequest request;
+    private String cachedHostName = null;
 
     public HTTPParsedRequestAdapter(HTTPParsedRequest aRequest) {
       request = aRequest;
     }
 
     public String getHeader(String aHeaderName) {
-      if (aHeaderName.equals("ip"))
-        return request.getRequest().getRemoteAddr();
+      if (aHeaderName.equals("ip")) {
+        // transparent proxies propagate the originating ip in the x-forwarded-for
+        // header. So if it's there, we should use it.
+        Enumeration headers = request.getRequest().getHeaders("x-forwarded-for");
+        if (headers.hasMoreElements()) {
+          return (String) headers.nextElement();
+        }
+                               return request.getRequest().getRemoteAddr();
+      }
 
       if (aHeaderName.equals("hostname")) {
-        return request.getRequest().getRemoteAddr();
+        if (cachedHostName==null) {
+          try {
+            cachedHostName = InetAddress.getByName(getHeader("ip")).getHostName();
+          }
+          catch (UnknownHostException e) {
+            cachedHostName = request.getRequest().getRemoteAddr();
+          }
+        }
+
+        return cachedHostName;
       }
 
       return request.getHeader(aHeaderName);
@@ -106,11 +141,11 @@ public class HTTPAdapters {
 
     public String getParameter(String aName) {
       return request.getParameter(aName);
-    };
+    }
 
     public List getParameters(String aName) {
       return request.getParameterList(aName);
-    };
+    }
 
     public List getPrefixedParameterNames(String aPrefix) {
       List result = new ArrayList();
@@ -123,9 +158,8 @@ public class HTTPAdapters {
           result.add(name);
         }
       }
-
       return result;
-    };
+    }
 
     public List getUploadedFiles() {
       List result = new ArrayList();
@@ -136,7 +170,7 @@ public class HTTPAdapters {
       }
 
       return result;
-    };
+    }
 
     public HttpServletRequest getRequest() {
       return request.getRequest();