-
Notifications
You must be signed in to change notification settings - Fork 0
/
request.py
90 lines (80 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
83
84
85
86
87
88
89
90
# 定义一个 class 用于保存请求的数据
import json
import urllib
from utils import log
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:])
self.add_cookies()
log('Request: headers 和 cookies', self.headers, self.cookies)
def add_cookies(self):
"""r
Cookie:user=yang;login_time=xx;
=>
{
'user':'yang',
'login_time':'xx',
}
"""
cookies = self.headers.get('Cookie', '')
kvs = cookies.split('; ')
log('cookie', kvs)
for kv in kvs:
if '=' in kv:
k, v = kv.split('=')
self.cookies[k] = v
def add_headers(self, header):
"""
Accept-Lanyangge: zh-CN,zh;q=0.8
"""
lines = header
for line in lines:
k, v = line.split(': ', 1)
self.headers[k] = v
def form(self):
body = urllib.parse.unquote(self.body)
args = body.split('&')
f = {}
for arg in args:
k, v = arg.split('=')
f[k] = v
return f
def parse_path(self, path):
"""
输入: /yang?message=hello&author=yang
返回
(yang, {
'message': 'hello',
'author': 'yang',
})
"""
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)