Removed the props stuff from the request.
[jsvc.git] / src / dolda / jsvc / j2ee / J2eeRequest.java
1 package dolda.jsvc.j2ee;
2
3 import dolda.jsvc.*;
4 import dolda.jsvc.util.*;
5 import java.io.*;
6 import java.util.*;
7 import java.net.*;
8 import javax.servlet.*;
9 import javax.servlet.http.*;
10
11 public class J2eeRequest extends ResponseBuffer {
12     private ServletConfig cfg;
13     private HttpServletRequest req;
14     private HttpServletResponse resp;
15     private String method, path;
16     private URL url, context;
17     private MultiMap<String, String> params = null;
18     
19     public J2eeRequest(ServletConfig cfg, HttpServletRequest req, HttpServletResponse resp) {
20         this.cfg = cfg;
21         this.req = req;
22         this.resp = resp;
23         {
24             /* Ewwww, this is disgusting! */
25             String scheme = req.getScheme();
26             int port = -1;
27             String host = req.getHeader("Host");
28             if((host == null) || (host.length() < 1)) {
29                 host = req.getLocalAddr();
30                 port = req.getLocalPort();
31                 if((port == 80) && scheme.equals("http"))
32                     port = -1;
33                 else if((port == 443) && scheme.equals("https"))
34                     port = -1;
35             } else {
36                 int p;
37                 if((host.charAt(0) == '[') && ((p = host.indexOf(']', 1)) > 1)) {
38                     String newhost = host.substring(1, p);
39                     if((p = host.indexOf(':', p + 1)) >= 0) {
40                         try {
41                             port = Integer.parseInt(host.substring(p + 1));
42                         } catch(NumberFormatException e) {}
43                     }
44                     host = newhost;
45                 } else if((p = host.indexOf(':')) >= 0) {
46                     try {
47                         port = Integer.parseInt(host.substring(p + 1));
48                         host = host.substring(0, p);
49                     } catch(NumberFormatException e) {}
50                 }
51             }
52             String pi = req.getPathInfo();
53             if(pi == null)
54                 pi = "";
55             String q = req.getQueryString();
56             if(q != null)
57                 q = "?" + q;
58             else
59                 q = "";
60             try {
61                 url = new URL(scheme, host, port, req.getContextPath() + req.getServletPath() + pi + q);
62                 context = new URL(scheme, host, port, req.getContextPath());
63             } catch(MalformedURLException e) {
64                 throw(new Error(e));
65             }
66         }
67         method = req.getMethod().toUpperCase().intern();
68         path = req.getPathInfo();
69         while((path.length() > 0) && (path.charAt(0) == '/'))
70             path = path.substring(1);
71     }
72     
73     public SocketAddress remoteaddr() {
74         try {
75             /* Apparently getRemotePort returns -1 when running on Tomcat over AJP. */
76             int port = req.getRemotePort();
77             if(port < 0)
78                 port = 0;
79             return(new InetSocketAddress(InetAddress.getByName(req.getRemoteAddr()), port));
80         } catch(UnknownHostException e) {
81             /* req.getRemoteAddr should always be a valid IP address,
82              * so this should never happen. */
83             throw(new Error(e));
84         }
85     }
86     
87     public SocketAddress localaddr() {
88         try {
89             return(new InetSocketAddress(InetAddress.getByName(req.getLocalAddr()), req.getLocalPort()));
90         } catch(UnknownHostException e) {
91             /* req.getRemoteAddr should always be a valid IP address,
92              * so this should never happen. */
93             throw(new Error(e));
94         }
95     }
96     
97     public URL url() {
98         return(url);
99     }
100     
101     public URL rooturl() {
102         return(context);
103     }
104     
105     public ServerContext ctx() {
106         return(ThreadContext.current().server());
107     }
108     
109     public String method() {
110         return(method);
111     }
112     
113     public String path() {
114         return(path);
115     }
116
117     public InputStream input() {
118         try {
119             return(req.getInputStream());
120         } catch(IOException e) {
121             /* It is not obvious why this would happen, so I'll wait
122              * until I know whatever might happen to try and implement
123              * meaningful behavior. */
124             throw(new RuntimeException(e));
125         }
126     }
127
128     public MultiMap<String, String> inheaders() {
129         MultiMap<String, String> h = new HeaderTreeMap();
130         Enumeration ki = req.getHeaderNames();
131         if(ki != null) {
132             while(ki.hasMoreElements()) {
133                 String k = (String)ki.nextElement();
134                 Enumeration vi = req.getHeaders(k);
135                 if(vi != null) {
136                     while(vi.hasMoreElements()) {
137                         String v = (String)vi.nextElement();
138                         h.add(k, v);
139                     }
140                 }
141             }
142         }
143         return(h);
144     }
145     
146     public MultiMap<String, String> params() {
147         if(params == null) {
148             params = Params.urlparams(this);
149             if(method == "POST") {
150                 MultiMap<String, String> pp = Params.postparams(this);
151                 if(pp != null)
152                     params.putAll(pp);
153             }
154         }
155         return(params);
156     }
157     
158     protected void backflush() {
159         resp.setStatus(respcode);
160         for(String key : outheaders().keySet()) {
161             boolean first = true;
162             for(String val : outheaders().values(key)) {
163                 if(first) {
164                     resp.setHeader(key, val);
165                     first = false;
166                 } else {
167                     resp.addHeader(key, val);
168                 }
169             }
170         }
171     }
172     
173     protected OutputStream realoutput() {
174         try {
175             return(resp.getOutputStream());
176         } catch(IOException e) {
177             /* It is not obvious why this would happen, so I'll wait
178              * until I know whatever might happen to try and implement
179              * meaningful behavior. */
180             throw(new RuntimeException(e));
181         }
182     }
183 }