Пример #1
0
def do_https_query(url, postdata=None, reqheaders=None, digest=None, digesttype='sha256', proxy=None, proxytype=None, timeout=None):
	scheme,netloc,path,query,fragment = urlparse.urlsplit(url)
	if scheme<>'https':
		raise Exception('not an HTTPS query')

	if len(netloc.split('@'))>2:
		raise Exception('username/password not supported')

	hp = netloc.split(':')
	if len(hp)>2 or len(hp)<1:
		raise Exception('netloc must be hostname:port')

	host = hp[0]
	if len(hp)>=2:
		port = int(hp[1])
	else:
		port = 443

	if timeout<>None:
		signal.alarm(timeout)

	s = socket.socket()

	if proxytype<>None:
		s.connect(proxy)
		Proxies.do_proxy_connect(s,proxytype,host,port)
	else:
		s.connect((host,port))

	ctx = OpenSSL.SSL.Context(OpenSSL.SSL.TLSv1_METHOD)
	c = OpenSSL.SSL.Connection(ctx,s)
	c.set_connect_state()
	c.do_handshake()

	if timeout<>None:
		signal.alarm(0)

	if digest<>None:
		cert = c.get_peer_certificate()
		digestgot = cert.digest(digesttype)
		if digestgot<>digest:
			raise Exception('server certificate mismatch (%s)'%digestgot)
	
	result = do_http_query(c, host, path+query, postdata, headers=reqheaders)

	c.close()
	return result