MTSC  1.0.5
Build TCP servers out of modules with handlers for communication, exception and logging.
PostModule.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using MTSC.Exceptions;
5 using MTSC.Server;
6 using MTSC.Server.Handlers;
7 
9 {
10  public class PostModule : IHttpModule
11  {
12  private static string urlEncodedHeader = "application/x-www-form-urlencoded";
13  private static string multipartHeader = "multipart/form-data";
14 
15  public event EventHandler<Dictionary<string, string>> FormReceived;
16 
17  #region Private Methods
18  private Dictionary<string, string> ParseFormUrlEncoded(HttpMessage request)
19  {
20  if (!request.ContainsHeader(HttpMessage.EntityHeadersEnum.ContentLength))
21  {
22  throw new InvalidPostFormException("Form is missing content-length header!");
23  }
24  else
25  {
26  Dictionary<string, string> formData = new Dictionary<string, string>();
27  int length = int.Parse(request[HttpMessage.EntityHeadersEnum.ContentLength]);
28  int step = 0, parsedLength = 0;
29  StringBuilder fieldBuilder = new StringBuilder();
30  StringBuilder valueBuilder = new StringBuilder();
31  /*
32  * Parse request body to obtain the form data.
33  * Example of a form: field1=value1&field2=value2
34  */
35  for (int i = 0; i < request.Body.Length; i++)
36  {
37  if(request.Body[i] == '\n')
38  {
39  continue;
40  }
41  else if(step == 0)
42  {
43  parsedLength++;
44  if(request.Body[i] == '=')
45  {
46  step = 1;
47  }
48  else
49  {
50  fieldBuilder.Append((char)request.Body[i]);
51  }
52  }
53  else
54  {
55  parsedLength++;
56  if(request.Body[i] == '&')
57  {
58  step = 0;
59  formData[fieldBuilder.ToString()] = valueBuilder.ToString();
60  fieldBuilder.Clear();
61  valueBuilder.Clear();
62  }
63  else
64  {
65  valueBuilder.Append((char)request.Body[i]);
66  if(parsedLength == length)
67  {
68  formData[fieldBuilder.ToString()] = valueBuilder.ToString();
69  }
70  }
71  }
72  }
73  return formData;
74  }
75  }
76 
77  private Dictionary<string, string> ParseFormMultipart(HttpMessage request)
78  {
79  throw new NotImplementedException("Multipart form parsing not implemented yet.");
80  }
81  #endregion
82 
83  #region Interface Implementation
84  bool IHttpModule.HandleRequest(Server.Server server, HttpHandler handler, ClientData client, HttpMessage request, ref HttpMessage response)
85  {
86  if(request.Method == HttpMessage.MethodEnum.Post &&
87  request.ContainsHeader(HttpMessage.EntityHeadersEnum.ContentType))
88  {
89  if (request[HttpMessage.EntityHeadersEnum.ContentType].Contains(urlEncodedHeader))
90  {
91  Dictionary<string, string> form = ParseFormUrlEncoded(request);
92  FormReceived?.Invoke(this, form);
93  server.LogDebug("Received POST form of " + form.Keys.Count + " keys!");
94  return true;
95  }
96  else if (request[HttpMessage.EntityHeadersEnum.ContentType].Contains(multipartHeader))
97  {
98  Dictionary<string, string> form = ParseFormMultipart(request);
99  FormReceived?.Invoke(this, form);
100  server.LogDebug("Received POST form of " + form.Keys.Count + " keys!");
101  return true;
102  }
103  else
104  {
105  return false;
106  }
107  }
108  else
109  {
110  return false;
111  }
112  }
113 
114  void IHttpModule.Tick(Server.Server server, HttpHandler handler)
115  {
116 
117  }
118  #endregion
119  }
120 }
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
Definition: PostModule.cs:10
Server()
Creates an instance of server with default values.
Definition: Server.cs:68
Basic server class to handle TCP connections.
Definition: Server.cs:20
Exception for invalid post forms.
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.
Definition: Client.cs:14
Interface for Http modules used by the server http handler.
Definition: IHttpModule.cs:13