def urlencode(params, encode_list_key=False, array_braces=True): """Urlencode a multidimensional dict. >>> try: ... from urllib.parse import quote, unquote ... except ImportError: ... from urllib import quote, unquote ... >>> unquote(urlencode({'a': {"b": [1, 2, 3]}})) 'a[b][]=1&a[b][]=2&a[b][]=3' >>> unquote(urlencode({'a': {"b": [1, 2, 3]}}, array_braces=False)) 'a[b]=1&a[b]=2&a[b]=3' >>> unquote(urlencode({'a': {"b": [1, 2, 3]}}, encode_list_key=True)) 'a[b][0]=1&a[b][1]=2&a[b][2]=3' """ # Not doing duck typing here. Will make debugging easier. if not isinstance(params, dict): raise TypeError("Only dicts are supported.") params = flatten(params, encode_list_key) url_params = OrderedDict() for param in params: value = param.pop() name = parametrize(param) if isinstance(value, (list, tuple)) and array_braces: name += "[]" url_params[name] = value return urllib_urlencode(url_params, doseq=True)
def postRequestRaw(self, sAction, dParams): """ Posts a request to the test manager and gets the response. The dParams argument is a dictionary of unencoded key-value pairs (will be modified). Raises exception on failure. """ dHeader = \ { 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 'User-Agent': 'TestBoxScript/%s.0 (%s, %s)' % (__version__, utils.getHostOs(), utils.getHostArch()), 'Accept': 'text/plain,application/x-www-form-urlencoded', 'Accept-Encoding': 'identity', 'Cache-Control': 'max-age=0', 'Connection': 'keep-alive', }; sServerPath = '/%s/testboxdisp.py' % (self._oParsedUrl.path.strip('/'),); # pylint: disable=E1101 dParams[constants.tbreq.ALL_PARAM_ACTION] = sAction; sBody = urllib_urlencode(dParams); ##testboxcommons.log2('sServerPath=%s' % (sServerPath,)); try: self._oConn.request('POST', sServerPath, sBody, dHeader); oResponse = self._oConn.getresponse(); oResponse2 = TestBoxResponse(oResponse); except: testboxcommons.log2Xcpt(); raise return oResponse2;
def postRequestRaw(self, sAction, dParams): """ Posts a request to the test manager and gets the response. The dParams argument is a dictionary of unencoded key-value pairs (will be modified). Raises exception on failure. """ dHeader = \ { 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 'User-Agent': 'TestBoxScript/%s.0 (%s, %s)' % (__version__, utils.getHostOs(), utils.getHostArch()), 'Accept': 'text/plain,application/x-www-form-urlencoded', 'Accept-Encoding': 'identity', 'Cache-Control': 'max-age=0', 'Connection': 'keep-alive', } sServerPath = '/%s/testboxdisp.py' % ( self._oParsedUrl.path.strip('/'), ) # pylint: disable=no-member dParams[constants.tbreq.ALL_PARAM_ACTION] = sAction sBody = urllib_urlencode(dParams) ##testboxcommons.log2('sServerPath=%s' % (sServerPath,)); try: self._oConn.request('POST', sServerPath, sBody, dHeader) oResponse = self._oConn.getresponse() oResponse2 = TestBoxResponse(oResponse) except: testboxcommons.log2Xcpt() raise return oResponse2
def head_request(self, url, params=None): if not self.token: logging.debug("No token set in head_request(()") return None if params: url = url + '?' + urllib_urlencode(params) logging.debug('Oauth HEAD request: ' + url) try: response = self.config.module["urlfetch"].head( url=url, headers={'Authorization': 'Bearer ' + self.token}) self.last_response_code = response.status_code self.last_response_message = response.content except (self.config.module["urlfetch"].UrlfetchException, self.config.module["urlfetch"].URLError, self.config.module["urlfetch"].Timeout, self.config.module["urlfetch"].TooManyRedirects): self.last_response_code = 0 self.last_response_message = 'No response' logging.warning("Oauth HEAD failed with exception") return None if response.status_code < 200 or response.status_code > 299: logging.warning('Error when sending HEAD request to Oauth: ' + str(response.status_code) + str(response.content)) return None return response.headers
def AuthorizeTokens(client_id, client_secret, authorization_code): """Obtains OAuth access token and refresh token. This uses the application portion of the "OAuth2 for Installed Applications" flow at https://developers.google.com/accounts/docs/OAuth2InstalledApp#handlingtheresponse Args: client_id: Client ID obtained by registering your app. client_secret: Client secret obtained by registering your app. authorization_code: code generated by Google Accounts after user grants permission. Returns: The decoded response from the Google Accounts server, as a dict. Expected fields include 'access_token', 'expires_in', and 'refresh_token'. """ params = {} params['client_id'] = client_id params['client_secret'] = client_secret params['code'] = authorization_code params['redirect_uri'] = REDIRECT_URI params['grant_type'] = 'authorization_code' request_url = AccountsUrl('o/oauth2/token') response = urllib_urlopen(request_url, urllib_urlencode(params).encode("utf-8")).read() return json.loads(response.decode('utf-8'))
def get_resource(self, path=None, params=None): if not path or len(path) == 0: return None if not params: params = {} if not self.trust or not self.trust["baseuri"] or not self.trust[ "secret"]: return None url = self.trust["baseuri"].strip('/') + '/' + path.strip('/') if params: url = url + '?' + urllib_urlencode(params) headers = { 'Authorization': 'Bearer ' + self.trust["secret"], } logging.debug('Getting trust peer resource at (' + url + ')') try: if self.config.env == 'appengine': response = self.config.module["urlfetch"].fetch( url=url, method=self.config.module["urlfetch"].GET, headers=headers) else: response = self.config.module["urlfetch"].get(url=url, headers=headers) self.last_response_code = response.status_code self.last_response_message = response.content except (self.config.module["urlfetch"].UrlfetchException, self.config.module["urlfetch"].URLError, self.config.module["urlfetch"].Timeout, self.config.module["urlfetch"].TooManyRedirects): logging.debug('Not able to get peer resource') self.last_response_code = 408 return { 'error': { 'code': 408, 'message': 'Unable to communciate with trust peer service.', }, } logging.debug('Get trust peer resource POST response:(' + str(response.status_code) + ') ' + str(response.content)) if response.status_code < 200 or response.status_code > 299: logging.info('Not able to get trust peer resource.') try: result = json.loads(response.content.decode('utf-8', 'ignore')) except (TypeError, ValueError, KeyError): logging.debug( "Not able to parse response when getting resource at(" + url + ")") result = {} return result
def get_request(self, url, params=None): if not self.token: logging.debug("No token set in get_request()") return None if params: url = url + '?' + urllib_urlencode(params) logging.debug('Oauth GET request: ' + url) try: if self.config.env == 'appengine': self.config.module["urlfetch"].set_default_fetch_deadline(60) response = self.config.module["urlfetch"].fetch( url=url, method=self.config.module["urlfetch"].GET, headers={ 'Authorization': 'Bearer ' + self.token, }) else: response = self.config.module["urlfetch"].get( url, headers={ 'Authorization': 'Bearer ' + self.token, }) self.last_response_code = response.status_code self.last_response_message = response.content except (self.config.module["urlfetch"].UrlfetchException, self.config.module["urlfetch"].URLError, self.config.module["urlfetch"].Timeout, self.config.module["urlfetch"].TooManyRedirects): self.last_response_code = 0 self.last_response_message = 'No response' logging.warning("Oauth GET failed with exception") return None if response.status_code < 200 or response.status_code > 299: logging.info('Error when sending GET request to Oauth: ' + str(response.status_code) + str(response.content)) return None links = pagination_links(response) self.next = None self.first = None self.prev = None for link in links: logging.debug('Links:' + link['rel'] + ':' + link['url']) if link['rel'] == 'next': self.next = link['url'] elif link['rel'] == 'first': self.first = link['url'] elif link['rel'] == 'prev': self.prev = link['url'] return json.loads(response.content.decode('utf-8', 'ignore'))
def urlencode(query, doseq=0): """ Same as urllib.urlencode, but supports unicode strings. >>> urlencode({'text':'foo bar'}) 'text=foo+bar' >>> urlencode({'x': [1, 2]}, doseq=True) 'x=1&x=2' """ def convert(value, doseq=False): if doseq and isinstance(value, list): return [convert(v) for v in value] else: return utils.safestr(value) query = dict([(k, convert(v, doseq)) for k, v in query.items()]) return urllib_urlencode(query, doseq=doseq)
def urlencode(query, doseq=0): """ Same as urllib.urlencode, but supports unicode strings. >>> urlencode({'text':'foo bar'}) 'text=foo+bar' >>> urlencode({'x': [1, 2]}, doseq=True) 'x=1&x=2' """ def convert(value, doseq=False): if doseq and isinstance(value, list): return [convert(v) for v in value] else: return utils.safestr(value) query = dict([(k, convert(v, doseq)) for k, v in query.items()]) return urllib_urlencode(query, doseq=doseq)
def oauth_login(request): assert oauth is not None consumer = oauth.Consumer(OAUTH.CONSUMER_KEY.get(), OAUTH.CONSUMER_SECRET.get()) client = oauth.Client(consumer) resp, content = client.request(OAUTH.REQUEST_TOKEN_URL.get(), "POST", body=urllib_urlencode({ 'oauth_callback': 'http://' + request.get_host() + '/login/oauth_authenticated/' })) if resp['status'] != '200': raise Exception(_("Invalid response from OAuth provider: %s") % resp) request.session['request_token'] = dict(cgi.parse_qsl(content)) url = "%s?oauth_token=%s" % (OAUTH.AUTHENTICATE_URL.get(), request.session['request_token']['oauth_token']) return HttpResponseRedirect(url)
def oauth_redirect_uri(self, state='', creator=None): params = { 'response_type': self.config.oauth['response_type'], 'client_id': self.config.oauth['client_id'], 'redirect_uri': self.config.oauth['redirect_uri'], 'scope': self.config.oauth['scope'], 'state': state, } if 'oauth_extras' in self.config.oauth: for k, v in self.config.oauth['oauth_extras'].items(): if isinstance(v, str) and 'dynamic:' in v: if v[8:] == 'creator' and creator: v = creator params[k] = v uri = self.config.oauth['auth_uri'] + "?" + urllib_urlencode(params) logging.debug('OAuth redirect with url: ' + uri + ' and state:' + state) return uri
def _get_escaped_full_path(self, request): """ Django considers "safe" some characters that aren't so for oauthlib. We have to search for them and properly escape. """ parsed = list(urlparse(request.get_full_path())) unsafe = set(c for c in parsed[4]).difference(urlencoded) for c in unsafe: parsed[4] = parsed[4].replace(c, quote(c, safe=b"")) uri = urlsplit(urlunparse(parsed)) query = uri.query params = parse_qsl(query) encoded_params = urllib_urlencode(params, doseq=False) parsed_url = SplitResult(uri.scheme, uri.netloc, uri.path, encoded_params, uri.fragment) return parsed_url.geturl()
def urlencode(params): """Urlencode a multidimensional dict.""" # Not doing duck typing here. Will make debugging easier. if not isinstance(params, dict): raise TypeError("Only dicts are supported.") params = flatten(params) url_params = OrderedDict() for param in params: value = param.pop() name = parametrize(param) if isinstance(value, (list, tuple)): name += "[]" url_params[name] = value return urllib_urlencode(url_params, doseq=True)
def urlencode(params): """Urlencode a multidimensional dict.""" # Not doing duck typing here. Will make debugging easier. if not isinstance(params, dict): raise TypeError("Only dicts are supported.") params = flatten(params) url_params = OrderedDict() for param in params: value = param.pop() name = parametrize(param) if isinstance(value, (list, tuple)): name += "[]" url_params[name] = value return urllib_urlencode(url_params, doseq=True)
def RefreshToken(client_id, client_secret, refresh_token): """Obtains a new token given a refresh token. See https://developers.google.com/accounts/docs/OAuth2InstalledApp#refresh Args: client_id: Client ID obtained by registering your app. client_secret: Client secret obtained by registering your app. refresh_token: A previously-obtained refresh token. Returns: The decoded response from the Google Accounts server, as a dict. Expected fields include 'access_token', 'expires_in', and 'refresh_token'. """ params = {} params['client_id'] = client_id params['client_secret'] = client_secret params['refresh_token'] = refresh_token params['grant_type'] = 'refresh_token' request_url = AccountsUrl('o/oauth2/token') response = urllib_urlopen(request_url, urllib_urlencode(params).encode("utf-8")).read() return json.loads(response.decode('utf-8'))
def urlencode(value): """Urlencode dictionary and return as UTF-8 string.""" return urllib_urlencode(value).encode("utf-8")
def post_request(self, url, params=None, urlencode=False, basic_auth=False): if params: if urlencode: data = urllib_urlencode(params) logging.debug('Oauth POST request with urlencoded payload: ' + url + ' ' + data) else: data = json.dumps(params) logging.debug('Oauth POST request with JSON payload: ' + url + ' ' + data) else: data = None logging.debug('Oauth POST request: ' + url) if urlencode: if self.token: if basic_auth: headers = { 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': 'Basic ' + base64.b64encode( self.token.encode("utf-8")).decode("utf-8"), } else: headers = { 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': 'Bearer ' + self.token, } else: headers = { 'Content-Type': 'application/x-www-form-urlencoded', } else: if self.token: headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + self.token, } else: headers = {'Content-Type': 'application/json'} try: if self.config.env == 'appengine': self.config.module["urlfetch"].set_default_fetch_deadline(20) response = self.config.module["urlfetch"].fetch( url=url, payload=data, method=self.config.module["urlfetch"].POST, headers=headers) else: response = self.config.module["urlfetch"].post(url=url, data=data, headers=headers) self.last_response_code = response.status_code self.last_response_message = response.content except (self.config.module["urlfetch"].UrlfetchException, self.config.module["urlfetch"].URLError, self.config.module["urlfetch"].Timeout, self.config.module["urlfetch"].TooManyRedirects): self.last_response_code = 0 self.last_response_message = 'No response' logging.warning("Oauth POST failed with exception") return None if response.status_code == 204: return {} if response.status_code != 200 and response.status_code != 201: logging.info('Error when sending POST request: ' + str(response.status_code) + str(response.content)) return None logging.debug('Oauth POST response JSON:' + str(response.content)) return json.loads(response.content.decode('utf-8', 'ignore'))
def urlencode(items): """A Unicode-safe URLencoder.""" try: return urllib_urlencode(items) except UnicodeEncodeError: return urllib_urlencode([(k, force_bytes(v)) for k, v in items])