Advertisement
Danny_Berova

ConnectionHandler

May 25th, 2018
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.61 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Net.Sockets;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using MyWebServer.Server.Common;
  7. using MyWebServer.Server.Handlers;
  8. using MyWebServer.Server.Http;
  9. using MyWebServer.Server.Http.Contracts;
  10. using MyWebServer.Server.Routing.Contracts;
  11.  
  12. namespace MyWebServer.Server
  13. {
  14.     public class ConnectionHandler
  15.     {
  16.         private readonly Socket client;
  17.  
  18.         private readonly IServerRouteConfig serverRouteConfig;
  19.  
  20.         public ConnectionHandler(Socket client, IServerRouteConfig serverRouteConfig)
  21.         {
  22.             CoreValidator.ThrowIfNull(client, nameof(client));
  23.             CoreValidator.ThrowIfNull(serverRouteConfig, nameof(serverRouteConfig));
  24.  
  25.             this.client = client;
  26.             this.serverRouteConfig = serverRouteConfig;
  27.         }
  28.  
  29.         public async Task ProcessRequestAsync()
  30.         {
  31.             var httpRequest = await this.ReadRequest();
  32.  
  33.             if (httpRequest != null)
  34.             {
  35.                 var httpContext = new HttpContext(httpRequest);
  36.  
  37.                 var httpResponse = new HttpHandler(this.serverRouteConfig).Handle(httpContext);
  38.  
  39.                 var responseBytes = Encoding.UTF8.GetBytes(httpResponse.ToString());
  40.  
  41.                 var byteSegment = new ArraySegment<byte>(responseBytes);
  42.  
  43.                 await this.client.SendAsync(byteSegment, SocketFlags.None);
  44.  
  45.                 Console.WriteLine($"-----REQUEST-----");
  46.                 Console.WriteLine(httpRequest);
  47.                 Console.WriteLine($"-----RESPONSE-----");
  48.                 Console.WriteLine(httpResponse);
  49.                 Console.WriteLine();
  50.             }
  51.  
  52.             this.client.Shutdown(SocketShutdown.Both);
  53.         }
  54.  
  55.         private async Task<IHttpRequest> ReadRequest()
  56.         {
  57.             var result = new StringBuilder();
  58.  
  59.             var data = new ArraySegment<byte>(new byte[1024]);
  60.  
  61.             while (true)
  62.             {
  63.                 int numberOfBytesRead = await this.client.ReceiveAsync(data, SocketFlags.None);
  64.  
  65.                 if (numberOfBytesRead == 0)
  66.                 {
  67.                     break;
  68.                 }
  69.  
  70.                 var bytesAsString = Encoding.UTF8.GetString(data.Array, 0, numberOfBytesRead);
  71.  
  72.                 result.Append(bytesAsString);
  73.  
  74.                 if (numberOfBytesRead < 1023)
  75.                 {
  76.                     break;
  77.                 }
  78.             }
  79.  
  80.             if (result.Length == 0)
  81.             {
  82.                 return null;
  83.             }
  84.  
  85.             return new HttpRequest(result.ToString());
  86.         }
  87.     }
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement