-
Notifications
You must be signed in to change notification settings - Fork 0
/
uxreq.py
146 lines (98 loc) · 3.38 KB
/
uxreq.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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
from untwisted.utils.stdio import LOAD, CLOSE
from untwisted.network import Spin, xmap, get_event, spawn, zmap
from urllib import urlencode
HTTP_RESPONSE = get_event()
class HttpClient(object):
def __init__(self, spin):
"""
"""
xmap(spin, LOAD, self.get_header)
self.spin = spin
self.header = ''
self.data = ''
self.response = ''
self.size = 0
def get_header(self, spin, data):
"""
"""
DELIM = '\r\n\r\n'
self.header = self.header + data
if not DELIM in data:
return
self.header, self.data = self.header.split(DELIM, 1)
self.response, self.header = self.split_header(self.header)
zmap(spin, LOAD, self.get_header)
self.check_data_existence()
def split_header(self, data):
"""
"""
DELIM_LINE = '\r\n'
DELIM_PAIR = ': '
DELIM_RESPONSE = ' '
data = data.split(DELIM_LINE)
response = data[0]
response = response.split(DELIM_RESPONSE)
header = dict()
del data[0]
for ind in data:
key, value = ind.split(DELIM_PAIR, 1)
header[key] = value
return response, header
def check_data_existence(self):
"""
"""
try:
self.size = int(self.header['Content-Length'])
except KeyError:
pass
# Assume there is a body size larger than 0.
# Since we will call check_data_size anyway.
xmap(self.spin, LOAD, self.get_data)
self.check_data_size()
def spawn_response(self):
"""
"""
spawn(self.spin, HTTP_RESPONSE, self.response[0], self.response[1],
self.response[2], self.header, self.data)
self.__init__(self.spin)
def get_data(self, spin, data):
"""
"""
self.data = self.data + data
self.check_data_size()
def check_data_size(self):
"""
"""
if not len(self.data) >= self.size:
return
zmap(self.spin, LOAD, self.get_data)
self.spawn_response()
class HttpCode(object):
def __init__(self, spin):
xmap(spin, HTTP_RESPONSE, self.spawn_method)
def spawn_method(self, spin, version, code, reason, header, message):
spawn(spin, code, version, reason, header, message)
def get(rsc, args={}, version='HTTP/1.1', header={}):
args = '?%s' % urlencode(args) if args else ''
data = 'GET %s%s %s\r\n' % (rsc, args, version)
for key, value in header.iteritems():
data = data + '%s: %s\r\n' % (key, value)
data = data + '\r\n'
return data
def post_data(rsc, data={}, version='HTTP/1.1', header={}):
params = urlencode(data)
data = 'POST %s %s\r\n' % (rsc, version)
header['Content-Type'] = 'application/x-www-form-urlencoded'
header['Content-Length'] = len(params)
for key, value in header.iteritems():
data = data + '%s: %s\r\n' % (key, value)
data = data + '\r\n'
data = data + params
return data
def auth(username, password):
from base64 import encodestring
base = encodestring('%s:%s' % (username, password))
base = base.replace('\n', '')
return "Basic %s" % base
def post_file():
pass