Skip to content

Commit 119c1a2

Browse files
author
meig
committed
add cookie library original code
1 parent deee08f commit 119c1a2

File tree

9 files changed

+511
-0
lines changed

9 files changed

+511
-0
lines changed

pub/session/__init__.py

Whitespace-only changes.

pub/session/check.sh

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
python pylintcode.py > check.log
2+
python err_filter.py > err.log
3+
python warn_filter.py > warn.log
4+
gedit err.log
5+
gedit warn.log

pub/session/cookie_storage.py

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
import urlparse
2+
3+
class PathCookies(object):
4+
def __init__(self,domain,path):
5+
self.domain = domain
6+
self.path = path
7+
self.cookies = {}
8+
9+
class CookieStg(object):
10+
def __init__(self):
11+
# domain --> PathCookies list
12+
self.__domains = {}
13+
14+
def add_cookie_pair(self,domain,path,pair):
15+
domain = domain.lower()
16+
path = path.lower()
17+
if not self.__domains.has_key(domain):
18+
self.__domains[domain] = []
19+
path_list = self.__domains[domain]
20+
exist = False
21+
for item in path_list:
22+
if item.path == path:
23+
item.cookies[pair[0]] = pair[1]
24+
exist = True
25+
break
26+
if not exist:
27+
path_cookies = PathCookies(domain,path)
28+
path_cookies.cookies[pair[0]] = pair[1]
29+
path_list.append(path_cookies)
30+
31+
def del_cookie_item(self,domain,path,cookie_name):
32+
domain = domain.lower()
33+
path = path.lower()
34+
if self.__domains.has_key(domain):
35+
path_list = self.__domains[domain]
36+
for path_cookies in path_list:
37+
if path_cookies.path == path:
38+
if path_cookies.cookies.has_key(cookie_name):
39+
del path_cookies.cookies[cookie_name]
40+
if len(path_cookies.cookies) == 0:
41+
del path_cookies
42+
if len(path_list) == 0:
43+
del path_list
44+
return
45+
def clear_domain(self,domain):
46+
domain = domain.lower()
47+
if self.__domains.has_key(domain):
48+
del self.__domains[domain]
49+
50+
def clear(self):
51+
self.__domains.clear()
52+
53+
def add_cookie_from_http_header(self,line,default_domain):
54+
segs = line.split(";")
55+
domain = default_domain
56+
path = None
57+
cookies = {}
58+
for item in segs:
59+
pos = item.find("=")
60+
if pos > 0 and pos < (len(item)-1):
61+
left = item[:pos]
62+
left = left.strip()
63+
right = item[pos+1:]
64+
right = right.strip()
65+
if left.lower() == "domain":
66+
domain = right
67+
elif left.lower() == "path":
68+
path = right
69+
elif left.lower() == "expires":
70+
pass
71+
else:
72+
cookies[left] = right
73+
if path and domain :
74+
path = path.lower()
75+
domain = domain.lower()
76+
if self.__domains.has_key(domain):
77+
path_list = self.__domains[domain]
78+
exist = False
79+
for path_cookies in path_list:
80+
if path_cookies.path == path:
81+
combine_map(path_cookies.cookies,cookies)
82+
exist = True
83+
if not exist:
84+
path_cookies = PathCookies(domain,path)
85+
path_cookies.cookies = cookies
86+
path_list.append(path_cookies)
87+
else:
88+
path_list = []
89+
path_cookies = PathCookies(domain,path)
90+
path_cookies.cookies = cookies
91+
path_list.append(path_cookies)
92+
self.__domains[domain] = path_list
93+
94+
def gen_header_cookies(self,request_url):
95+
parse_result = urlparse.urlparse(request_url)
96+
domain = parse_result.netloc.lower()
97+
request_path = parse_result.path.lower()
98+
domain_list = []
99+
domain_list.append(domain)
100+
pos = 0
101+
while True:
102+
pos = domain.find(".",pos)
103+
if pos == -1:
104+
break
105+
domain_list.append(domain[pos:])
106+
domain_list.append(domain[pos+1:])
107+
pos += 1
108+
cookie_str = ""
109+
for item in domain_list:
110+
if self.__domains.has_key(item):
111+
path_list = self.__domains[item]
112+
for path_cookies in path_list:
113+
if is_sub_path_i(path_cookies.path,request_path):
114+
cookie_set = translate_map_to_cookie(path_cookies.cookies)
115+
if cookie_set != "":
116+
if cookie_str != "":
117+
cookie_str += "; "
118+
cookie_str += cookie_set
119+
return cookie_str
120+
121+
def print_cookie(self):
122+
for domain in self.__domains.keys():
123+
path_list = self.__domains[domain]
124+
print "%s:" % domain
125+
for path_cookie in path_list:
126+
print "\t%s:" % path_cookie.path
127+
for cookie_key in path_cookie.cookies.keys():
128+
print "\t\t%s=%s" % (cookie_key,path_cookie.cookies[cookie_key])
129+
130+
131+
def combine_map(map1,map2):
132+
for key in map2.keys():
133+
value = map2[key]
134+
map1[key] = value
135+
136+
def translate_map_to_cookie(cookie_dict):
137+
result = ""
138+
for key in cookie_dict.keys():
139+
value = cookie_dict[key]
140+
if result == "":
141+
result = " %s=%s" % (key,value)
142+
else:
143+
result += "; %s=%s" % (key,value)
144+
return result
145+
146+
147+
#ignore character case
148+
def is_sub_path_i(path_parent,path_test):
149+
count = len(path_parent)
150+
if len(path_test) < count:
151+
return False
152+
return path_test[:count] == path_parent
153+
154+
if __name__ == "__main__":
155+
pass

