/// <summary> /// Appends a new message to the log file. /// </summary> /// <param name="message">The LogMessage</param> public void AppendToLogFile(LogMessage message) { if (WriteToLog) { StringBuilder sb = new StringBuilder(); sb.AppendLine(); sb.Append(DateTime.Now.ToString()); sb.Append(","); sb.Append(message.Status); sb.Append(","); sb.Append("Header: "); sb.Append(message.Header); sb.Append(","); sb.Append(message.Message); sb.Append(","); sb.Append(message.Method); sb.AppendLine(); sb.AppendLine(); //do //{ // Thread.Sleep(1000); //} while (CheckIfLogIsBeingUsed(Location)); // Append our message to the log. lock (lockObj) { File.AppendAllText(Location, sb.ToString()); Thread.Sleep(100); } } }
/// <summary> /// Sends the header to our socket. /// </summary> /// <param name="httpVersion">HTTP Version we are using</param> /// <param name="mimeHeader">Mime header</param> /// <param name="toBytes"></param> /// <param name="statusCode">Status code we are sending</param> /// <param name="socket">Socket to the receiver</param> private void SendHeader(string httpVersion, string mimeHeader, int toBytes, string statusCode, ref Socket socket, DateTime lastWriteTime) { string buffer = string.Empty; if (mimeHeader.Length == 0) { mimeHeader = "text/html"; } buffer = buffer + httpVersion + statusCode + "\r\n"; buffer = buffer + "Server: WQN1010\r\n"; buffer = buffer + "Content-Type: " + mimeHeader + "\r\n"; buffer = buffer + "Accept-Ranges: bytes\r\n"; DateTime time = DateTime.Now; string format = "ddd, d MMM yyyy HH:mm:ss"; Console.WriteLine(time.ToString(format)); buffer = buffer + "Date: " + time.ToString(format) + "\r\n"; buffer = buffer + "Last-Modified: " + lastWriteTime.ToString(format) + "\r\n"; buffer = buffer + "Content-Length: " + toBytes + "\r\n\r\n"; byte[] data = Encoding.ASCII.GetBytes(buffer); SendData(data, ref socket); // Set up and write a log message about the header we just sent. LogMessage message = new LogMessage(); message.Message = "Sending header..."; message.Status = State.INFO; message.Header = buffer; message.Method = "HttpServer.SendHeader"; LogInformation(message); }
/// <summary> /// Logs the specified information to the log file. /// </summary> private void LogInformation(LogMessage message) { Log.AppendToLogFile(message); }
/// <summary> /// Gets the type of MIME we are using for the request. /// - Searches our Hashtable for the requested file's extension. /// </summary> /// <param name="requestedFile"></param> /// <returns></returns> private string GetMimeType(string requestedFile) { string fileExt = string.Empty; requestedFile = requestedFile.ToLower(); int startPos = requestedFile.IndexOf("."); fileExt = requestedFile.Substring(startPos); if (MimeTypes.Contains(fileExt)) { return MimeTypes[fileExt].ToString(); } else { LogMessage message = new LogMessage(); message.Status = State.ERROR; message.Message = "Unknown MIME type, or not supported."; LogInformation(message); } return string.Empty; }
/// <summary> /// Initializes and sets up the server. /// </summary> public void Initialize() { LogMessage message = new LogMessage(State.INFO, "Initializing the server.", "HttpServer.Initialize()"); LogInformation(message); Console.WriteLine("Attempting to start Server..."+ "\n\tPort:\t\t"+Port+ "\n\tLogfile:\t"+Log.Location+ "\n\tRoot:\t\t"+RootDirectory); // Create our MIME types Hashtable. MimeTypes = new Hashtable(); MimeTypes.Add(".html", "text/html"); // HTML files MimeTypes.Add(".htm", "text/html"); // HTM files MimeTypes.Add(".bmp", "image/bmp"); // Bitmaps MimeTypes.Add(".jpg", "image/jpg"); // JPEGs MimeTypes.Add(".pdf", "application/pdf"); // PDFs try { Listener = new TcpListener(IPAddress.Any, Port); Listener.Start(); Console.WriteLine("Server is running..." + Port); // Creates a new main thread. Further threading is done within the StartListen function. Thread thread = new Thread(new ThreadStart(StartListen)); thread.Start(); } catch (Exception e) { LogInformation(new LogMessage(State.ERROR, "Unable to start server. " + e.Message, "HttpServer.Initialize()")); } }