MTSC  1.0.5
Build TCP servers out of modules with handlers for communication, exception and logging.
HttpHandler.cs
1 using MTSC.Common;
2 using MTSC.Common.Http;
4 using System;
5 using System.Collections.Concurrent;
6 using System.Collections.Generic;
7 using System.Text;
8 using System.Threading;
9 
10 namespace MTSC.Server.Handlers
11 {
15  public class HttpHandler : IHandler
16  {
17  private static string urlEncodedHeader = "application/x-www-form-urlencoded";
18  private static string multipartHeader = "multipart/form-data";
19  #region Fields
20  List<IHttpModule> httpModules = new List<IHttpModule>();
21  ConcurrentQueue<Tuple<ClientData,HttpMessage>> messageQueue = new ConcurrentQueue<Tuple<ClientData, HttpMessage>>();
22  #endregion
23  #region Constructors
24  public HttpHandler()
25  {
26 
27  }
28  #endregion
29  #region Public Methods
36  {
37  this.httpModules.Add(module);
38  return this;
39  }
44  public void QueueResponse(ClientData client, HttpMessage response)
45  {
46  messageQueue.Enqueue(new Tuple<ClientData, HttpMessage>(client, response));
47  }
48  #endregion
49  #region Interface Implementation
50  void IHandler.ClientRemoved(Server server, ClientData client)
55  {
56 
57  }
63  bool IHandler.HandleClient(Server server, ClientData client)
64  {
65  return false;
66  }
73  bool IHandler.HandleReceivedMessage(Server server, ClientData client, Message message)
74  {
75  HttpMessage httpMessage = new HttpMessage();
76  HttpMessage responseMessage = new HttpMessage();
77  httpMessage.ParseRequest(message.MessageBytes);
78  if(httpMessage.ContainsHeader(HttpMessage.GeneralHeadersEnum.Connection) &&
79  httpMessage[HttpMessage.GeneralHeadersEnum.Connection].ToLower() == "close")
80  {
81  responseMessage[HttpMessage.GeneralHeadersEnum.Connection] = "close";
82  client.ToBeRemoved = true;
83  }
84  else
85  {
86  responseMessage[HttpMessage.GeneralHeadersEnum.Connection] = "keep-alive";
87  }
88  foreach(IHttpModule module in httpModules)
89  {
90  if(module.HandleRequest(server, this, client, httpMessage, ref responseMessage))
91  {
92  break;
93  }
94  }
95  QueueResponse(client, responseMessage);
96  return false;
97  }
104  bool IHandler.HandleSendMessage(Server server, ClientData client, ref Message message)
105  {
106  return false;
107  }
114  bool IHandler.PreHandleReceivedMessage(Server server, ClientData client, ref Message message)
115  {
116  return false;
117  }
121  void IHandler.Tick(Server server)
122  {
123  while (messageQueue.Count > 0)
124  {
125  Tuple<ClientData, HttpMessage> tuple = null;
126  if (messageQueue.TryDequeue(out tuple))
127  {
128  server.QueueMessage(tuple.Item1, tuple.Item2.BuildResponse(true));
129  }
130  }
131  foreach (IHttpModule module in httpModules)
132  {
133  module.Tick(server, this);
134  }
135  }
136  #endregion
137  }
138 }
void QueueResponse(ClientData client, HttpMessage response)
Send a response back to the client.
Definition: HttpHandler.cs:44
Interface for communication handlers.
Definition: IHandler.cs:11
void Tick(Server.Server server, HttpHandler handler)
Perform periodic operations.
Structure containing client information.
Definition: Server.cs:402
Handler for handling server http requests.
Definition: HttpHandler.cs:15
void ClientRemoved(Server server, ClientData client)
Handles the removal of a client from the server.
Basic server class to handle TCP connections.
Definition: Server.cs:20
bool ContainsHeader(ResponseHeadersEnum header)
Check if the message contains a header.
Definition: HttpMessage.cs:500
bool HandleRequest(Server.Server server, HttpHandler handler, ClientData client, HttpMessage request, ref HttpMessage response)
Handle the received request.
HttpHandler AddHttpModule(IHttpModule module)
Add a http module onto the server.
Definition: HttpHandler.cs:35
Definition: Client.cs:14
void ParseRequest(byte[] requestBytes)
Parse the received bytes and populate the message contents.
Definition: HttpMessage.cs:267
Interface for Http modules used by the server http handler.
Definition: IHttpModule.cs:13