def request(action, param=None, **params): """ 发送请求数据 """ if param: params.update(param) params.update({'login_token': '***', 'format': 'json'}) logger.info("%s : params:%s", action, params) params['login_token'] = "%s,%s" % (ID, TOKEN) if PROXY: conn = HTTPSConnection(PROXY) conn.set_tunnel(API_SITE, 443) else: conn = HTTPSConnection(API_SITE) conn.request(API_METHOD, '/' + action, urllib.urlencode(params), {"Content-type": "application/x-www-form-urlencoded"}) response = conn.getresponse() res = response.read() conn.close() if response.status < 200 or response.status >= 300: logger.warn('%s : error:%s', action, res) raise Exception(res) else: data = json.loads(res.decode('utf8')) logger.debug('%s : result:%s', action, data) if not data: raise Exception("empty response") elif data.get("status", {}).get("code") == "1": return data else: raise Exception(data.get('status', {}))
def request(self, domain, path, method, data=None): if self.proxy_ip and self.proxy_port: connection = HTTPSConnection(self.proxy_ip, self.proxy_port, timeout=self.request_timeout) connection.set_tunnel(domain) else: connection = HTTPSConnection(domain, timeout=self.request_timeout) response_content = None try: headers = {'User-Agent': self.user_agent} if self.proxy_user and self.proxy_pass: base64_bytes = b64encode( ("%s:%s" % (self.proxy_user, self.proxy_pass)).encode("ascii") ).decode("ascii") headers['Authorization'] = 'Basic %s' % base64_bytes connection.request(method, path, headers=headers, body=data) response = connection.getresponse() # In python3, defaultencoding is utf-8. # In python2, defaultencoding is ascii. response_content = response.read() try: # JSON return json.loads(response_content.decode('utf-8')) except: # XML return ET.fromstring(response_content) except ValueError as e: LOGGER.error("Value error (%s) in response_content: %s", e, response_content) raise APIResponseException(response_content) except (socket.timeout, ssl.SSLError) as e: LOGGER.error("Timed out request on %s, %s: %s", method, path, e) raise APIRequestTimedOutException("Timed out request: %s" % e) finally: connection.close()
def request(param=None, **params): """ 发送请求数据 """ if param: params.update(param) params.update({API.TOKEN_PARAM: '***'}) info("%s/%s : %s", API.SITE, API.ACTION, params) params[API.TOKEN_PARAM] = Config.TOKEN if Config.PROXY: conn = HTTPSConnection(Config.PROXY) conn.set_tunnel(API.SITE, 443) else: conn = HTTPSConnection(API.SITE) conn.request(API.METHOD, '/' + API.ACTION, urlencode(params), {"Content-type": "application/x-www-form-urlencoded"}) response = conn.getresponse() res = response.read().decode('utf8') conn.close() if response.status < 200 or response.status >= 300: warning('%s : error[%d]:%s', API.ACTION, response.status, res) raise Exception(res) else: debug('%s : result:%s', API.ACTION, res) if not res: raise Exception("empty response") elif res[:5] == "nochg" or res[:4] == "good": # No change or success return res else: raise Exception(res)
def request(action, param=None, **params): """ 发送请求数据 """ if param: params.update(param) params.update({'user_token': "%s,%s" % (ID, TOKEN), 'format': 'json'}) log.debug("%s : params:%s", action, params) if PROXY: conn = HTTPSConnection(PROXY) conn.set_tunnel(API_SITE, 443) else: conn = HTTPSConnection(API_SITE) conn.request(API_METHOD, '/' + action, urllib.urlencode(params), { "Content-type": "application/x-www-form-urlencoded", "User-Agent": "DDNS Client/1.0" }) response = conn.getresponse() res = response.read() conn.close() if response.status < 200 or response.status >= 300: raise Exception(res) else: data = json.loads(res.decode('utf8')) if not data: raise Exception("empty response") elif data.get("status", {}).get("code") == "1": return data else: raise Exception(data.get('status', {}))
def request(action, param=None, **params): """ 发送请求数据 """ if param: params.update(param) params = signature(params) info("%s : params:%s", action, params) if PROXY: conn = HTTPSConnection(PROXY) conn.set_tunnel(API_SITE, 443) else: conn = HTTPSConnection(API_SITE) conn.request(API_METHOD, '/api/' + action + '/', urlencode(params), {"Content-type": "application/x-www-form-urlencoded"}) response = conn.getresponse() result = response.read() conn.close() if response.status < 200 or response.status >= 300: raise Exception(result) else: data = jsondecode(result.decode('utf8')) debug('%s : result:%s', action, data) if data.get('code') != 0: raise Exception("api error:", data.get('message')) data = data.get('data') if data is None: raise Exception('response data is none') return data
def request(action, param=None, **params): """ 发送请求数据 """ if param: params.update(param) params = signature(params) logger.info("%s : params:%s", action, params) if PROXY: conn = HTTPSConnection(PROXY) conn.set_tunnel(API_SITE, 443) else: conn = HTTPSConnection(API_SITE) conn.request(API_METHOD, '/api/' + action + '/', urllib.urlencode(params), {"Content-type": "application/x-www-form-urlencoded"}) response = conn.getresponse() result = response.read() conn.close() if response.status < 200 or response.status >= 300: raise Exception(result) else: data = json.loads(result.decode('utf8')) logger.debug('%s : result:%s', action, data) if data.get('code') != 0: raise Exception("api error:", data.get('message')) data = data.get('data') if data is None: raise Exception('response data is none') return data
def request(param=None, **params): """ 发送请求数据 """ if param: params.update(param) params = signature(params) logger.debug("params:%s", params) if PROXY: conn = HTTPSConnection(PROXY) conn.set_tunnel(API_SITE, 443) else: conn = HTTPSConnection(API_SITE) conn.request(API_METHOD, '/', urllib.urlencode(params), {"Content-type": "application/x-www-form-urlencoded"}) response = conn.getresponse() data = response.read() conn.close() if response.status < 200 or response.status >= 300: logger.warn('%s : error:%s', params['Action'], data) raise Exception(data) else: data = json.loads(data.decode('utf8')) logger.debug('%s : result:%s', params['Action'], data) return data
def request(param=None, **params): """ 发送请求数据 """ if param: params.update(param) params = dict((k, params[k]) for k in params if params[k] is not None) params = signature(params) info("%s: %s", API.SITE, params) if Config.PROXY: conn = HTTPSConnection(Config.PROXY) conn.set_tunnel(API.SITE, 443) else: conn = HTTPSConnection(API.SITE) conn.request(API.METHOD, '/', urlencode(params), {"Content-type": "application/x-www-form-urlencoded"}) response = conn.getresponse() data = response.read().decode('utf8') conn.close() if response.status < 200 or response.status >= 300: warning('%s : error[%d]: %s', params['Action'], response.status, data) raise Exception(data) else: data = jsondecode(data) debug('%s : result:%s', params['Action'], data) return data
def request(action, param=None, **params): """ 发送请求数据 """ if param: params.update(param) params.update({API.TOKEN_PARAM: '***', 'format': 'json'}) info("%s/%s : %s", API.SITE, action, params) params[API.TOKEN_PARAM] = "%s,%s" % (ID, TOKEN) if PROXY: conn = HTTPSConnection(PROXY) conn.set_tunnel(API.SITE, 443) else: conn = HTTPSConnection(API.SITE) conn.request(API.METHOD, '/' + action, urlencode(params), {"Content-type": "application/x-www-form-urlencoded"}) response = conn.getresponse() res = response.read() conn.close() if response.status < 200 or response.status >= 300: warning('%s : error:%s', action, res) raise Exception(res) else: data = jsondecode(res.decode('utf8')) debug('%s : result:%s', action, data) if not data: raise Exception("empty response") elif data.get("status", {}).get("code") == "1": return data else: raise Exception(data.get('status', {}))
def request(param=None, **params): """ 发送请求数据 """ if param: params.update(param) params = signature(params) logger.debug("params:%s", params) if PROXY: conn = HTTPSConnection(PROXY) conn.set_tunnel(API_SITE, 443) else: conn = HTTPSConnection(API_SITE) conn.request(API_METHOD, '/', urllib.urlencode(params), {"Content-type": "application/x-www-form-urlencoded"}) response = conn.getresponse() data = response.read() conn.close() if response.status < 200 or response.status >= 300: logger.warn('%s : error:%s', params['Action'], data) raise Exception(data) else: data = json.loads(data.decode('utf8')) logger.debug('%s : result:%s', params['Action'], data) return data
def request(method, action, param=None, **params): """ 发送请求数据 """ if param: params.update(param) params = dict((k, params[k]) for k in params if params[k] is not None) info("%s/%s : %s", API.SITE, action, params) if Config.PROXY: conn = HTTPSConnection(Config.PROXY) conn.set_tunnel(API.SITE, 443) else: conn = HTTPSConnection(API.SITE) if method in ['PUT', 'POST', 'PATCH']: # 从public_v(4,6)获取的IP是bytes类型,在json.dumps时会报TypeError params['content'] = str(params.get('content')) params = jsonencode(params) else: # (GET, DELETE) where DELETE doesn't require params in Cloudflare if params: action += '?' + urlencode(params) params = None if not Config.ID: headers = { "Content-type": "application/json", "Authorization": "Bearer " + Config.TOKEN } else: headers = { "Content-type": "application/json", "X-Auth-Email": Config.ID, "X-Auth-Key": Config.TOKEN } conn.request(method, '/client/v4/zones' + action, params, headers) response = conn.getresponse() res = response.read().decode('utf8') conn.close() if response.status < 200 or response.status >= 300: warning('%s : error[%d]:%s', action, response.status, res) raise Exception(res) else: data = jsondecode(res) debug('%s : result:%s', action, data) if not data: raise Exception("Empty Response") elif data.get('success'): return data.get('result', [{}]) else: raise Exception(data.get('errors', [{}]))
def push_to_sysinf(put_url, info): """ Attempt to post the given URL to the central sysinf server. First, try directly. then try through local Squid proxy, then throught Squid on 'appserver.gwn', then give up. """ headers = {'Content-Type': 'application/json'} sysinf_success = False info['sysinf_access'] = 'direct' json_info = dumps(info) try: # Try to send DIRECTLY to the new sysinf server sysinf = HTTPSConnection('sysinf.getwellnetwork.com', timeout=15) sysinf.request('PUT', put_url, json_info, headers) sysinf.getresponse() sysinf.close() sysinf_success = True except Exception as e: pass if not sysinf_success: try: # Try to send via LOCAL Squid port (if site enforces upstream proxy) to the new sysinf server info['sysinf_access'] = 'local-proxy' json_info = dumps(info) sysinf = HTTPSConnection('localhost', 3128, timeout=15) sysinf.set_tunnel('sysinf.getwellnetwork.com', 443) sysinf.request('PUT', put_url, json_info, headers) sysinf.getresponse() sysinf.close() sysinf_success = True except Exception as e: pass if not sysinf_success: try: # Try to send VIA APPSERVER to the new sysinf server info['sysinf_access'] = 'proxy' json_info = dumps(info) sysinf = HTTPSConnection('appserver.gwn', 3128, timeout=15) sysinf.set_tunnel('sysinf.getwellnetwork.com', 443) sysinf.request('PUT', put_url, json_info, headers) sysinf.getresponse() sysinf.close() sysinf_success = True except Exception as e: pass
def __init__(self, parent, site_customization): InterfaceAction.__init__(self, parent, site_customization) https_proxy = get_proxies(debug=False).get('https', None) if https_proxy: https_address = ':'.join(https_proxy.split(':')[:-1]) https_port = int(https_proxy.split(':')[-1]) goodreads_conn = HTTPSConnection(https_address, https_port) goodreads_conn.set_tunnel('www.goodreads.com', 443) amazon_conn = HTTPSConnection(https_address, https_port) amazon_conn.set_tunnel('www.amazon.com', 443) else: goodreads_conn = HTTPSConnection('www.goodreads.com') amazon_conn = HTTPSConnection('www.amazon.com') self._connections = {'goodreads': goodreads_conn, 'amazon': amazon_conn} self.menu = QMenu(self.gui)
def request(method, action, param=None, **params): """ 发送请求数据 """ if param: params.update(param) info("$s %s : params:%s", action, params) if PROXY: conn = HTTPSConnection(PROXY) conn.set_tunnel(API_SITE, 443) else: conn = HTTPSConnection(API_SITE) if method in ['PUT', 'POST', 'PATCH']: # 从public_v(4,6)获取的IP是bytes类型,在json.dumps时会报TypeError params['content'] = str(params.get('content')) params = jsonencode(params) else: # (GET, DELETE) where DELETE doesn't require params in Cloudflare if params: action += '?' + urlencode(params) params = None conn.request( method, '/client/v4/zones' + action, params, { "Content-type": "application/json", "X-Auth-Email": ID, "X-Auth-Key": TOKEN }) response = conn.getresponse() res = response.read() conn.close() if response.status < 200 or response.status >= 300: raise Exception(res) else: data = jsondecode(res.decode('utf8')) debug('%s : result:%s', action, data) if not data: raise Exception("Empty Response") elif data.get('success'): return data.get('result', [{}]) else: raise Exception(data.get('errors', [{}]))
def __init__(self, parent, site_customization): InterfaceAction.__init__(self, parent, site_customization) https_proxy = get_proxies(debug=False).get('https', None) if https_proxy: https_address = ':'.join(https_proxy.split(':')[:-1]) https_port = int(https_proxy.split(':')[-1]) goodreads_conn = HTTPSConnection(https_address, https_port) goodreads_conn.set_tunnel('www.goodreads.com', 443) amazon_conn = HTTPSConnection(https_address, https_port) amazon_conn.set_tunnel('www.amazon.com', 443) else: goodreads_conn = HTTPSConnection('www.goodreads.com') amazon_conn = HTTPSConnection('www.amazon.com') self._connections = { 'goodreads': goodreads_conn, 'amazon': amazon_conn } self.menu = QMenu(self.gui)
def request(action, param=None, **params): """ 发送请求数据 """ if param: params.update(param) params = dict((k, params[k]) for k in params if params[k] is not None) params.update({API.TOKEN_PARAM: '***', 'format': 'json'}) info("%s/%s : %s", API.SITE, action, params) params[API.TOKEN_PARAM] = "%s,%s" % (Config.ID, Config.TOKEN) params[API.LENGTH] = "3000" #添加参数 if Config.PROXY: conn = HTTPSConnection(Config.PROXY) conn.set_tunnel(API.SITE, 443) else: conn = HTTPSConnection(API.SITE) conn.request( API.METHOD, '/' + action, urlencode(params), { "Content-type": "application/x-www-form-urlencoded", "User-Agent": "DDNS/%s ([email protected])" % environ.get("DDNS_VERSION", "1.0.0") }) response = conn.getresponse() res = response.read().decode('utf8') conn.close() if response.status < 200 or response.status >= 300: warning('%s : error[%d]:%s', action, response.status, res) raise Exception(res) else: data = jsondecode(res) debug('%s : result:%s', action, data) if not data: raise Exception("empty response") elif data.get("status", {}).get("code") == "1": return data else: raise Exception(data.get('status', {}))
def request(method, action, param=None, **params): """ 发送请求数据 """ if param: params.update(param) logger.info("$s %s : params:%s", action, params) if PROXY: conn = HTTPSConnection(PROXY) conn.set_tunnel(API_SITE, 443) else: conn = HTTPSConnection(API_SITE) if method in ['PUT', 'POST', 'PATCH']: # 从public_v(4,6)获取的IP是bytes类型,在json.dumps时会报TypeError params['content'] = str(params.get('content')) params = json.dumps(params) else: # (GET, DELETE) where DELETE doesn't require params in Cloudflare if params: action += '?' + urllib.urlencode(params) params = None conn.request(method, '/client/v4/zones' + action, params, {"Content-type": "application/json", "X-Auth-Email": ID, "X-Auth-Key": TOKEN}) response = conn.getresponse() res = response.read() conn.close() if response.status < 200 or response.status >= 300: raise Exception(res) else: data = json.loads(res.decode('utf8')) logger.debug('%s : result:%s', action, data) if not data: raise Exception("Empty Response") elif data.get('success'): return data.get('result', [{}]) else: raise Exception(data.get('errors', [{}]))
def _new_conn(self): """ Return a fresh HTTPSConnection. """ self.num_connections += 1 if self.proxyURL: headers = {} try: url = urlparse.urlparse(self.proxyURL) if url.password: logger.setConfidentialString(url.password) logger.debug( u"Starting new HTTPS connection (%d) to %s:%d over proxy-url %s" % (self.num_connections, self.host, self.port, self.proxyURL)) conn = HTTPSConnection(host=url.hostname, port=url.port) if url.username and url.password: logger.debug( u"Proxy Authentication detected, setting auth with user: '******'" % url.username) auth = "{username}:{password}".format( username=url.username, password=url.password) headers[ 'Proxy-Authorization'] = 'Basic ' + base64.base64encode( auth) conn.set_tunnel(self.host, self.port, headers) logger.debug(u"Connection established to: %s" % self.host) except Exception as e: logger.logException(e) else: logger.debug(u"Starting new HTTPS connection (%d) to %s:%d" % (self.num_connections, self.host, self.port)) conn = HTTPSConnection(host=self.host, port=self.port) logger.debug(u"Connection established to: %s" % self.host) if self.verifyServerCert or self.verifyServerCertByCa: try: non_blocking_connect_https(conn, self.connectTimeout, self.caCertFile) if not self.verifyServerCertByCa: self.serverVerified = True logger.debug("Server verified.") except ssl_module.SSLError as error: logger.debug(u"Verification failed: {0!r}", error) if self.verifyServerCertByCa: raise OpsiServiceVerificationError( u"Failed to verify server cert by CA: %s" % error) logger.debug("Going to try a connect without caCertFile...") non_blocking_connect_https(conn, self.connectTimeout) except Exception as error: logger.debug(u"Verification failed: {0!r}", error) raise OpsiServiceVerificationError(forceUnicode(error)) self.peerCertificate = getPeerCertificate(conn, asPEM=True) if self.verifyServerCertByCa: logger.debug("Attempting to verify server cert by CA...") try: if self.peerCertificate: commonName = crypto.load_certificate( crypto.FILETYPE_PEM, self.peerCertificate).get_subject().commonName host = self.host if re.search(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$', host): fqdn = socket.getfqdn(host) if fqdn == host: raise OpsiServiceVerificationError( u"Failed to get fqdn for ip %s" % host) host = fqdn if not host or not commonName or (host.lower() != commonName.lower()): raise OpsiServiceVerificationError( u"Host '%s' does not match common name '%s'" % (host, commonName)) self.serverVerified = True else: raise OpsiServiceVerificationError( u"Failed to get peer certificate") except Exception: closeConnection(conn) raise return conn
def request(method, path, param=None, body=None, **params): # path 是不带host但是 前面需要带 / , body json 字符串或者自己从dict转换下 # 也可以自己改成 判断下是不是post 是post params就是body if param: params.update(param) query = urlencode(sorted(params.items())) headers = {"content-type": "application/json"} # 初始化header headers["X-Sdk-Date"] = datetime.strftime(datetime.utcnow(), BasicDateFormat) headers["host"] = API.SITE # 如何后来有需要把header头 key转换为小写 value 删除前导空格和尾随空格 sign_headers = [] for key in headers: sign_headers.append(key.lower()) # 先排序 sign_headers.sort() if body is None: body = "" hex_encode = HexEncodeSHA256Hash(body.encode('utf-8')) # 生成文档中的CanonicalRequest canonical_headers = CanonicalHeaders(headers, sign_headers) # 签名中的path 必须 / 结尾 if path[-1] != '/': sign_path = path + "/" else: sign_path = path canonical_request = "%s\n%s\n%s\n%s\n%s\n%s" % (method.upper( ), sign_path, query, canonical_headers, ";".join(sign_headers), hex_encode) hashed_canonical_request = HexEncodeSHA256Hash( canonical_request.encode('utf-8')) # StringToSign str_to_sign = "%s\n%s\n%s" % (Algorithm, headers['X-Sdk-Date'], hashed_canonical_request) secret = Config.TOKEN # 计算签名 HexEncode(HMAC(Access Secret Key, string to sign)) signature = hmac.new(secret.encode('utf-8'), str_to_sign.encode('utf-8'), digestmod=hashlib.sha256).digest() signature = binascii.hexlify(signature).decode() # 添加签名信息到请求头 auth_header = "%s Access=%s, SignedHeaders=%s, Signature=%s" % ( Algorithm, Config.ID, ";".join(sign_headers), signature) headers['Authorization'] = auth_header # 创建Http请求 if Config.PROXY: conn = HTTPSConnection(Config.PROXY) conn.set_tunnel(API.SITE, 443) else: conn = HTTPSConnection(API.SITE) conn.request(method, API.SCHEME + "://" + API.SITE + path + '?' + query, body, headers) info(API.SCHEME + "://" + API.SITE + path + '?' + query, body) resp = conn.getresponse() data = resp.read().decode('utf8') resp.close() if resp.status < 200 or resp.status >= 300: warning('%s : error[%d]: %s', path, resp.status, data) raise Exception(data) else: data = json.loads(data) debug('%s : result:%s', path, data) return data