reintroduced StringUtil.regexpReplace
[mir.git] / source / mir / session / HTTPAdapters.java
index 83ed63d..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.Arrays;
-import java.util.List;
-import java.util.Vector;
+import mir.util.HTTPParsedRequest;
+import org.apache.commons.fileupload.FileItem;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
-
-import mir.util.HTTPParsedRequest;
-
-import org.apache.commons.fileupload.FileItem;
+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;
     }
 
     public String getHeader(String aHeaderName) {
+      if (aHeaderName.equals("ip"))
+        return request.getRemoteAddr();
+
+      if (aHeaderName.equals("hostname")) {
+        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();
+
+      Enumeration enumeration = request.getParameterNames();
+      while (enumeration.hasMoreElements()) {
+        String name = (String) enumeration.nextElement();
+        if (name.startsWith(aPrefix)) {
+          result.add(name);
+        }
+      }
+
+      return result;
+    }
 
     public List getUploadedFiles() {
-      return new Vector();
-    };
+      return Collections.EMPTY_LIST;
+    }
 
     public List getParameters(String aName) {
       return Arrays.asList(request.getParameterValues(aName));
-    };
+    }
 
     public HttpServletRequest getRequest() {
       return request;
@@ -71,25 +106,63 @@ 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")) {
+        // 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")) {
+        if (cachedHostName==null) {
+          try {
+            cachedHostName = InetAddress.getByName(getHeader("ip")).getHostName();
+          }
+          catch (UnknownHostException e) {
+            cachedHostName = request.getRequest().getRemoteAddr();
+          }
+        }
+
+        return cachedHostName;
+      }
+
       return request.getHeader(aHeaderName);
-    };
+    }
 
     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();
+
+      Iterator i = request.getParameterNames().iterator();
+
+      while (i.hasNext()) {
+        String name = (String) i.next();
+        if (name.startsWith(aPrefix)) {
+          result.add(name);
+        }
+      }
+      return result;
+    }
 
     public List getUploadedFiles() {
-      List result = new Vector();
+      List result = new ArrayList();
       List files = request.getFiles();
 
       for (int i=0; i<files.size(); i++) {
@@ -97,7 +170,7 @@ public class HTTPAdapters {
       }
 
       return result;
-    };
+    }
 
     public HttpServletRequest getRequest() {
       return request.getRequest();
@@ -119,10 +192,21 @@ public class HTTPAdapters {
     }
 
     public void setAttribute(String aName, Object aNewValue) {
-      if (aNewValue==null)
-        deleteAttribute(aName);
-      else
-        session.setAttribute(aName, aNewValue);
+      if (aName.equals("$httpsessiontimeout")) {
+        if (aNewValue instanceof Number) {
+          try {
+            session.setMaxInactiveInterval( ( (Number) aNewValue).intValue());
+          }
+          catch (Throwable t) {
+          }
+        }
+      }
+      else {
+        if (aNewValue == null)
+          deleteAttribute(aName);
+        else
+          session.setAttribute(aName, aNewValue);
+      }
     }
 
     public void terminate() {