pub/session/err_filter.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
def is_filepath(line_txt):
2+
# return "E:\\" == line_txt[:3]
3+
return line_txt.find("************* Module") != -1
4+
5+
def is_err_line(line_txt):
6+
if is_filepath(line_txt):
7+
return False
8+
return line_txt[:3] == "E: " or line_txt[:2] == "E:"
9+
10+
def is_record_line(line_txt):
11+
if not line_txt or len(line_txt) < 3:
12+
return False
13+
return line_txt[1] == ':'
14+
15+
16+
17+
if __name__ == '__main__':
18+
file_handler = open("check.log","r")
19+
filename = None
20+
line = None
21+
while True:
22+
line = file_handler.readline()
23+
if not line:
24+
break
25+
26+
if is_filepath(line):
27+
filename = line
28+
continue
29+
if is_err_line(line):
30+
if filename:
31+
print filename
32+
filename = None
33+
print line
34+
while True:
35+
line = file_handler.readline()
36+
if not is_record_line(line) or is_err_line(line):
37+
print line
38+
continue
39+
elif is_filepath(line):
40+
filename = line
41+
break
42+
file_handler.close()

pub/session/pylintcode.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import os
2+
3+
for file in os.listdir("."):
4+
filename,ext = os.path.splitext(file)
5+
if ext == ".py":
6+
cmdline = "pylint %s" % file
7+
os.system(cmdline)

