def check_http_proxy proxy debug_level проверяем http прокси Output st

  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
def check_http_proxy(proxy, debug_level= 0):
''' проверяем http прокси
Output:
(status, time_out)
1 - прозрачный прокси
2 - анонимный прокси
3 - элитный прокси
-1 - не рабочий прокси
-2 - неверный размер страницы
-3 - неверный хеш размера (изменён контент)
-4 - неверный пост-запрос
пока убрал:
-5 - header HTTP_CONNECTION not found
-6 - not keep-alive
'''
logging.info('--- Check http proxy %s' % proxy)
# вставляем пост запрос
post_k= 'ver_pr_str'
post_v= 'verify string ' + str(time.time())
post_vars= {post_k: post_v}
params = urllib.urlencode(post_vars)
# устанавливаем прокси
proxy_handler = urllib2.ProxyHandler({'http': 'http://' + proxy + '/'})
#~ proxy_auth_handler = urllib2.HTTPBasicAuthHandler()
#~ proxy_auth_handler.add_password('realm', 'host', 'username', 'password')
#~ opener = build_opener(proxy_handler, proxy_auth_handler)
opener = urllib2.build_opener(proxy_handler)
# This time, rather than install the OpenerDirector, we use it directly:
#~ opener.open('http://www.example.com/login.html')
tm= OmTimer('1')
# загружаем страницу
try:
page= opener.open(cfg.check_url, params).read(3000)
except:
tm.get()
logging.info('Bad proxy. Not open check url.')
time_out= int(tm.get() * 1000)
return (-1, time_out)
time_out= int(tm.get() * 1000)
page_len= len(page)
# проверяем размер страницы
if page_len < 200 or page_len > 2000:
logging.info('Bad proxy. File size error.')
return (-2, time_out)
if debug_level:
print page
strs= page.split('\n')
# первой строчкой должен идти хеш размера
if strs.pop(0).strip() != md5(str(len(page))).hexdigest():
logging.info('Bad proxy. Size hash error.')
return (-3, time_out)
# получаем переменные запроса
vars= {}
for s in strs:
s= s.strip()
if not s:
continue
t= s.split('\t')
if len(t) != 2:
continue
k, v= t
vars[k.strip()]= v.strip()
# проверяем наличие пост-запроса
if not vars.has_key(post_k):
# нет пост-запроса:
logging.info('Bad proxy. Post request not found.')
return (-4, time_out)
elif vars[post_k] != post_v:
# искажённый пост-запрос
logging.info('Bad proxy. Post request error.')
return (-4, time_out)
#~ # не закрывает ли соединения
#~ if 'HTTP_CONNECTION' not in vars:
#~ # нет заголовка
#~ logging.info('Bad proxy. Header HTTP_CONNECTION not found.')
#~ return (-5, time_out)
#~ if not vars['HTTP_CONNECTION'].lower().count('keep-alive'):
#~ # закрывает соединения
#~ logging.info('Bad proxy. Not keep-alive.')
#~ return (-6, time_out)
# проверяем прозрачность
if page.count(cfg.server_ip):
# присутствует ip
logging.info('Transparent proxy.')
return (1, time_out)
heads= ['HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP', 'HTTP_FORWARDED',]
for k in vars.keys():
if k in heads:
# прозрачный прокси
logging.info('Transparent proxy.')
return (1, time_out)
heads= ['HTTP_VIA', 'HTTP_CACHE_CONTROL', ]
for k in vars.keys():
if k in heads:
# анонимный прокси
logging.info('Anonimus proxy.')
return (2, time_out)
# отлично, прокси прошёл все тесты на элитность :)
logging.info('Elite proxy.')
return (3, time_out)