001: // Copyright (c) 2002 Per M.A. Bothner.
002: // This is free software; for terms and warranty disclaimer see ./COPYING.
003:
004: package gnu.kawa.servlet;
005:
006: import javax.servlet.*;
007: import javax.servlet.http.*;
008: import java.util.*;
009: import java.io.*;
010: import java.net.*;
011:
012: /** Wrapper class to allow a Servlet to be run as a CGI script.
013: * Invoked as:
014: * java CGI_ARGS... gnu.kawa.servlet.CGIServletWrapper SERVLET
015: * where CGI_ARGS... are properties set from CGI environment variables (for
016: * example -DPATH_INFO="foo") and SERVLET is the name of the servlet class.
017: * The cgi-wrapper program in ../../../bin can used do this.
018: */
019:
020: public class CGIServletWrapper extends ServletOutputStream implements
021: HttpServletRequest, HttpServletResponse, ServletConfig,
022: ServletContext {
023: byte buffer[] = null;
024: int bufpos = 0;
025: PrintStream out = System.out;
026: Vector headers = new Vector();
027: String sawContentType;
028: int statusCode = 0;
029: String statusString;
030: String servletName;
031:
032: public static void main(String[] args) {
033: try {
034: CGIServletWrapper wrapper = new CGIServletWrapper();
035: Class servClass = Class.forName(args[0]);
036: wrapper.servletName = args[0];
037: HttpServlet servlet = (HttpServlet) servClass.newInstance();
038: servlet.init(wrapper);
039: servlet.service(wrapper, wrapper);
040: wrapper.flushBuffer();
041: } catch (Throwable ex) {
042: ex.printStackTrace();
043: System.exit(-1);
044: }
045: }
046:
047: private static final int defaultBufferSize = 2048;
048:
049: private void allocateBuffer() {
050: if (buffer == null)
051: buffer = new byte[defaultBufferSize];
052: }
053:
054: public void write(int c) throws java.io.IOException {
055: allocateBuffer();
056: int bufsize = buffer.length;
057: if (buffer.length == 0) {
058: committ();
059: out.write(c);
060: } else {
061: if (bufpos >= buffer.length)
062: flushBuffer();
063: buffer[bufpos++] = (byte) c;
064: }
065: }
066:
067: public String getCgiEnvVar(String name) {
068: return System.getProperty(name);
069: }
070:
071: public ServletOutputStream getOutputStream() {
072: return this ;
073: }
074:
075: PrintWriter writer;
076:
077: public java.io.PrintWriter getWriter() {
078: if (writer == null)
079: writer = new PrintWriter(out);
080: return writer;
081: }
082:
083: public java.util.Map getParameterMap() {
084: return null; // FIXME
085: }
086:
087: public void setBufferSize(int size) {
088: if (bufpos > 0 || committed)
089: throw new IllegalStateException();
090: buffer = new byte[size];
091: }
092:
093: public int getBufferSize() {
094:
095: return buffer == null ? defaultBufferSize : buffer.length;
096: }
097:
098: public void setLocale(java.util.Locale locale) {
099: // FIXME
100: }
101:
102: private void committ() throws IOException {
103: if (!committed) {
104: printHeaders();
105: committed = true;
106: }
107: }
108:
109: public void flushBuffer() throws IOException {
110: committ();
111: if (bufpos > 0)
112: out.write(buffer, 0, bufpos);
113: bufpos = 0;
114: }
115:
116: public void resetBuffer() {
117: bufpos = 0;
118: }
119:
120: public void reset() {
121: // FIXME
122: resetBuffer();
123: }
124:
125: java.util.Hashtable attributes;
126:
127: public Object getAttribute(String name) {
128: return attributes == null ? null : attributes.get(name);
129: }
130:
131: public void setAttribute(String name, Object value) {
132: if (value == null)
133: removeAttribute(name);
134: else {
135: if (attributes == null)
136: attributes = new java.util.Hashtable();
137: attributes.put(name, value);
138: }
139: }
140:
141: public void removeAttribute(String name) {
142: if (attributes != null)
143: attributes.remove(name);
144: }
145:
146: public Enumeration getAttributeNames() {
147: return attributes.keys();
148: }
149:
150: public String getContentType() {
151: return getCgiEnvVar("CONTENT_TYPE");
152: }
153:
154: public String getPathInfo() {
155: return getCgiEnvVar("PATH_INFO");
156: }
157:
158: public String getPathTranslated() {
159: return getCgiEnvVar("PATH_TRANSLATED");
160: }
161:
162: public String getRequestURI() {
163: String script = getServletPath();
164: String path = getPathInfo();
165: if (script == null)
166: return path;
167: if (path == null)
168: return script;
169: return script + '/' + path;
170: }
171:
172: public StringBuffer getRequestURL() {
173: // Copied from Tomcat 4.0:
174:
175: StringBuffer url = new StringBuffer(100);
176: String scheme = getScheme();
177: int port = getServerPort();
178: if (port < 0)
179: port = 80; // Work around java.net.URL bug
180: url.append(scheme);
181: url.append("://");
182: url.append(getServerName());
183: if ((scheme.equals("http") && (port != 80))
184: || (scheme.equals("https") && (port != 443))) {
185: url.append(':');
186: url.append(port);
187: }
188: url.append('/');
189: url.append(getRequestURI());
190: return url;
191: }
192:
193: public String getProtocol() {
194: return getCgiEnvVar("SERVER_PROTOCOL");
195: }
196:
197: public int getServerPort() {
198: String port = getCgiEnvVar("SERVER_PORT");
199: if (port != null) {
200: try {
201: return Integer.parseInt(port);
202: } catch (Throwable ex) {
203: }
204: }
205: return -1;
206: }
207:
208: public int getLocalPort() {
209: return getServerPort(); // is this resonable?
210: }
211:
212: public String getLocalAddr() {
213: try {
214: return InetAddress.getByName(getLocalName())
215: .getHostAddress();
216: } catch (UnknownHostException ex) {
217: return "127.0.0.1";
218: }
219: }
220:
221: public String getLocalName() {
222: return getServerName(); // is this resonable?
223: }
224:
225: public int getRemotePort() {
226: return -1; // FIXME
227: }
228:
229: public boolean isSecure() {
230: return getServerPort() == 443; // FIXME
231: }
232:
233: public String getServerName() {
234: return getCgiEnvVar("SERVER_NAME");
235: }
236:
237: public String getMethod() {
238: String method = getCgiEnvVar("REQUEST_METHOD");
239: return method == null ? "GET" : method;
240: }
241:
242: boolean committed;
243: String characterEncoding;
244:
245: public boolean isCommitted() {
246: return committed;
247: }
248:
249: public String getCharacterEncoding() {
250: return characterEncoding;
251: }
252:
253: public void setCharacterEncoding(String enc) {
254: characterEncoding = enc;
255: }
256:
257: public void setContentType(String type) {
258: setHeader("Content-Type", type);
259: }
260:
261: public void setContentLength(int len) {
262: setIntHeader("Content-Length", len);
263: }
264:
265: public void addCookie(Cookie cookie) {
266: // FIXME
267: }
268:
269: public boolean containsHeader(String str) {
270: int num = headers.size();
271: for (int i = 0; i < num; i += 2)
272: if (headers.elementAt(i).equals(str))
273: return true;
274: return false;
275: }
276:
277: public String encodeURL(String str) {
278: return null; // FIXME
279: }
280:
281: public String encodeUrl(String str) {
282: return null; // FIXME
283: }
284:
285: public String encodeRedirectURL(String str) {
286: return null; // FIXME
287: }
288:
289: public String encodeRedirectUrl(String str) {
290: return null; // FIXME
291: }
292:
293: public void sendError(int i, String str) {
294: statusCode = i;
295: statusString = str;
296: }
297:
298: public void sendError(int i) {
299: statusCode = i;
300: statusString = null;
301: }
302:
303: public void sendRedirect(String str) {
304: // ignore FIXME
305: }
306:
307: private void printHeader(String label, String value) {
308: out.print(label);
309: out.print(": ");
310: out.println(value); // FIXME - need to quote?
311: }
312:
313: private void printHeaders() {
314: if (statusCode != 0) {
315: out.print("Status: ");
316: out.print(statusCode);
317: if (statusString != null) {
318: out.print(' ');
319: out.print(statusString);
320: }
321: out.println();
322: }
323: if (sawContentType == null)
324: setContentType("text/html"); // FIXME
325: int num = headers.size();
326: for (int i = 0; i < num; i += 2)
327: printHeader(headers.elementAt(i).toString(), headers
328: .elementAt(i + 1).toString());
329: // if (sawContentType == null) writeRaw("Content-Type: text/html"); FIXME
330: out.println();
331: }
332:
333: public void setDateHeader(String str, long l) {
334: // ignore FIXME
335: }
336:
337: public void addDateHeader(String str, long l) {
338: // ignore FIXME
339: }
340:
341: public void setHeader(String label, String value) {
342: int num = headers.size();
343: for (int i = 0; i < num; i += 2)
344: if (headers.elementAt(i).equals(label)) {
345: if (label.equalsIgnoreCase("Content-type"))
346: sawContentType = value;
347: headers.setElementAt(value, i + 1);
348: break;
349: }
350: addHeader(label, value);
351: }
352:
353: public void setIntHeader(String str, int i) {
354: setHeader(str, Integer.toString(i));
355: }
356:
357: public void addHeader(String label, String value) {
358: if (label.equalsIgnoreCase("Content-type"))
359: sawContentType = value;
360: headers.addElement(label);
361: headers.addElement(value);
362: }
363:
364: public void addIntHeader(String str, int i) {
365: addHeader(str, Integer.toString(i));
366: }
367:
368: public void setStatus(int i) {
369: statusCode = i;
370: statusString = null;
371: }
372:
373: public void setStatus(int i, String str) {
374: statusCode = i;
375: statusString = str;
376: }
377:
378: public String getScheme() {
379: return getServerPort() == 443 ? "https" : "http"; // FIXME
380: }
381:
382: public java.util.Enumeration getLocales() {
383: return null; // FIXME
384: }
385:
386: public String getRealPath(String path) {
387: return null; // FIXME
388: }
389:
390: public Locale getLocale() {
391: return null; // FIXME
392: }
393:
394: public RequestDispatcher getRequestDispatcher(String path) {
395: return null; // FIXME
396: }
397:
398: public String getRemoteAddr() {
399: return getCgiEnvVar("REMOTE_ADDR");
400: }
401:
402: public String getRemoteHost() {
403: String host = getCgiEnvVar("REMOTE_HOST");
404: return host != null ? host : getRemoteAddr();
405: }
406:
407: public java.io.BufferedReader getReader() {
408: return null; // FIXME
409: }
410:
411: public ServletInputStream getInputStream() {
412: return null; // FIXME
413: }
414:
415: public String getParameter(String name) {
416: return null; // FIXME
417: }
418:
419: public Enumeration getParameterNames() {
420: return null; // FIXME
421: }
422:
423: public String[] getParameterValues(String name) {
424: return null; // FIXME
425: }
426:
427: public int getContentLength() {
428: String length = getCgiEnvVar("CONTENT_LENGTH");
429: if (length != null) {
430: try {
431: return Integer.parseInt(length);
432: } catch (Throwable ex) {
433: }
434: }
435: return 0;
436: }
437:
438: public String getAuthType() {
439: return getCgiEnvVar("AUTH_TYPE");
440: }
441:
442: public long getDateHeader(String str) {
443: return -1; // FIXME
444: }
445:
446: public String getHeader(String str) {
447: return null; // FIXME
448: }
449:
450: public Enumeration getHeaders(String str) {
451: return null; // FIXME
452: }
453:
454: public boolean isRequestedSessionIdValid() {
455: return false; // FIXME
456: }
457:
458: public boolean isRequestedSessionIdFromCookie() {
459: return false; // FIXME
460: }
461:
462: public boolean isRequestedSessionIdFromURL() {
463: return false; // FIXME
464: }
465:
466: public boolean isRequestedSessionIdFromUrl() {
467: return false; // FIXME
468: }
469:
470: public String getRequestedSessionId() {
471: return null; // FIXME
472: }
473:
474: public String getServletPath() {
475: return getCgiEnvVar("SCRIPT_NAME");
476: }
477:
478: public HttpSession getSession(boolean b) {
479: return null; // FIXME
480: }
481:
482: public HttpSession getSession() {
483: return null; // FIXME
484: }
485:
486: public String getRemoteUser() {
487: return getCgiEnvVar("REMOTE_USER");
488: }
489:
490: public boolean isUserInRole(String role) {
491: return false; // FIXME
492: }
493:
494: public java.security.Principal getUserPrincipal() {
495: return null; // FIXME
496: }
497:
498: public String getContextPath() {
499: return ""; // FIXME
500: }
501:
502: public String getQueryString() {
503: return getCgiEnvVar("QUERY_STRING");
504: }
505:
506: public Enumeration getHeaderNames() {
507: return null; // FIXME
508: }
509:
510: public int getIntHeader(String str) {
511: return -1; // FIXME
512: }
513:
514: public javax.servlet.http.Cookie[] getCookies() {
515: return null; // FIXME
516: }
517:
518: // ServletConfig methods
519:
520: public String getInitParameter(String name) {
521: return null; // FIXME
522: }
523:
524: public Enumeration getInitParameterNames() {
525: return nullEnumeration;
526: }
527:
528: public ServletContext getServletContext() {
529: return this ;
530: }
531:
532: public String getServletName() {
533: return servletName;
534: }
535:
536: // ServletContext methods:
537:
538: public ServletContext getContext(String path) {
539: return null;
540: }
541:
542: public int getMajorVersion() {
543: return 2;
544: }
545:
546: public int getMinorVersion() {
547: return 3;
548: }
549:
550: public String getMimeType(String file) {
551: return null;
552: }
553:
554: public java.util.Set getResourcePaths(String path) {
555: return null;
556: }
557:
558: public java.net.URL getResource(String path) {
559: return null;
560: }
561:
562: public java.io.InputStream getResourceAsStream(String path) {
563: return null;
564: }
565:
566: public RequestDispatcher getNamedDispatcher(String path) {
567: return null;
568: }
569:
570: public Servlet getServlet(String name) {
571: return null;
572: }
573:
574: static final Enumeration nullEnumeration = new gnu.lists.SeqPosition(
575: gnu.lists.LList.Empty, 0, false);
576:
577: public Enumeration getServlets() {
578: return nullEnumeration;
579: }
580:
581: public Enumeration getServletNames() {
582: return nullEnumeration;
583: }
584:
585: public void log(String message) {
586: }
587:
588: public void log(Exception ex, String mgs) {
589: }
590:
591: public void log(String msg, Throwable ex) {
592: }
593:
594: public String getServerInfo() {
595: return "Kawa CGI/servlet wrapper";
596: }
597:
598: public java.lang.String getServletContextName() {
599: return null;
600: }
601: }
|