home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1995 November / PCWK1195.iso / inne / win95 / sieciowe / hotja32.lzh / hotjava / classsrc / net / www / httpd / serverparameters.java < prev    next >
Text File  |  1995-08-11  |  12KB  |  453 lines

  1. /*
  2.  * @(#)ServerParameters.java    1.3 95/05/10
  3.  * 
  4.  * Copyright (c) 1995 Sun Microsystems, Inc.  All Rights reserved Permission to
  5.  * use, copy, modify, and distribute this software and its documentation for
  6.  * NON-COMMERCIAL purposes and without fee is hereby granted provided that
  7.  * this copyright notice appears in all copies. Please refer to the file
  8.  * copyright.html for further important copyright and licensing information.
  9.  * 
  10.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
  11.  * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  12.  * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
  13.  * OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
  14.  * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR
  15.  * ITS DERIVATIVES.
  16.  */
  17.  
  18. package net.www.httpd;
  19.  
  20.  
  21. import java.io.*;
  22. import java.util.*;
  23. import java.tools.jsc.ScriptContext;
  24. import java.tools.jsc.ScriptCommand;
  25.  
  26. /**
  27.  * A class to hold the parameters used by an http server
  28.  * @author  James Gosling
  29.  */
  30.  
  31. class ServerParameters {
  32.     ScriptContext psc;
  33.     String configFileName = "httpd.conf";
  34.     String logFile = null;
  35.     String exportDirectory;
  36.     String serverRoot;
  37.     String hostName;
  38.     String welcome;
  39.     String userDir;
  40.     String metaDir;
  41.     String metaSuffix;
  42.     String directory;
  43.     String serverType;
  44.     String user;
  45.     String group;
  46.     String serverAdmin;
  47.     String errorLog;
  48.     String accessLog;
  49.     String pidFile;
  50.     String serverName;
  51.  
  52.     String CacheRoot;
  53.     boolean Caching;
  54.     boolean CacheNoConnect;
  55.     boolean CacheExpiryCheck;
  56.     int CacheSize;
  57.     boolean Gc;
  58.  
  59.     Object failObject = "fail";
  60.     Object passObject = "pass";
  61.     Object redirectObject = "pass";
  62.     boolean directoryBrowsing;
  63.     boolean directoryReadme;
  64.     boolean verbose;
  65.     boolean identityCheck;
  66.     boolean alwaysWelcome;
  67.     int maxContentLengthBuffer;
  68.     int maxRamCacheEntryBuffer;
  69.     int port = -1;
  70.     RegexpPool mimeMap = new RegexpPool();
  71.     RegexpPool rules = new RegexpPool();
  72.  
  73.     void clerror(String s) {
  74.     System.out.print("Error in command line: " + s + "\n");
  75.     }
  76.  
  77.     ServerParameters (String nm, String argv[]) {
  78.     int sp = 0;
  79.     serverName = nm;
  80.     if (argv != null)
  81.         while (sp < argv.length) {
  82.         String arg = argv[sp];
  83.         if (arg != null)
  84.             if (arg.equals("-r") && sp + 1 < argv.length) {
  85.             configFileName = argv[sp + 1];
  86.             sp += 2;
  87.             } else if (arg.equals("-p") && sp + 1 < argv.length) {
  88.             try {
  89.                 port = Integer.parseInt(argv[sp + 1]);
  90.             }
  91.             catch(Exception e) {
  92.                 clerror(argv[sp + 1]);
  93.             };
  94.             sp += 2;
  95.             } else if (arg.equals("-v")) {
  96.             verbose = true;
  97.             sp++;
  98.             } else if (arg.equals("-dy")) {
  99.             directoryBrowsing = true;
  100.             sp++;
  101.             } else if (arg.equals("-dt")) {
  102.             directoryReadme = true;
  103.             sp++;
  104.             } else if (arg.startsWith("-"))
  105.             clerror(arg);
  106.             else if (exportDirectory == null)
  107.             exportDirectory = arg;
  108.             else
  109.             clerror(arg + " (only one directory spec allowed)");
  110.         }
  111.     config(configFileName);
  112.     if (exportDirectory != null)
  113.         rules.add("*", new mapName(exportDirectory + "/*", null));
  114.     }
  115.  
  116.     void addMime(String ext, String mtct) {
  117.     if (ext.indexOf('*') < 0)
  118.         ext = "*" + ext;
  119.     mimeMap.add(ext, mtct);
  120.     }
  121.     String find(String name, String df) {
  122.     Object o = psc.get(name);
  123.     if (o == null)
  124.         return df;
  125.     return o.toString();
  126.     }
  127.     int find(String name, int df) {
  128.     Object o = psc.get(name);
  129.     if (o == null)
  130.         return df;
  131.     if (o instanceof Number)
  132.         return ((Number) o).intValue();
  133.     System.out.print(o + ": the value for " + name + " must be a number\n");
  134.     return df;
  135.     }
  136.     boolean find(String name, boolean df) {
  137.     Object o = psc.get(name);
  138.     if (o == null)
  139.         return df;
  140.     return o.equals("true") || o.equals("on");
  141.     }
  142.     void config(String cnm) {
  143.     psc = new ScriptContext("net.www.httpd.cmd_");
  144.     ScriptCommand vararg = new VariableArg();
  145.     psc.defun("port", vararg);
  146.     psc.defun("serverroot", vararg);
  147.     psc.defun("hostname", vararg);
  148.     psc.defun("identitycheck", vararg);
  149. //    psc.defun("verbose", vararg);
  150.     psc.defun("welcome", vararg);
  151.     psc.defun("alwayswelcome", vararg);
  152.     psc.defun("userdir", vararg);
  153.     psc.defun("metadir", vararg);
  154.     psc.defun("metasuffix", vararg);
  155.     psc.defun("maxcontentlengthbuffer", vararg);
  156.     psc.defun("maxramcacheentrybuffer", vararg);
  157.     psc.defun("servertype", vararg);
  158.     psc.defun("user", vararg);
  159.     psc.defun("group", vararg);
  160.     psc.defun("serveradmin", vararg);
  161.     psc.defun("serverroot", vararg);
  162.     psc.defun("accesslog", vararg);
  163.     psc.defun("errorlog", vararg);
  164.     psc.defun("pidfile", vararg);
  165.     psc.defun("servername", vararg);
  166.  
  167.     psc.defun("cacheroot", vararg);
  168.     psc.defun("cachesize", vararg);
  169.     psc.defun("caching", vararg);
  170.     psc.defun("cachenoconnect", vararg);
  171.     psc.defun("cacheexpirycheck", vararg);
  172.     psc.defun("gc", vararg);
  173.  
  174.     ScriptCommand mimearg = new MimeArg();
  175.     psc.defun("addtype", mimearg);
  176.     psc.defun("suffix", mimearg);
  177.     ScriptCommand maparg = new MapArg();
  178.     psc.defun("fail", maparg);
  179.     psc.defun("map", maparg);
  180.     psc.defun("redirect", maparg);
  181.     psc.defun("pass", maparg);
  182.     psc.defun("exec", maparg);
  183.     psc.defun("plugin", maparg);
  184.     psc.put("ctx", this);
  185.     try {
  186.         psc.parseEval(new BufferedInputStream(new FileInputStream(cnm)));
  187.     } catch(Exception e) {
  188.         System.out.print("Couldn't read " + cnm + " (" + e + ")\n");
  189.         return;
  190.     }
  191.     verbose = psc.verbose;
  192.     if (port < 0)
  193.         port = find("port", 80);
  194.     if (directory == null)
  195.         directory = "/Public";
  196.  
  197.     CacheRoot = find("cacheroot", null);
  198.     CacheSize = find("cachesize", 0);
  199.     Caching = find("caching", CacheRoot != null);
  200.     CacheNoConnect = find("cachnoconnect", false);
  201.     CacheExpiryCheck = find("cacheexpirycheck", true);
  202.     if (CacheRoot == null || CacheRoot.length()<=0)
  203.         Caching = false;
  204.     Gc = find("gc", Caching);
  205.  
  206.     serverRoot = find("serverroot", "UNKNOWN");
  207.     hostName = find("hostname", "UNKNOWN");
  208.     identityCheck = find("identitycheck", false);
  209.     verbose = find("verbose", verbose);
  210.     welcome = find("welcome", "index.html");
  211.     alwaysWelcome = find("alwayswelcome", false);
  212.     userDir = find("userdir", "public_html");
  213.     metaDir = find("metadir", ".web");
  214.     metaSuffix = find("metasuffix", ".meta");
  215.     maxContentLengthBuffer = find("maxcontentlengthbuffer", 50000);
  216.     maxRamCacheEntryBuffer = find("maxramcacheentrybuffer", 8000);
  217.     serverType = find("servertype", "standalone");
  218.     user = find("user", "nobody");
  219.     group = find("group", "nogroup");
  220.     serverAdmin = find("serveradmin", "postmaster");
  221.     serverRoot = find("serverroot", "/opt/httpd");
  222.     accessLog = find("accesslog", "logs/access_log");
  223.     errorLog = find("errorlog", "logs/error_log");
  224.     pidFile = find("pidfile", "httpd-pid");
  225.     serverName = find("servername", "CafeJava 0.1");
  226.     }
  227.  
  228.     synchronized Object applyRules(String s) {
  229.     Object v;
  230.     rules.reset();
  231.     boolean pass = false;
  232.     if (s.length() > 1 && s.charAt(1) == '~') {
  233.         /* ~uname */
  234.         int sl = s.indexOf('/', 2);
  235.         String uname;
  236.         String tail;
  237.         if (sl < 0) {
  238.         uname = s.substring(2);
  239.         tail = "/";
  240.         } else {
  241.         uname = s.substring(2, sl);
  242.         tail = s.substring(sl);
  243.         }
  244.         s = "/home/" + uname + "/public_html" + tail;
  245.         pass = true;
  246.     }
  247.     while ((v = rules.matchNext(s)) != null) {
  248.         if (v == failObject) {
  249.         if (!pass)
  250.             return null;
  251.         } else if (v == passObject)
  252.         pass = true;
  253.         else if (v instanceof String) {
  254.         if (!pass)
  255.             s = (String) v;
  256.         } else {
  257.         if (v instanceof pass) {
  258.             pass p = (pass) v;
  259.             if (p.o == passObject) {
  260.             if (!pass)
  261.                 s = p.s;
  262.             pass = true;
  263.             continue;
  264.             } else if (p.o == null) {
  265.             if (!pass)
  266.                 s = p.s;
  267.             continue;
  268.             }
  269.         }
  270.         return v;
  271.         }
  272.     }
  273.     return s;
  274.     }
  275.  
  276.     public String mimeType(String fn) {
  277.     Object r = mimeMap.match(fn);
  278.     if (r == null || !(r instanceof String))
  279.         return "Unknown";
  280.     return (String) r;
  281.     }
  282.  
  283.     public String toString() {
  284.     return "configFileName=" + configFileName +
  285.         "\nlogFile=" + logFile +
  286.         "\nexportDirectory=" + exportDirectory +
  287.         "\nserverRoot=" + serverRoot +
  288.         "\nwelcome=" + welcome +
  289.         "\nuserDir=" + userDir +
  290.         "\nmetaDir=" + metaDir +
  291.         "\nmetaSuffix=" + metaSuffix +
  292.         "\nserverName=" + serverName +
  293.         "\ndirectory=" + directory +
  294.         "\ndirectoryBrowsing=" + directoryBrowsing +
  295.         "\ndirectoryReadme=" + directoryReadme +
  296.         "\nverbose=" + verbose +
  297.         "\nidentityCheck=" + identityCheck +
  298.         "\nalwaysWelcome=" + alwaysWelcome +
  299.         "\nmaxContentLengthBuffer=" + maxContentLengthBuffer +
  300.         "\nport=" + port + "\n";
  301.     }
  302.     public void print() {
  303.     System.out.print(toString());
  304.     System.out.print("Rules: ");
  305.     rules.print();
  306.     System.out.print("\n");
  307.     System.out.print("mimeMap: ");
  308.     mimeMap.print();
  309.     System.out.print("\n");
  310.     }
  311. }
  312.  
  313. class mapName implements RegexpTarget {
  314.     private String RE;
  315.     boolean nonre;
  316.     boolean head;
  317.     Object attached;
  318.     mapName (String s, Object a) {
  319.     attached = a;
  320.     if (s == null || s.length() == 0) {
  321.         RE = "";
  322.         nonre = true;
  323.     } else if (s.charAt(0) == '*') {
  324.         nonre = false;
  325.         head = true;
  326.         RE = s.substring(1);
  327.     } else if (s.charAt(s.length() - 1) == '*') {
  328.         nonre = false;
  329.         head = false;
  330.         RE = s.substring(0, s.length() - 1);
  331.     } else {
  332.         nonre = true;
  333.         RE = s;
  334.     }
  335.     }
  336.     public Object found(String wild) {
  337.     wild = (nonre ? RE
  338.         : (head ? wild + RE
  339.            : RE + wild));
  340.     return (attached != null
  341.         ? (Object) new pass(wild, attached)
  342.         : (Object) wild);
  343.     }
  344. }
  345.  
  346. class pass {
  347.     String s;
  348.     Object o;
  349.     pass (String S, Object O) {
  350.     s = S;
  351.     }
  352. }
  353.  
  354. class execName implements RegexpTarget {
  355.     private String prefix;
  356.     execName (String s) {
  357.     if (s == null || s.length() == 0 || s.charAt(s.length() - 1) != '*')
  358.         throw new Exception("exec scriptnames must end with *");
  359.     prefix = s.substring(0, s.length() - 1);
  360.     }
  361.     public Object found(String wild) {
  362.     int slash = wild.indexOf('/');
  363.     String path = null;
  364.     String pathInfo = null;
  365.     if (slash < 0)
  366.         path = prefix + wild;
  367.     else {
  368.         path = prefix + wild.substring(0, slash);
  369.         pathInfo = wild.substring(slash);
  370.     }
  371.     return new pass (path, pathInfo);
  372.     }
  373. }
  374.  
  375. class execPlugin implements RegexpTarget {
  376.     private Object args[];
  377.     Class who;
  378.     execPlugin (ScriptContext ctx) {
  379.     int nargs = ctx.nargs()-2;
  380.     if (nargs<0)
  381.         throw new Exception("Class name expected");
  382.     who = Class.forName(ctx.arg(1,"NoName"));
  383.     if (nargs>0) {
  384.         args = new Object[nargs];
  385.         for (int i = 0; i<nargs; i++)
  386.         args[i] = ctx.evarg(i+2);
  387.     }
  388.     ServerPlugin p;
  389.     try {
  390.         p = (ServerPlugin) who.newInstance();
  391.     } catch(Exception e) {
  392.         throw new Exception(who.getName() + " should be a subclass of net.www.httpd.ServerPlugin");
  393.     }
  394.     p.init(null, args);
  395.     String msg = p.validate();
  396.     if (msg != null)
  397.         throw new Exception(msg);
  398.     }
  399.     public Object found(String wild) {
  400.     ServerPlugin p = (ServerPlugin) who.newInstance();
  401.     p.init(wild, args);
  402.     return p;
  403.     }
  404. }
  405.  
  406. class MimeArg implements ScriptCommand {
  407.     public Object eval(ScriptContext ctx) {
  408.     ServerParameters sp = (ServerParameters) ctx.get("ctx");
  409.     sp.addMime(ctx.arg(0, ""), ctx.arg(1, "text/plain"));
  410.     return null;
  411.     }
  412. }
  413.  
  414. class MapArg implements ScriptCommand {
  415.     public Object eval(ScriptContext ctx) {
  416.     ServerParameters sp = (ServerParameters) ctx.get("ctx");
  417.     String cmd = ctx.command();
  418.     if (cmd.equalsIgnoreCase("fail"))
  419.         sp.rules.add(ctx.arg(0, ""), sp.failObject);
  420.     else if (cmd.equalsIgnoreCase("map"))
  421.         sp.rules.add(ctx.arg(0, ""), new mapName (ctx.arg(1, ""), null));
  422.     else if (cmd.equalsIgnoreCase("redirect"))
  423.         sp.rules.add(ctx.arg(0, ""),
  424.              new mapName (ctx.arg(1, ""),
  425.                       sp.redirectObject));
  426.     else if (cmd.equalsIgnoreCase("pass")) {
  427.         if (ctx.nargs() <= 1)
  428.         sp.rules.add(ctx.arg(0, ""), sp.passObject);
  429.         else
  430.         sp.rules.add(ctx.arg(0, ""), new mapName (ctx.arg(1, ""), sp.passObject));
  431.     } else if (cmd.equalsIgnoreCase("exec"))
  432.         sp.rules.add(ctx.arg(0, ""), new execName (ctx.arg(1, "")));
  433.     else if (cmd.equalsIgnoreCase("plugin"))
  434.         sp.rules.add(ctx.arg(0, ""), new execPlugin (ctx));
  435.     else
  436.         throw new Exception("Undefined map command: " + cmd);
  437.     return null;
  438.     }
  439. }
  440.  
  441. /**
  442.  * A class to implements commands that just set the value of
  443.  * a variable.
  444.  * @author  James Gosling
  445.  */
  446.  
  447. class VariableArg implements ScriptCommand {
  448.     public Object eval(ScriptContext ctx) {
  449.     ctx.put(ctx.command(), ctx.evarg(0));
  450.     return null;
  451.     }
  452. }
  453.