public void mozillaWithParameters() { var requestString = @"GET /sayhello/trajko?surname=trajkovski&birthplace=konopishte HTTP/1.1 Host: localhost:5050 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: keep-alive"; var parser = new RequestParser(requestString); Assert.AreEqual(RequestKind.Action, parser.Kind); Assert.AreEqual("localhost:5050", parser.Host); Assert.AreEqual("GET", parser.Method); Assert.AreEqual("/sayhello/trajko", parser.PathString); Assert.AreEqual(null, parser.Extension); Assert.AreEqual(null, parser.FileName); var expected = new List<QueryParameter> { new QueryParameter{ Name = "surname", Value = "trajkovski"}, new QueryParameter{ Name = "birthplace", Value = "konopishte"} }; for (int i = 0; i < expected.Count; i++) { Assert.AreEqual(expected[i], parser.QueryParameters[i]); } Assert.AreEqual("sayhello", parser.Action); Assert.AreEqual("trajko", parser.Parameter); Assert.AreEqual(5050, parser.Port); Assert.AreEqual("Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0", parser.UserAgent); }
public ProcessResult Process(RequestParser parser) { var result = DataProvider.GetTableNames(); //poor-man's json var json = string.Format("[\"{0}\"]", string.Join("\", \"", result)); var byteResponse = Encoding.UTF8.GetBytes(json); return new ProcessResult { StatusCode = StatusCode.OK, Bytes = byteResponse, ContentType = "application/json" }; }
private void HandleRequest(Socket clientSocket) { //Thread.Sleep(5000); //Console.WriteLine("Server request at {0}", DateTime.UtcNow); string requestString = DecodeRequest(clientSocket); RequestParser parser = new RequestParser(requestString); Console.WriteLine("Received request {0}", requestString); RequestProcessor processor = new RequestProcessor(parser); var result = processor.ProcessRequest(); byte[] byteHeader = CreateHeader(result.StatusCode, result.Bytes.Length, result.ContentType); clientSocket.Send(byteHeader); clientSocket.Send(result.Bytes); clientSocket.Close(); }
public ProcessResult Process(RequestParser parser) { var tableName = parser.Parameter; var tableNames = DataProvider.GetTableNames(); if (!tableNames.Contains(tableName)) { string badResponse = "<h1>Please don't do that. There is not a table named " + tableName + "</h1>"; badResponse += "<p>There is a action listTables that lists all available tables</p>"; var badByteResponse = Encoding.UTF8.GetBytes(badResponse); return new ProcessResult { StatusCode = StatusCode.NotFound, Bytes = badByteResponse, ContentType = "text/html" }; } var data = DataProvider.GetTableData(tableName); var columns = DataProvider.GetTableColumns(tableName); StringBuilder response = new StringBuilder(); response.Append("["); foreach (var row in data) { response.Append("{"); foreach (var column in columns) { var name = column.Value; var value = row[column.Key - 1]; response.AppendFormat("\"{0}\":\"{1}\",", name, value); } response.Append("},"); } response.Append("]"); var byteResponse = Encoding.UTF8.GetBytes(response.ToString()); return new ProcessResult { StatusCode = StatusCode.OK, Bytes = byteResponse, ContentType = "application/json" }; }
public void mozillaWithAction() { var requestString = @"GET /sayhello/trajko HTTP/1.1 Host: localhost:5050 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: keep-alive"; var parser = new RequestParser(requestString); Assert.AreEqual(RequestKind.Action, parser.Kind); Assert.AreEqual("localhost:5050", parser.Host); Assert.AreEqual("GET", parser.Method); Assert.AreEqual("/sayhello/trajko", parser.PathString); Assert.AreEqual(null, parser.Extension); Assert.AreEqual(null, parser.FileName); Assert.AreEqual(null, parser.QueryParameters); Assert.AreEqual("sayhello", parser.Action); Assert.AreEqual("trajko", parser.Parameter); Assert.AreEqual(5050, parser.Port); Assert.AreEqual("Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0", parser.UserAgent); }
private void HandleTheRequest(Socket clientSocket) { //Thread.Sleep(5000); //Console.WriteLine("Server request at {0}", DateTime.UtcNow); string requestString = DecodeRequest(clientSocket); RequestParser parser = new RequestParser(requestString); Console.WriteLine("Received request {0}", requestString); byte[] byteResponse = new byte[0]; string statusCode = "200"; string contentType = "text/html"; switch (parser.Kind) { case RequestKind.Action: switch (parser.Action.ToLower()) { case "sayhello": { string response = "<h1>Hello " + parser.Parameter + "</h1>"; byteResponse = Encoding.UTF8.GetBytes(response); break; } default: { string response = "<h1>Unsupported action " + parser.Action + "</h1>"; byteResponse = Encoding.UTF8.GetBytes(response); break; } } break; case RequestKind.File: if (File.Exists(parser.FileName)) { switch (parser.Extension) { case "ico": { byteResponse = File.ReadAllBytes(parser.FileName); contentType = "image/ico"; break; } case "html": { byteResponse = File.ReadAllBytes(parser.FileName); break; } default: { byteResponse = File.ReadAllBytes(parser.FileName); contentType = "text/plain"; break; } } } else { statusCode = "404"; } break; case RequestKind.Error: statusCode = "501"; break; default: throw new ArgumentOutOfRangeException(); } byte[] byteHeader = CreateHeader(statusCode, byteResponse.Length, contentType); clientSocket.Send(byteHeader); clientSocket.Send(byteResponse); clientSocket.Close(); }
public RequestProcessor(RequestParser parser) { this.parser = parser; }