pub/session/session.py

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
import cookie_storage
2+
import tornado.httputil
3+
import tornado.httpclient
4+
import urlparse
5+
import copy
6+
import urlparse
7+
8+
def get_domain(url):
9+
result = urlparse.urlparse(url)
10+
return result.netloc.lower()
11+
12+
def create_cookie_header(cookie):
13+
if not cookie or len(cookie) == 0:
14+
cookie_map = {}
15+
else:
16+
cookie_map = {"Cookie":cookie}
17+
return tornado.httputil.HTTPHeaders(cookie_map)
18+
19+
def _create_request(cookie_stg,url,method,headers,body,connect_timeout=10,request_timeout=10):
20+
cookie = cookie_stg.gen_header_cookies(url)
21+
req_headers = create_cookie_header(cookie)
22+
if headers:
23+
for key in headers.keys():
24+
req_headers.add(key,headers[key])
25+
return tornado.httpclient.HTTPRequest(url,method,req_headers,body,None,None,None,connect_timeout,request_timeout)
26+
27+
class HandlerFilter(object):
28+
def __init__(self,handler,filter):
29+
self.__handler = handler
30+
self.__filter = filter
31+
def handle_response(self,response,seq):
32+
self.__filter(response)
33+
self.__handler(response,seq)
34+
35+
36+
class Session(object):
37+
def __init__(self):
38+
self._cookie_stg = cookie_storage.CookieStg()
39+
40+
def _filter_response(self,response):
41+
headers = response.headers
42+
cookie_list = headers.get_list("set-cookie")
43+
domain = get_domain(response.request.url)
44+
if cookie_list:
45+
for line in cookie_list:
46+
self._cookie_stg.add_cookie_from_http_header(line,domain)
47+
48+
def fetch(self,url,method,headers,body,connect_timeout=10,request_timeout=10):
49+
req = _create_request(self._cookie_stg,url,method,headers,body,connect_timeout,request_timeout)
50+
client = tornado.httpclient.HTTPClient()
51+
response = client.fetch(req)
52+
if not response.error:
53+
self._filter_response(response)
54+
if response.code in (301, 302, 303, 307):
55+
new_url = urlparse.urljoin(url,response.headers["Location"])
56+
return self.fetch(new_url,method,headers,body,connect_timeout,request_timeout)
57+
return response
58+
59+
def send_form(self,action,method,data_map,connect_timeout=10,request_timeout=10):
60+
add_header = {"content-type":"application/x-www-form-urlencoded"}
61+
try:
62+
import urllib
63+
args = urllib.urlencode(data_map)
64+
except Exception,e:
65+
return None
66+
if method in ("GET","get"):
67+
url = "%s?%s" % (action,args)
68+
else:
69+
url = action
70+
return self.fetch(url,method,add_header,args,connect_timeout,request_timeout)
71+
72+
def report(self):
73+
self._cookie_stg.print_cookie()
74+
75+
class AsyncSession(Session):
76+
def __init__(self):
77+
self.__last_handler = None
78+
79+
class ResponseFilter(object):
80+
def __init__(self,handler,filter):
81+
self.__handler = handler
82+
self.__filter = filter
83+
def handle_response(self,response):
84+
if not response.error:
85+
self.__filter(response)
86+
if response.code in (301, 302, 303, 307):
87+
new_url = urlparse.urljoin(response.request.url,response.headers["Location"])
88+
new_req = copy.copy(response.request)
89+
new_req.url = new_url
90+
client = tornado.httpclient.AsyncHTTPClient()
91+
client.fetch(new_req,self.handle_response)
92+
return
93+
self.__handler(response)
94+
95+
def fetch(self,url,method,headers,body,response_handler,connect_timeout=10,request_timeout=10):
96+
req = _create_request(self._cookie_stg,url,method,headers,body,connect_timeout,request_timeout)
97+
client = tornado.httpclient.AsyncHTTPClient()
98+
handler = self.ResponseFilter(response_handler,self._filter_response)
99+
client.fetch(req,handler)
100+
return True
101+
102+
def send_form(self,action,method,data_map,reponse_handler,connect_timeout=10,request_timeout=10):
103+
add_header = {"content-type":"application/x-www-form-urlencoded"}
104+
try:
105+
import urllib
106+
args = urllib.urlencode(data_map)
107+
except Exception,e:
108+
return False
109+
if method in ("GET","get"):
110+
url = "%s?%s" % (action,args)
111+
else:
112+
url = action
113+
self.fetch(url,method,add_header,args,reponse_handler,connect_timeout,request_timeout)
114+
return True
115+

0 commit comments

Comments
 (0)