def changequery(url, **kw): """ >>> changequery('http://google.com/search?q=foo', q='bar', x='y') 'http://google.com/search?q=bar&x=y' """ base, params = urldecode(url) params.update(kw) return base + '?' + real_urlencode(params)
def urlencode(data): """ urlencodes the given data dictionary. If any of the value is a file object, data is multipart encoded. @@@ should go into web.browser """ multipart = False for v in data.values(): if isinstance(v, file): multipart = True break if not multipart: return 'application/x-www-form-urlencoded', real_urlencode(data) else: # adopted from http://code.activestate.com/recipes/146306/ def get_content_type(filename): return mimetypes.guess_type( filename)[0] or 'application/octet-stream' def encode(key, value, out): if isinstance(value, file): out.append('--' + BOUNDARY) out.append( 'Content-Disposition: form-data; name="%s"; filename="%s"' % (key, value.name)) out.append('Content-Type: %s' % get_content_type(value.name)) out.append('') out.append(value.read()) elif isinstance(value, list): for v in value: encode(key, v) else: out.append('--' + BOUNDARY) out.append('Content-Disposition: form-data; name="%s"' % key) out.append('') out.append(value) BOUNDARY = "----------ThIs_Is_tHe_bouNdaRY_$" CRLF = '\r\n' out = [] for k, v in data.items(): encode(k, v, out) body = CRLF.join(out) content_type = 'multipart/form-data; boundary=%s' % BOUNDARY return content_type, body
def ol_things(key, value): if oldb.is_supported(): return oldb.query(key, value) else: query = { 'type': '/type/edition', key: value, 'sort': 'last_modified', 'limit': 10 } try: d = dict(query=simplejson.dumps(query)) result = download(get_ol_url() + '/api/things?' + real_urlencode(d)) result = simplejson.loads(result) return result['result'] except IOError: import traceback traceback.print_exc() return []