-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHttpServer.cs
More file actions
132 lines (91 loc) · 4.06 KB
/
Copy pathHttpServer.cs
File metadata and controls
132 lines (91 loc) · 4.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
using MayaWebServer.Server.Http;
using MayaWebServer.Server.Routing;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace MayaWebServer.Server
{
public class HttpServer
{
private readonly IPAddress ipAddress;
private readonly int port;
private readonly TcpListener listener;
private readonly RoutingTable routingTable;
public HttpServer(string ipAddress, int port, Action<IRoutingTable> routingTableConfiguration)
{
this.ipAddress = IPAddress.Parse(ipAddress);
this.port = port;
listener = new TcpListener(this.ipAddress, port);
routingTableConfiguration(this.routingTable = new RoutingTable());
//what we want here is to call the configuration we've set up in the StartUp; we take the private routingTable from here, we fetch it to the one we have set up in the StartUp and now we can start using it
}
public HttpServer(int port, Action<IRoutingTable> routingTable)
: this ("127.0.0.1", port, routingTable)
{ }
public HttpServer(Action<IRoutingTable> routingTable)
: this(5050, routingTable) { }
public async Task Start()
{
this.listener.Start();
Console.WriteLine($"Server started on port {port}");
Console.WriteLine("Listening for requests ...");
while (true)
{
var connection = await this.listener.AcceptTcpClientAsync();
var networkStream = connection.GetStream();
var requestText = await this.ReadRequest(networkStream);
// Console.WriteLine(requestText);
var request = HttpRequest.Parse(requestText);
var response = this.routingTable.MatchRequest(request);
Console.WriteLine(response.ToString());
//await WriteResponse(networkStream);
await WriteResponse(networkStream, response);
connection.Close();
}
}
private async Task WriteResponse(NetworkStream networkStream, HttpResponse response)
{
// var content = "Hello from my server!! \r\n Здрасти :) آني مبسوطة بمعرفتك !!!! مرحبا كيفك؟";
// var contentLength = Encoding.UTF8.GetByteCount(content);
// var response = $@"
//HTTP/1.1 200 OK
//Server: MyWebServer
//Date: {DateTime.UtcNow:R}
//Content-Length: {contentLength}
//Content-Type: text/plain; charset=UTF-8
//{content}";
var responseBytes = Encoding.UTF8.GetBytes(response.ToString());
await networkStream.WriteAsync(responseBytes);
}
//private async Task WriteResponse(
// NetworkStream networkStream,
// HttpResponse response)
//{
// var responseBytes = Encoding.UTF8.GetBytes(response.ToString());
// await networkStream.WriteAsync(responseBytes);
// if (response.HasContent)
// {
// await networkStream.WriteAsync(response.Content);
// }
//}
private async Task<string> ReadRequest(NetworkStream networkStream)
{
var bufferLength = 1024;
var buffer = new byte[bufferLength];
var totalBytes = 0;
var requestBuilder = new StringBuilder();
do
{
var bytesRead = await networkStream.ReadAsync(buffer, 0, bufferLength);
totalBytes += bytesRead;
if (totalBytes > 10 * 1024)
{
throw new InvalidOperationException("Request is too large.");
}
requestBuilder.Append(Encoding.UTF8.GetString(buffer, 0, bytesRead));
}
while (networkStream.DataAvailable);
return requestBuilder.ToString();
}
}
}