diff -r e402e0b32075 -r c666d265fb95 req.py --- a/req.py Fri Mar 12 15:05:33 2010 +0100 +++ b/req.py Fri Mar 12 16:11:56 2010 +0100 @@ -7,9 +7,10 @@ """ __docformat__ = "restructuredtext en" +from urlparse import urlsplit, urlunsplit from urllib import quote as urlquote, unquote as urlunquote from datetime import time, datetime, timedelta -from cgi import parse_qsl +from cgi import parse_qs, parse_qsl from logilab.common.decorators import cached from logilab.common.deprecation import deprecated @@ -239,7 +240,7 @@ def build_url_params(self, **kwargs): """return encoded params to incorporate them in an URL""" args = [] - for param, values in kwargs.items(): + for param, values in kwargs.iteritems(): if not isinstance(values, (list, tuple)): values = (values,) for value in values: @@ -279,6 +280,25 @@ except UnicodeDecodeError: # might occurs on manually typed URLs yield unicode(key, 'iso-8859-1'), unicode(val, 'iso-8859-1') + + def rebuild_url(self, url, **newparams): + """return the given url with newparams inserted. If any new params + is already specified in the url, it's overriden by the new value + + newparams may only be mono-valued. + """ + if isinstance(url, unicode): + url = url.encode(self.encoding) + schema, netloc, path, query, fragment = urlsplit(url) + query = parse_qs(query) + # sort for testing predictability + for key, val in sorted(newparams.iteritems()): + query[key] = (self.url_quote(val),) + query = '&'.join(u'%s=%s' % (param, value) + for param, values in query.items() + for value in values) + return urlunsplit((schema, netloc, path, query, fragment)) + # bound user related methods ############################################### @cached