/ httpParser.py
httpParser.py
 1  import json
 2  import re
 3  
 4  class HttpParser:
 5      def __init__(self, raw_req):
 6          self.raw_req = raw_req.replace('\r\n', '\n')
 7          self.method = self.raw_req.split(' ')[0]
 8          self.host = (self.raw_req.split('Host: '))[1].split('\n')[0]
 9          self.path = self.raw_req.split(' ')[1]
10          self.headers = self.preParse()[0]
11          self.raw_params = self.preParse()[1]
12          self.params = self.parseParam()
13      
14      def preParse(self):
15          header_line = True
16          first_line = True
17          raw_params = ""
18          headers = {}
19          for line in self.raw_req.split('\n'):
20              # Skipping first line
21              if first_line is True:
22                  first_line = False
23              else:
24                  # Getting headers
25                  if header_line is True:
26                      if line == '':
27                          header_line = False
28                      else :
29                          headers[line.split(': ')[0]] = line.split(': ')[1]
30                  else :
31                      if not raw_params:
32                          raw_params = raw_params + line
33                      else:
34                          raw_params = raw_params + '\n' + line
35          return([headers, raw_params])
36      
37      def parseParam(self):
38          parsed_params = {}
39          if self.raw_params:
40              # "multipart/form-data Form"
41              if "multipart/form-data" in self.headers["Content-Type"]:
42                  boundary = "--" + self.headers["Content-Type"].split('boundary=')[1]
43                  for param in self.raw_params.split(boundary):
44                      if param == "--\n" or param == "": # Stop at the end and escape split()[0] which is empty 
45                          pass
46                      else:
47                          param_info = param.split('\n')[1]
48                          param_name = re.search('Content-Disposition: form-data; name="(.*?)"', param_info).group(1)
49                          param_value = param.split(param_info+"\n")[1][1:-1]
50                          parsed_params[param_name]=param_value
51              # "application/json" Form
52              elif "application/json" in self.headers["Content-Type"]:
53                  parsed_params=json.loads(self.raw_params)
54              # Insert elif to add new content type 
55              #"application/x-www-form-urlencoded" Form
56              else: 
57                  for param in self.raw_params.split('&'):
58                      parsed_params[param.split('=')[0]] = param.split('=')[1]
59          return(parsed_params)