forked from XX-net/XX-Net
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhttp_common.py
More file actions
114 lines (93 loc) · 3.2 KB
/
Copy pathhttp_common.py
File metadata and controls
114 lines (93 loc) · 3.2 KB
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
import time
import collections
import Queue
from xlog import getLogger
xlog = getLogger("gae_proxy")
class GAE_Exception(Exception):
def __init__(self, type, message):
xlog.debug("GAE_Exception %r %r", type, message)
self.type = type
self.message = message
class BaseResponse(object):
def __init__(self, status=601, reason="", headers={}, body=""):
self.status = status
self.reason = reason
self.headers = headers
class Task(object):
def __init__(self, headers, body, queue):
self.headers = headers
self.body = body
self.queue = queue
self.start_time = time.time()
self.trace_time = {}
self.body_queue = Queue.Queue()
self.body_len = 0
self.body_readed = 0
self.content_length = None
self.read_buffer = ""
def put_data(self, data):
self.body_queue.put(data)
self.body_len += len(data)
def read(self, size=None):
# fail or cloe if return ""
if self.body_readed == self.content_length:
return ""
if size:
while len(self.read_buffer) < size:
data = self.body_queue.get(block=True)
if not data:
return ""
self.read_buffer += data
data = self.read_buffer[:size]
self.read_buffer = self.read_buffer[size:]
else:
if len(self.read_buffer):
data = self.read_buffer
self.read_buffer = ""
else:
data = self.body_queue.get(block=True)
self.body_readed += len(data)
return data
def set_state(self, stat):
time_now = time.time()
self.trace_time[time_now] = stat
return time_now
def get_trace(self):
tr_list = collections.OrderedDict(sorted(self.trace_time.items()))
out_list = []
last_time = self.start_time
for t, stat in tr_list.items():
time_diff = int((t - last_time) * 1000)
last_time = t
if time_diff > 1:
out_list.append("%s:%d" % (stat, time_diff))
return ",".join(out_list)
def response_fail(self, reason=""):
err_text = "response_fail:%s" % reason
xlog.debug(err_text)
res = BaseResponse(body=err_text)
self.queue.put(res)
class HTTP_worker(object):
def __init__(self, ssl_sock, close_cb, retry_task_cb):
self.ssl_sock = ssl_sock
self.init_rtt = ssl_sock.handshake_time / 3
self.rtt = self.init_rtt
self.ip = ssl_sock.ip
self.close_cb = close_cb
self.retry_task_cb = retry_task_cb
self.accept_task = True
self.keep_running = True
self.processed_tasks = 0
self.speed_history = []
def report_speed(self, speed, body_length):
if body_length < 10 * 1024:
return
self.speed_history.append(speed)
if len(self.speed_history) > 10:
self.speed_history.pop(0)
def close(self, reason):
self.accept_task = False
self.keep_running = False
self.ssl_sock.close()
xlog.debug("%s worker close:%s", self.ip, reason)
self.close_cb(self)