Work around Tomcat/AJP bug.
[jsvc.git] / src / dolda / jsvc / j2ee / J2eeRequest.java
index 1e7d789..6b1ba0b 100644 (file)
@@ -13,17 +13,43 @@ public class J2eeRequest extends ResponseBuffer {
     private HttpServletRequest req;
     private HttpServletResponse resp;
     private String method, path;
-    private URL url;
-    private Map<?, ?> props = new HashMap();
+    private URL url, context;
+    private MultiMap<String, String> params = null;
+    private Map<Object, Object> props = new HashMap<Object, Object>();
     
     public J2eeRequest(ServletConfig cfg, HttpServletRequest req, HttpServletResponse resp) {
        this.cfg = cfg;
        this.req = req;
        this.resp = resp;
        {
+           /* Ewwww, this is disgusting! */
+           String scheme = req.getScheme();
+           int port = -1;
            String host = req.getHeader("Host");
-           if((host == null) || (host.length() < 1))
+           if((host == null) || (host.length() < 1)) {
                host = req.getLocalAddr();
+               port = req.getLocalPort();
+               if((port == 80) && scheme.equals("http"))
+                   port = -1;
+               else if((port == 443) && scheme.equals("https"))
+                   port = -1;
+           } else {
+               int p;
+               if((host.charAt(0) == '[') && ((p = host.indexOf(']', 1)) > 1)) {
+                   String newhost = host.substring(1, p);
+                   if((p = host.indexOf(':', p + 1)) >= 0) {
+                       try {
+                           port = Integer.parseInt(host.substring(p + 1));
+                       } catch(NumberFormatException e) {}
+                   }
+                   host = newhost;
+               } else if((p = host.indexOf(':')) >= 0) {
+                   try {
+                       port = Integer.parseInt(host.substring(p + 1));
+                       host = host.substring(0, p);
+                   } catch(NumberFormatException e) {}
+               }
+           }
            String pi = req.getPathInfo();
            if(pi == null)
                pi = "";
@@ -33,7 +59,8 @@ public class J2eeRequest extends ResponseBuffer {
            else
                q = "";
            try {
-               url = new URL(req.getScheme(), host, req.getServerPort(), req.getContextPath() + req.getServletPath() + pi + q);
+               url = new URL(scheme, host, port, req.getContextPath() + req.getServletPath() + pi + q);
+               context = new URL(scheme, host, port, req.getContextPath());
            } catch(MalformedURLException e) {
                throw(new Error(e));
            }
@@ -44,18 +71,46 @@ public class J2eeRequest extends ResponseBuffer {
            path = path.substring(1);
     }
     
-    public Map<?, ?> props() {
+    public Map<Object, Object> props() {
        return(props);
     }
     
-    public ServerContext ctx() {
-       return(new J2eeContext(cfg, req, resp));
+    public SocketAddress remoteaddr() {
+       try {
+           /* Apparently getRemotePort returns -1 when running on Tomcat over AJP. */
+           int port = req.getRemotePort();
+           if(port < 0)
+               port = 0;
+           return(new InetSocketAddress(InetAddress.getByName(req.getRemoteAddr()), port));
+       } catch(UnknownHostException e) {
+           /* req.getRemoteAddr should always be a valid IP address,
+            * so this should never happen. */
+           throw(new Error(e));
+       }
+    }
+    
+    public SocketAddress localaddr() {
+       try {
+           return(new InetSocketAddress(InetAddress.getByName(req.getLocalAddr()), req.getLocalPort()));
+       } catch(UnknownHostException e) {
+           /* req.getRemoteAddr should always be a valid IP address,
+            * so this should never happen. */
+           throw(new Error(e));
+       }
     }
     
     public URL url() {
        return(url);
     }
     
+    public URL rooturl() {
+       return(context);
+    }
+    
+    public ServerContext ctx() {
+       return(ThreadContext.current().server());
+    }
+    
     public String method() {
        return(method);
     }
@@ -94,10 +149,19 @@ public class J2eeRequest extends ResponseBuffer {
     }
     
     public MultiMap<String, String> params() {
-       return(null);
+       if(params == null) {
+           params = Params.urlparams(this);
+           if(method == "POST") {
+               MultiMap<String, String> pp = Params.postparams(this);
+               if(pp != null)
+                   params.putAll(pp);
+           }
+       }
+       return(params);
     }
     
     protected void backflush() {
+       resp.setStatus(respcode);
        for(String key : outheaders().keySet()) {
            boolean first = true;
            for(String val : outheaders().values(key)) {