Decode the Host header better when generating the URL of the request.
[jsvc.git] / src / dolda / jsvc / j2ee / J2eeRequest.java
index a5e7518..f394653 100644 (file)
@@ -20,16 +20,35 @@ public class J2eeRequest extends ResponseBuffer {
        this.cfg = cfg;
        this.req = req;
        this.resp = resp;
-       try {
-           req.setCharacterEncoding("UTF-8");
-           resp.setCharacterEncoding("UTF-8");
-       } catch(UnsupportedEncodingException e) {
-           throw(new AssertionError(e));
-       }
        {
+           /* 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 = "";
@@ -39,7 +58,7 @@ 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);
            } catch(MalformedURLException e) {
                throw(new Error(e));
            }
@@ -54,6 +73,30 @@ public class J2eeRequest extends ResponseBuffer {
        return(props);
     }
     
+    public ServerContext ctx() {
+       return(new J2eeContext(cfg, req, resp));
+    }
+    
+    public SocketAddress remoteaddr() {
+       try {
+           return(new InetSocketAddress(InetAddress.getByName(req.getRemoteAddr()), req.getRemotePort()));
+       } 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);
     }
@@ -100,6 +143,7 @@ public class J2eeRequest extends ResponseBuffer {
     }
     
     protected void backflush() {
+       resp.setStatus(respcode);
        for(String key : outheaders().keySet()) {
            boolean first = true;
            for(String val : outheaders().values(key)) {