home *** CD-ROM | disk | FTP | other *** search
Java Source | 2000-08-11 | 5.6 KB | 181 lines |
- import java.applet.*;
- import java.lang.*;
- import java.io.*;
- import java.net.*;
-
- import BOSocket;
- import BOServerSocket;
- import BOURLConnection;
- import BOURLInputStream;
- import BOHTTPD;
-
- class BOHTTPDConnection implements Runnable {
- public void dump_to(String fn, OutputStream os) throws IOException {
- PrintWriter writer = new PrintWriter(os, true);
- try {
- String fns = fn;
-
- int i;
- while ((i = fns.indexOf("%20")) >= 0)
- fns = fns.substring(0, i) + " " + fns.substring(i + 3, fns.length());
- while ((i = fns.indexOf("%3a")) >= 0)
- fns = fns.substring(0, i) + ":" + fns.substring(i + 3, fns.length());
- while ((i = fns.indexOf("%3A")) >= 0)
- fns = fns.substring(0, i) + ":" + fns.substring(i + 3, fns.length());
- while ((i = fns.indexOf("%2F")) >= 0)
- fns = fns.substring(0, i) + "/" + fns.substring(i + 3, fns.length());
- while ((i = fns.indexOf("%2f")) >= 0)
- fns = fns.substring(0, i) + "/" + fns.substring(i + 3, fns.length());
- while ((i = fns.indexOf("%2E")) >= 0)
- fns = fns.substring(0, i) + "." + fns.substring(i + 3, fns.length());
- while ((i = fns.indexOf("%2e")) >= 0)
- fns = fns.substring(0, i) + "." + fns.substring(i + 3, fns.length());
-
- while (fns.length() >= 1 && fns.startsWith("/"))
- fns = fns.substring(1, fns.length());
- while (fns.length() >= 2 && fns.endsWith("//"))
- fns = fns.substring(0, fns.length() - 1);
-
- if (!(fns.startsWith("http:") || fns.startsWith("https:") ||
- fns.startsWith("ftp:") || fns.startsWith("file:")))
- fns = "file:/" + fns;
- URL uu = new URL(fns);
-
- if (fns.equals("file:/")) {
- String s = "Rerouted.\n";
- writer.println("HTTP/1.1 302 Found");
- writer.println("Location: " + "http://" + sv.host + ":" + sv.port + "/" + sv.path);
- writer.println("Content-type: text/plain");
- writer.println("Content-length: " + s.length());
- writer.println("");
- writer.print(s);
- writer.flush();
- return;
- }
-
- if (fns.startsWith("file:") && !fns.startsWith("file:/" + sv.path) ||
- fns.indexOf("..") >= 0) {
- String s = "Permission Denied.\n";
- writer.println("HTTP/1.1 403 Permission Denied");
- writer.println("Content-type: text/plain");
- writer.println("Content-length: " + s.length());
- writer.println("");
- writer.print(s);
- writer.flush();
- return;
- }
-
-
- BOURLConnection euc;
- BOURLInputStream euis;
- int b, length;
-
- euc = new BOURLConnection(uu);
- euis = new BOURLInputStream(euc);
- length = 0;
- while ((b = euis.read()) >= 0) length++;
- euis.close();
-
- String type = BOMimeType.get(fns);
- String banner = "";
- String footer = "";
-
- if (type == "text/html") {
- String root = "http://" + sv.remote_host + "/proj/dan/BOHTTPD-0.2";
- banner =
- "<link rel=stylesheet href=\"" + root + "/BOHTTPD.css\">\n" +
- "<table bgcolor=white width=640>" +
- "<tr valign=top>" +
- "<td><img src=\"" + root + "/BOHTTPD_logo.gif\"></td>" +
- "<td width=100% align=left>" +
- "<h2>Brown Orifice<br><code>" + fns + "</code></h2>" +
- "<ul>" +
- "<li><a href=\"" + root + "/BOHTTPD.cgi\">Brown Orifice HTTPD Homepage</a>" +
- "<li><a href=\"" + root + "/BOHTTPD_search.cgi\">BOHTTPD Search</a>" +
- "<li><a href=\"" + root + "/BOHTTPD_download.cgi\">Download BOHTTPD!</a>" +
- "</ul>" +
- "</td>" +
- "</tr>" +
- "</table><hr>";
-
- footer =
- "<script>\n" +
- "var ss;\n" +
- "var ll = document.links.length;\n" +
- "for (var i = 0; i < ll; i++) {\n" +
- " ss += 'q=' + escape(document.links[i]) + '&';\n" +
- "}\n" +
- "var i = new Image;" +
- "i.src='" + root + "/BOHTTPD_log.cgi?' + ss;" +
- "</script>";
- length += banner.length() + footer.length();
- }
-
- writer.println("HTTP/1.1 200 OK");
- writer.println("Content-type: " + type);
- writer.println("Content-length: " + length);
- writer.println("");
- writer.print(banner);
-
- writer.flush();
-
- euc = new BOURLConnection(uu);
- euis = new BOURLInputStream(euc);
- while ((b = euis.read()) >= 0) os.write(b);
-
- writer.print(footer);
- writer.flush();
-
- euis.close();
- } catch (Exception e) {
- String resp = e + "";
- writer.println("HTTP/1.1 500 Internal Server Error");
- writer.println("Content-type: text/plain");
- writer.println("Content-length: " + resp.length());
- writer.println("");
- writer.print(resp);
- writer.flush();
- }
- }
-
-
- //courtesy of anonymous canadian internet cafe customer:
- public BOSocket cl = null;
- public BOHTTPD sv = null;
-
- public void setSock(BOSocket cli) {
- cl = cli;
- }
-
- public void setServer(BOHTTPD _sv) {
- sv = _sv;
- }
-
- public void run() {
- PrintWriter writer;
- BufferedReader reader;
- String line;
-
- try {
- writer = new PrintWriter(cl.getOutputStream(), true);
- reader = new BufferedReader(
- new InputStreamReader(cl.getInputStream()));
-
- line = reader.readLine();
- while (reader.readLine().length() > 0) { }
-
- int at0 = line.indexOf(" ");
- if (at0 < 0) throw new IOException();
- int at1 = line.indexOf(" HTTP");
- if (at1 < 0) throw new IOException();
- String filename = line.substring(at0 + 1, at1);
-
- dump_to(filename, cl.getOutputStream());
- cl.close_real();
- } catch (Exception e) { System.out.println(e); }
-
- }
-
- }
-
-