home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 49 / cda49.iso / VNULabs / BrownOrifice / BOHTTPD-0.2 / BOHTTPDConnection.java < prev    next >
Encoding:
Java Source  |  2000-08-11  |  5.6 KB  |  181 lines

  1. import java.applet.*;
  2. import java.lang.*;
  3. import java.io.*;
  4. import java.net.*;
  5.  
  6. import BOSocket;
  7. import BOServerSocket;
  8. import BOURLConnection;
  9. import BOURLInputStream;
  10. import BOHTTPD;
  11.  
  12. class BOHTTPDConnection implements Runnable {
  13.   public void dump_to(String fn, OutputStream os) throws IOException {
  14.     PrintWriter writer = new PrintWriter(os, true);
  15.     try {
  16.       String fns = fn;
  17.  
  18.       int i;
  19.       while ((i = fns.indexOf("%20")) >= 0)
  20.         fns = fns.substring(0, i) + " " + fns.substring(i + 3, fns.length());
  21.       while ((i = fns.indexOf("%3a")) >= 0)
  22.         fns = fns.substring(0, i) + ":" + fns.substring(i + 3, fns.length());
  23.       while ((i = fns.indexOf("%3A")) >= 0)
  24.         fns = fns.substring(0, i) + ":" + fns.substring(i + 3, fns.length());
  25.       while ((i = fns.indexOf("%2F")) >= 0)
  26.         fns = fns.substring(0, i) + "/" + fns.substring(i + 3, fns.length());
  27.       while ((i = fns.indexOf("%2f")) >= 0)
  28.         fns = fns.substring(0, i) + "/" + fns.substring(i + 3, fns.length());
  29.       while ((i = fns.indexOf("%2E")) >= 0)
  30.         fns = fns.substring(0, i) + "." + fns.substring(i + 3, fns.length());
  31.       while ((i = fns.indexOf("%2e")) >= 0)
  32.         fns = fns.substring(0, i) + "." + fns.substring(i + 3, fns.length());
  33.  
  34.       while (fns.length() >= 1 && fns.startsWith("/")) 
  35.         fns = fns.substring(1, fns.length());
  36.       while (fns.length() >= 2 && fns.endsWith("//")) 
  37.         fns = fns.substring(0, fns.length() - 1);
  38.  
  39.       if (!(fns.startsWith("http:") || fns.startsWith("https:") ||
  40.           fns.startsWith("ftp:") || fns.startsWith("file:"))) 
  41.         fns = "file:/" + fns;
  42.       URL uu = new URL(fns);
  43.  
  44.       if (fns.equals("file:/")) {
  45.         String s = "Rerouted.\n";
  46.         writer.println("HTTP/1.1 302 Found");
  47.         writer.println("Location: " + "http://" + sv.host + ":" + sv.port + "/" + sv.path);
  48.         writer.println("Content-type: text/plain");
  49.         writer.println("Content-length: " + s.length());
  50.         writer.println("");
  51.         writer.print(s);
  52.         writer.flush();
  53.         return;
  54.       }
  55.  
  56.       if (fns.startsWith("file:") && !fns.startsWith("file:/" + sv.path) ||
  57.        fns.indexOf("..") >= 0) {
  58.         String s = "Permission Denied.\n";
  59.         writer.println("HTTP/1.1 403 Permission Denied");
  60.         writer.println("Content-type: text/plain");
  61.         writer.println("Content-length: " + s.length());
  62.         writer.println("");
  63.         writer.print(s);
  64.         writer.flush();
  65.         return;
  66.       }
  67.  
  68.  
  69.       BOURLConnection euc;
  70.       BOURLInputStream euis;
  71.       int b, length;
  72.  
  73.       euc = new BOURLConnection(uu);
  74.       euis = new BOURLInputStream(euc);
  75.       length = 0;
  76.       while ((b = euis.read()) >= 0) length++;
  77.       euis.close();
  78.  
  79.       String type = BOMimeType.get(fns);
  80.       String banner = "";
  81.       String footer = "";
  82.  
  83.       if (type == "text/html") {
  84.         String root = "http://" + sv.remote_host + "/proj/dan/BOHTTPD-0.2";
  85.         banner =
  86.           "<link rel=stylesheet href=\"" + root + "/BOHTTPD.css\">\n" +
  87.           "<table bgcolor=white width=640>" +
  88.             "<tr valign=top>" +
  89.               "<td><img src=\"" + root + "/BOHTTPD_logo.gif\"></td>" +
  90.               "<td width=100% align=left>" +
  91.                 "<h2>Brown Orifice<br><code>" + fns + "</code></h2>" +
  92.                 "<ul>" +
  93.                 "<li><a href=\"" + root + "/BOHTTPD.cgi\">Brown Orifice HTTPD Homepage</a>" +
  94.                 "<li><a href=\"" + root + "/BOHTTPD_search.cgi\">BOHTTPD Search</a>" +
  95.                 "<li><a href=\"" + root + "/BOHTTPD_download.cgi\">Download BOHTTPD!</a>" +
  96.                 "</ul>" +
  97.               "</td>" +
  98.             "</tr>" +
  99.           "</table><hr>";
  100.  
  101.         footer =
  102.           "<script>\n" +
  103.           "var ss;\n" +
  104.           "var ll = document.links.length;\n" +
  105.           "for (var i = 0; i < ll; i++) {\n" +
  106.           "  ss += 'q=' + escape(document.links[i]) + '&';\n" +
  107.           "}\n" +
  108.           "var i = new Image;" +
  109.           "i.src='" + root + "/BOHTTPD_log.cgi?' + ss;" +
  110.           "</script>";
  111.         length += banner.length() + footer.length();
  112.       }
  113.  
  114.       writer.println("HTTP/1.1 200 OK");
  115.       writer.println("Content-type: " + type);
  116.       writer.println("Content-length: " + length);
  117.       writer.println("");
  118.       writer.print(banner);
  119.  
  120.       writer.flush();
  121.  
  122.       euc = new BOURLConnection(uu);
  123.       euis = new BOURLInputStream(euc);
  124.       while ((b = euis.read()) >= 0) os.write(b);
  125.  
  126.       writer.print(footer);
  127.       writer.flush();
  128.  
  129.       euis.close();
  130.     } catch (Exception e) {
  131.       String resp = e + "";
  132.       writer.println("HTTP/1.1 500 Internal Server Error");
  133.       writer.println("Content-type: text/plain");
  134.       writer.println("Content-length: " + resp.length());
  135.       writer.println("");
  136.       writer.print(resp);
  137.       writer.flush();
  138.     }
  139.   }
  140.  
  141.   
  142. //courtesy of anonymous canadian internet cafe customer:
  143.   public BOSocket cl = null;
  144.   public BOHTTPD sv = null;
  145.  
  146.   public void setSock(BOSocket cli) {
  147.     cl = cli;
  148.   }
  149.  
  150.   public void setServer(BOHTTPD _sv) {
  151.     sv = _sv;
  152.   }
  153.  
  154.   public void run() {
  155.     PrintWriter writer;
  156.     BufferedReader reader;
  157.     String line;
  158.  
  159. try {
  160.     writer = new PrintWriter(cl.getOutputStream(), true);
  161.     reader = new BufferedReader(
  162.           new InputStreamReader(cl.getInputStream()));
  163.   
  164.         line = reader.readLine();
  165.         while (reader.readLine().length() > 0) { }
  166.   
  167.         int at0 = line.indexOf(" ");
  168.         if (at0 < 0) throw new IOException();
  169.         int at1 = line.indexOf(" HTTP");
  170.         if (at1 < 0) throw new IOException();
  171.         String filename = line.substring(at0 + 1, at1);
  172.  
  173.         dump_to(filename, cl.getOutputStream());
  174.         cl.close_real();
  175. } catch (Exception e) { System.out.println(e); }
  176.  
  177.   }
  178.  
  179. }
  180.  
  181.