def to_postdata(params): """Serialize as post data for a POST request.""" d = {} for k, v in params.iteritems(): d[k.encode('utf-8')] = to_utf8_optional_iterator(v) # tell urlencode to deal with sequence values and map them correctly # to resulting querystring. for example self["k"] = ["v1", "v2"] will # result in 'k=v1&k=v2' and not k=%5B%27v1%27%2C+%27v2%27%5D return urllib.urlencode(d, True).replace('+', '%20')
def get_normalized_parameters(self): """ Return a string that contains the parameters that must be signed. """ items = [] for key, value in self.items(): if key == 'oauth_signature': continue # 1.0a/9.1.1 states that kvp must be sorted by key, then by value, # so we unpack sequence values into multiple items for sorting. if isinstance(value, STRING_TYPES): items.append( (oauth2.to_utf8_if_string(key), oauth2.to_utf8(value)) ) else: try: value = list(value) except TypeError as e: assert 'is not iterable' in str(e) items.append( (oauth2.to_utf8_if_string(key), oauth2.to_utf8_if_string(value)) ) else: items.extend( (oauth2.to_utf8_if_string(key), oauth2.to_utf8_if_string(item)) for item in value ) # Include any query string parameters from the provided URL query = urlparse(self.url)[4] url_items = self._split_url_string(query).items() url_items = [ (oauth2.to_utf8(k), oauth2.to_utf8_optional_iterator(v)) for k, v in url_items if k != 'oauth_signature' ] # Merge together URL and POST parameters. # Eliminates parameters duplicated between URL and POST. items_dict = {} for k, v in items: items_dict.setdefault(k, []).append(v) for k, v in url_items: if not (k in items_dict and v in items_dict[k]): items.append((k, v)) items.sort() encoded_str = urlencode(items, True) # Encode signature parameters per Oauth Core 1.0 protocol # spec draft 7, section 3.6 # (http://tools.ietf.org/html/draft-hammer-oauth-07#section-3.6) # Spaces must be encoded with "%20" instead of "+" return encoded_str.replace('+', '%20').replace('%7E', '~')
def to_postdata(request): """Serialize as post data for a POST request. This serializes data and params""" # Headers and data together in a dictionary if request.data is None: request.data = [] data_and_params = dict(request.data + request.params.items()) d = {} for k, v in data_and_params.iteritems(): d[k.encode('utf-8')] = to_utf8_optional_iterator(v) # tell urlencode to deal with sequence values and map them correctly # to resulting querystring. for example self["k"] = ["v1", "v2"] will # result in 'k=v1&k=v2' and not k=%5B%27v1%27%2C+%27v2%27%5D return urllib.urlencode(d, True).replace('+', '%20')