public static void ServerStart(ConfigurationFile ConfigFile) { Console.WriteLine($"\n{DateTime.Now}: SERVER START"); Console.WriteLine("Configurations:"); Console.WriteLine($"\tport: {ConfigFile.Port}"); Console.WriteLine($"\tdefault page: {ConfigFile.DefaultPage}"); Console.WriteLine($"\troot directory: {ConfigFile.RootPath}\n"); }
public Client(TcpClient TcpClient, ConfigurationFile Config) { string Request = string.Empty; // declare string which will contain client's request byte[] Buffer = new byte[1024]; // client data buffer int Count; // count income bytes // read data while its coming while ((Count = TcpClient.GetStream().Read(Buffer, 0, Buffer.Length)) > 0) { // encode to string and put in our request string Request += Encoding.ASCII.GetString(Buffer, 0, Count); // request must end with \r\n\r\n // or stop reading if its > 4kbyte if (Request.IndexOf("\r\n\r\n") >= 0 || Request.Length > 4096) { break; } } // parse query Match ReqMatch = Regex.Match(Request, @"^\w+\s+([^\s\?]+)[^\s]*\s+HTTP/.*|"); // if query is wrong if (ReqMatch == Match.Empty) { SendError(TcpClient, 400); // error 400 return; } // query to string string RequestUri = ReqMatch.Groups[1].Value; // transforming escaped characters. //example : "%20" -> " " RequestUri = Uri.UnescapeDataString(RequestUri); // if ".." http://example.com/../../file.txt if (RequestUri.IndexOf("..") >= 0) { SendError(TcpClient, 400); return; } // if query end with "/" -> add "index.html" if (RequestUri.EndsWith("/")) { RequestUri += Config.DefaultPage; } //root from config file + request string FilePath = Config.RootPath + RequestUri; // file not found -> 404 error if (!File.Exists(FilePath)) { SendError(TcpClient, 404); return; } // get file extension string Extension = RequestUri.Substring(RequestUri.LastIndexOf('.')); string ContentType = GetTheType(Extension); // check the file FileStream FS; try { FS = new FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.Read); } catch (Exception) { // if exeption - 500 error SendError(TcpClient, 500); return; } // send response string Headers = "HTTP/1.1 200 OK\nContent-Type: " + ContentType + "\nContent-Length: " + FS.Length + "\n\n"; byte[] HeadersBuffer = Encoding.ASCII.GetBytes(Headers); TcpClient.GetStream().Write(HeadersBuffer, 0, HeadersBuffer.Length); while (FS.Position < FS.Length) { // read and send to client try { Thread.Sleep(100); //NO to dDos ;) Count = FS.Read(Buffer, 0, Buffer.Length); TcpClient.GetStream().Write(Buffer, 0, Count); } catch { UI.Error(0); break; } } // close file and connection FS.Close(); TcpClient.Close(); }