/ 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)