home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 March / PCWorld_2001-03_cd.bin / Software / Topware / aspedit / _SETUP.1 / httpserver.cs < prev    next >
Text File  |  2000-08-22  |  4KB  |  140 lines

  1. using System;
  2. using System.Collections;
  3. using System.IO;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Threading;
  7.  
  8. class HttpProcessor {
  9.  
  10.   private Socket s;
  11.   private BufferedStream bs;
  12.   private StreamReader sr;
  13.   private StreamWriter sw;
  14.   private String method;
  15.   private String url;
  16.   private String protocol;
  17.   private Hashtable hashTable;
  18.  
  19.   public HttpProcessor(Socket s) {
  20.     this.s = s;
  21.     hashTable = new Hashtable();
  22.   }
  23.  
  24.   public void process() {
  25.     NetworkStream ns = new NetworkStream(s, FileAccess.ReadWrite);
  26.     bs = new BufferedStream(ns);
  27.     sr = new StreamReader(bs);
  28.     sw = new StreamWriter(bs);
  29.     parseRequest();
  30.     readHeaders();
  31.     writeURL();
  32.     s.Shutdown(SocketShutdown.SdBoth);
  33.     ns.Close();
  34.   }
  35.  
  36.   public void parseRequest() {
  37.     String request = sr.ReadLine();
  38.     string[] tokens = request.Split(new char[]{' '});
  39.     method = tokens[0];
  40.     url = tokens[1];
  41.     protocol = tokens[2];
  42.   }
  43.  
  44.   public void readHeaders() {
  45.     String line;
  46.     while((line = sr.ReadLine()) != null && line != "") {
  47.       string[] tokens = line.Split(new char[]{':'});
  48.       String name = tokens[0];
  49.       String value = "";
  50.       for(int i = 1; i < tokens.Length; i++) {
  51.         value += tokens[i];
  52.         if(i < tokens.Length - 1) tokens[i] += ":";
  53.       }
  54.       hashTable[name] = value;
  55.     }
  56.   }
  57.  
  58.   public void writeURL() {
  59.     try {
  60.       FileStream fs = new FileStream(url.Substring(1), FileMode.Open, FileAccess.Read);
  61.       writeSuccess();
  62.       BufferedStream bs2 = new BufferedStream(fs);
  63.       byte[] bytes = new byte[4096];
  64.       int read;
  65.       while((read = bs2.Read(bytes, 0, bytes.Length)) != 0) {
  66.         bs.Write(bytes, 0, read);
  67.       }
  68.       bs2.Close();
  69.     } catch(FileNotFoundException) {
  70.       writeFailure();
  71.       sw.WriteLine("File not found: " + url);
  72.     }
  73.     sw.Flush();
  74.   }
  75.  
  76.   public void writeSuccess() {
  77.     sw.WriteLine("HTTP/1.0 200 OK");
  78.     sw.WriteLine("Connection: close");
  79.     sw.WriteLine();
  80.   }
  81.  
  82.   public void writeFailure() {
  83.     sw.WriteLine("HTTP/1.0 404 File not found");
  84.     sw.WriteLine("Connection: close");
  85.     sw.WriteLine();
  86.   }
  87. }
  88.  
  89. public class HttpServer {
  90.   
  91.   // ============================================================
  92.   // Data
  93.  
  94.   protected int port;
  95.  
  96.   // ============================================================
  97.   // Constructor
  98.  
  99.   public HttpServer() : this(80) {
  100.   }
  101.  
  102.   public HttpServer(int port) {
  103.     this.port = port;
  104.   }
  105.  
  106.   // ============================================================
  107.   // Listener
  108.   
  109.   public void listen() {
  110.     Socket listener = new Socket(0, SocketType.SockStream, ProtocolType.ProtTCP);
  111.     IPAddress ipaddress = new IPAddress("127.0.0.1");
  112.     IPEndPoint endpoint = new IPEndPoint(ipaddress, port);
  113.     listener.Bind(endpoint);
  114.     listener.Blocking = true;
  115.     listener.Listen(-1);
  116.     while(true) {
  117.       Socket s = listener.Accept();
  118.       HttpProcessor processor = new HttpProcessor(s);
  119.       Thread thread = new Thread(new ThreadStart(processor.process));
  120.       thread.Start();
  121.     }
  122.   }
  123.  
  124.   // ============================================================
  125.   // Main
  126.  
  127.   public static int Main(String[] args) {
  128.     HttpServer httpServer;
  129.     if(args.GetLength(0) > 0) {
  130.       httpServer = new HttpServer(args[0].ToUInt16());
  131.     } else {
  132.       httpServer = new HttpServer();
  133.     }
  134.     Thread thread = new Thread(new ThreadStart(httpServer.listen));
  135.     thread.Start();
  136.     return 0;
  137.   }
  138. }
  139.  
  140.