-
Notifications
You must be signed in to change notification settings - Fork 0
/
request.py
82 lines (73 loc) · 2.28 KB
/
request.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import urllib.parse
from utils import log
import json
# 定义一个 class 用于保存请求的数据
class Request(object):
def __init__(self, raw_data):
# 只能 split 一次,因为 body 中可能有换行
header, self.body = raw_data.split('\r\n\r\n', 1)
h = header.split('\r\n')
parts = h[0].split()
self.method = parts[0]
path = parts[1]
self.path = ""
self.query = {}
self.parse_path(path)
log('Request: path 和 query', self.path, self.query)
self.headers = {}
self.cookies = {}
self.add_headers(h[1:])
log('Request: headers 和 cookies', self.headers, self.cookies)
def add_headers(self, header):
"""
Cookie: user=xiao
"""
lines = header
for line in lines:
k, v = line.split(': ', 1)
self.headers[k] = v
if 'Cookie' in self.headers:
cookies = self.headers['Cookie']
# 这里用for循环的原因是,有时候Cookie的值并不唯一,有可能存放了用户登录cookie之外的值
for c in cookies.split('; '):
k, v = c.split('=', 1)
self.cookies[k] = v
def form(self):
body = urllib.parse.unquote_plus(self.body)
log('form', self.body)
log('form', body)
args = body.split('&')
f = {}
log('args', args)
for arg in args:
k, v = arg.split('=')
f[k] = v
log('form() 字典', f)
return f
def parse_path(self, path):
"""
输入: /xiao?message=hello&author=xiao
返回
(xiao, {
'message': 'hello',
'author': 'xiao',
})
"""
index = path.find('?')
if index == -1:
self.path = path
self.query = {}
else:
path, query_string = path.split('?', 1)
args = query_string.split('&')
query = {}
for arg in args:
k, v = arg.split('=')
query[k] = v
self.path = path
self.query = query
def json(self):
"""
把 body 中的 json 格式字符串解析成 dict 或者 list 并返回
"""
return json.loads(self.body)