diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index f5d4a2e628..5f441311e4 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -320,7 +320,7 @@ def extract(path, dir): def get_proxies(debug=True): - from urllib import getproxies + from polyglot.urllib import getproxies proxies = getproxies() for key, proxy in list(proxies.items()): if not proxy or '..' in proxy or key == 'auto': @@ -382,10 +382,10 @@ def get_proxy_info(proxy_scheme, proxy_string): is not available in the string. If an exception occurs parsing the string this method returns None. ''' - import urlparse + from polyglot.urllib import urlparse try: proxy_url = u'%s://%s'%(proxy_scheme, proxy_string) - urlinfo = urlparse.urlparse(proxy_url) + urlinfo = urlparse(proxy_url) ans = { u'scheme': urlinfo.scheme, u'hostname': urlinfo.hostname, diff --git a/src/calibre/db/cli/main.py b/src/calibre/db/cli/main.py index 1a957e0820..9833d919d4 100644 --- a/src/calibre/db/cli/main.py +++ b/src/calibre/db/cli/main.py @@ -8,8 +8,6 @@ import httplib import json import os import sys -from urllib import urlencode -from urlparse import urlparse, urlunparse from calibre import browser, prints from calibre.constants import __appname__, __version__, iswindows @@ -19,6 +17,7 @@ from calibre.utils.config import OptionParser, prefs from calibre.utils.localization import localize_user_manual_link from calibre.utils.lock import singleinstance from calibre.utils.serialize import MSGPACK_MIME +from polyglot.urllib import urlencode, urlparse, urlunparse COMMANDS = ( 'list', 'add', 'remove', 'add_format', 'remove_format', 'show_metadata', diff --git a/src/calibre/db/delete_service.py b/src/calibre/db/delete_service.py index c33dda1f7c..6698f4680c 100644 --- a/src/calibre/db/delete_service.py +++ b/src/calibre/db/delete_service.py @@ -8,11 +8,11 @@ __copyright__ = '2013, Kovid Goyal ' import os, tempfile, shutil, errno, time, atexit from threading import Thread -from Queue import Queue from calibre.ptempfile import remove_dir from calibre.utils.filenames import remove_dir_if_empty from calibre.utils.recycle_bin import delete_tree, delete_file +from polyglot.queue import Queue class DeleteService(Thread): @@ -159,4 +159,3 @@ def has_jobs(): if __ds is not None: return (not __ds.requests.empty()) or __ds.requests.unfinished_tasks return False - diff --git a/src/calibre/devices/smart_device_app/driver.py b/src/calibre/devices/smart_device_app/driver.py index 7d60bf2916..7d52dc76c8 100644 --- a/src/calibre/devices/smart_device_app/driver.py +++ b/src/calibre/devices/smart_device_app/driver.py @@ -11,7 +11,6 @@ import socket, select, json, os, traceback, time, sys, random import posixpath from collections import defaultdict import hashlib, threading -import Queue from functools import wraps from errno import EAGAIN, EINTR @@ -39,6 +38,7 @@ from calibre.utils.mdns import (publish as publish_zeroconf, unpublish as unpublish_zeroconf, get_all_ips) from calibre.utils.socket_inheritance import set_socket_inherit from polyglot.builtins import unicode_type +from polyglot import queue def synchronous(tlockname): @@ -103,7 +103,7 @@ class ConnectionListener(Thread): {'otherDevice': d.get_gui_name()}) self.driver._send_byte_string(device_socket, (b'%d' % len(s)) + s) sock.close() - except Queue.Empty: + except queue.Empty: pass if getattr(self.driver, 'broadcast_socket', None) is not None: @@ -148,7 +148,7 @@ class ConnectionListener(Thread): try: self.driver.connection_queue.put_nowait(device_socket) - except Queue.Full: + except queue.Full: self._close_socket(device_socket) device_socket = None self.driver._debug('driver is not answering') @@ -993,7 +993,7 @@ class SMART_DEVICE_APP(DeviceConfig, DevicePlugin): raise except: pass - except Queue.Empty: + except queue.Empty: self.is_connected = False return self if self.is_connected else None return None @@ -1969,7 +1969,7 @@ class SMART_DEVICE_APP(DeviceConfig, DevicePlugin): message = 'attaching port to broadcast socket failed. This is not fatal.' self._debug(message) - self.connection_queue = Queue.Queue(1) + self.connection_queue = queue.Queue(1) self.connection_listener = ConnectionListener(self) self.connection_listener.start() return message diff --git a/src/calibre/ebooks/comic/input.py b/src/calibre/ebooks/comic/input.py index a636069fbb..fb6db0d152 100755 --- a/src/calibre/ebooks/comic/input.py +++ b/src/calibre/ebooks/comic/input.py @@ -8,7 +8,6 @@ Based on ideas from comiclrf created by FangornUK. ''' import os, traceback, time -from Queue import Empty from calibre import extract, prints, walk from calibre.constants import filesystem_encoding @@ -17,6 +16,7 @@ from calibre.utils.icu import numeric_sort_key from calibre.utils.ipc.server import Server from calibre.utils.ipc.job import ParallelJob from polyglot.builtins import unicode_type +from polyglot.queue import Empty # If the specified screen has either dimension larger than this value, no image # rescaling is done (we assume that it is a tablet output profile) diff --git a/src/calibre/ebooks/conversion/plugins/chm_input.py b/src/calibre/ebooks/conversion/plugins/chm_input.py index fc0af0552f..01b81bbbec 100644 --- a/src/calibre/ebooks/conversion/plugins/chm_input.py +++ b/src/calibre/ebooks/conversion/plugins/chm_input.py @@ -108,7 +108,7 @@ class CHMInput(InputFormatPlugin): def _create_html_root(self, hhcpath, log, encoding): from lxml import html - from urllib import unquote as _unquote + from polyglot.urllib import unquote as _unquote from calibre.ebooks.oeb.base import urlquote from calibre.ebooks.chardet import xml_to_unicode hhcdata = self._read_file(hhcpath) diff --git a/src/calibre/ebooks/conversion/plugins/html_input.py b/src/calibre/ebooks/conversion/plugins/html_input.py index fa5e211e4d..e04b82b221 100644 --- a/src/calibre/ebooks/conversion/plugins/html_input.py +++ b/src/calibre/ebooks/conversion/plugins/html_input.py @@ -247,7 +247,7 @@ class HTMLInput(InputFormatPlugin): return link, frag def resource_adder(self, link_, base=None): - from urllib import quote + from polyglot.urllib import quote link, frag = self.link_to_local_path(link_, base=base) if link is None: return link_ diff --git a/src/calibre/ebooks/conversion/plugins/html_output.py b/src/calibre/ebooks/conversion/plugins/html_output.py index 4c82974460..15d2f02c07 100644 --- a/src/calibre/ebooks/conversion/plugins/html_output.py +++ b/src/calibre/ebooks/conversion/plugins/html_output.py @@ -47,7 +47,7 @@ class HTMLOutput(OutputFormatPlugin): Generate table of contents ''' from lxml import etree - from urllib import unquote + from polyglot.urllib import unquote from calibre.ebooks.oeb.base import element from calibre.utils.cleantext import clean_xml_chars @@ -86,7 +86,7 @@ class HTMLOutput(OutputFormatPlugin): from lxml import etree from calibre.utils import zipfile from templite import Templite - from urllib import unquote + from polyglot.urllib import unquote from calibre.ebooks.html.meta import EasyMeta # read template files diff --git a/src/calibre/ebooks/conversion/plugins/oeb_output.py b/src/calibre/ebooks/conversion/plugins/oeb_output.py index 72518e264b..82ae031c4d 100644 --- a/src/calibre/ebooks/conversion/plugins/oeb_output.py +++ b/src/calibre/ebooks/conversion/plugins/oeb_output.py @@ -21,7 +21,7 @@ class OEBOutput(OutputFormatPlugin): recommendations = {('pretty_print', True, OptionRecommendation.HIGH)} def convert(self, oeb_book, output_path, input_plugin, opts, log): - from urllib import unquote + from polyglot.urllib import unquote from lxml import etree self.log, self.opts = log, opts diff --git a/src/calibre/ebooks/docx/writer/links.py b/src/calibre/ebooks/docx/writer/links.py index 6293be50c5..4e6315d738 100644 --- a/src/calibre/ebooks/docx/writer/links.py +++ b/src/calibre/ebooks/docx/writer/links.py @@ -8,9 +8,9 @@ __copyright__ = '2015, Kovid Goyal ' import posixpath, re from uuid import uuid4 -from urlparse import urlparse from calibre.utils.filenames import ascii_text +from polyglot.urllib import urlparse def start_text(tag, prefix_len=0, top_level=True): diff --git a/src/calibre/ebooks/html/input.py b/src/calibre/ebooks/html/input.py index 723fcc3688..6bd6183821 100644 --- a/src/calibre/ebooks/html/input.py +++ b/src/calibre/ebooks/html/input.py @@ -13,13 +13,13 @@ Input plugin for HTML or OPF ebooks. ''' import os, re, sys, errno as gerrno -from urlparse import urlparse, urlunparse from calibre.ebooks.oeb.base import urlunquote from calibre.ebooks.chardet import detect_xml_encoding from calibre.constants import iswindows from calibre import unicode_path, as_unicode, replace_entities from polyglot.builtins import unicode_type +from polyglot.urllib import urlparse, urlunparse class Link(object): diff --git a/src/calibre/ebooks/htmlz/oeb2html.py b/src/calibre/ebooks/htmlz/oeb2html.py index f27a7308d5..ba619d1842 100644 --- a/src/calibre/ebooks/htmlz/oeb2html.py +++ b/src/calibre/ebooks/htmlz/oeb2html.py @@ -15,7 +15,6 @@ import re from functools import partial from lxml import html -from urlparse import urldefrag from calibre import prepare_string_for_xml from calibre.ebooks.oeb.base import ( @@ -23,6 +22,7 @@ from calibre.ebooks.oeb.base import ( from calibre.ebooks.oeb.stylizer import Stylizer from calibre.utils.logging import default_log from polyglot.builtins import unicode_type, string_or_bytes +from polyglot.urllib import urldefrag SELF_CLOSING_TAGS = {'area', 'base', 'basefont', 'br', 'hr', 'input', 'img', 'link', 'meta'} diff --git a/src/calibre/ebooks/lit/reader.py b/src/calibre/ebooks/lit/reader.py index b487c673a1..4cef2e9083 100644 --- a/src/calibre/ebooks/lit/reader.py +++ b/src/calibre/ebooks/lit/reader.py @@ -9,8 +9,6 @@ __copyright__ = '2008, Kovid Goyal ' \ 'and Marshall T. Vandegrift ' import io, struct, os, functools, re -from urlparse import urldefrag -from urllib import unquote as urlunquote from lxml import etree @@ -22,6 +20,7 @@ from calibre.ebooks.oeb.reader import OEBReader from calibre.ebooks import DRMError from calibre import plugins from polyglot.builtins import codepoint_to_chr, unicode_type, string_or_bytes, range +from polyglot.urllib import unquote as urlunquote, urldefrag lzx, lxzerror = plugins['lzx'] msdes, msdeserror = plugins['msdes'] diff --git a/src/calibre/ebooks/lit/writer.py b/src/calibre/ebooks/lit/writer.py index b5256101b8..ecc69ab748 100644 --- a/src/calibre/ebooks/lit/writer.py +++ b/src/calibre/ebooks/lit/writer.py @@ -17,8 +17,6 @@ import copy import uuid import functools import numbers -from urlparse import urldefrag -from urllib import unquote as urlunquote from lxml import etree from calibre.ebooks.lit.reader import DirectoryEntry import calibre.ebooks.lit.maps as maps @@ -33,6 +31,7 @@ from calibre import plugins msdes, msdeserror = plugins['msdes'] import calibre.ebooks.lit.mssha1 as mssha1 from polyglot.builtins import codepoint_to_chr, unicode_type, string_or_bytes, range +from polyglot.urllib import urldefrag, unquote __all__ = ['LitWriter'] @@ -521,7 +520,7 @@ class LitWriter(object): media_type = XHTML_MIME elif media_type in OEB_STYLES: media_type = CSS_MIME - href = urlunquote(item.href) + href = unquote(item.href) item.offset = offset \ if state in ('linear', 'nonlinear') else 0 data.write(pack(' 2: file=sys.stderr) raise SystemExit(1) -import time, BaseHTTPServer, os, sys, re, SocketServer +import time, os, sys, re, SocketServer from threading import Lock, local -from SimpleHTTPServer import SimpleHTTPRequestHandler +from polyglot.http_server import BaseHTTPServer, SimpleHTTPRequestHandler # Compiler {{{ diff --git a/src/calibre/utils/sftp.py b/src/calibre/utils/sftp.py deleted file mode 100644 index 07a66917da..0000000000 --- a/src/calibre/utils/sftp.py +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env python2 -from __future__ import print_function -__license__ = 'GPL v3' -__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' -__docformat__ = 'restructuredtext en' - -''' -Create a file handle to a remote file over the sftp protocol. -''' - -import sys, socket, getpass -from urlparse import urlparse -from binascii import hexlify - -import paramiko - - -def agent_auth(transport, username): - """ - Attempt to authenticate to the given transport using any of the private - keys available from an SSH agent. - """ - - agent = paramiko.Agent() - agent_keys = agent.get_keys() - if len(agent_keys) == 0: - return - - for key in agent_keys: - print('Trying ssh-agent key %s' % hexlify(key.get_fingerprint()), end=' ') - try: - transport.auth_publickey(username, key) - print('... success!') - return True - except paramiko.SSHException: - print('... failed.') - return False - - -def portable_getpass(username, hostname, retry): - return getpass.getpass('%sPlease enter the password for %s on %s: '%( - 'Incorrect password. ' if retry else '', username, hostname)) - - -def password_auth(transport, username, hostname, getpw=portable_getpass): - for i in range(3): - pw = getpw(username, hostname, i>0) - transport.auth_password(username, pw) - if transport.is_authenticated(): - return True - return False - - -def connect_to_url(url, getpw=portable_getpass, mode='r+', bufsize=-1): - protocol, host, path = urlparse(url)[:3] - if protocol != 'sftp': - raise ValueError(_('URL must have the scheme sftp')) - try: - username, host = host.split('@') - except: - raise ValueError(_('host must be of the form user@hostname')) - port = 22 - if ':' in host: - host, port = host.split(':') - port = int(port) - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - sock.connect((host, port)) - t = paramiko.Transport(sock) - try: - t.start_client() - except: - raise Exception(_('Failed to negotiate SSH session: ') + str(t.get_exception())) - if not agent_auth(t, username): - if not password_auth(t, username, host, getpw): - raise ValueError(_('Failed to authenticate with server: %s')%url) - sftp = paramiko.SFTPClient.from_transport(t) - return sftp, sftp.open(path, mode=mode, bufsize=bufsize) - - -def main(args=sys.argv): - f = connect_to_url(args[1])[-1] - print(f.read()) - f.seek(0, 2) - print(f.tell()) - f.close() - return 0 - - -if __name__ == '__main__': - sys.exit(main()) diff --git a/src/calibre/utils/threadpool.py b/src/calibre/utils/threadpool.py index 9d6503173a..8ed716743c 100644 --- a/src/calibre/utils/threadpool.py +++ b/src/calibre/utils/threadpool.py @@ -48,7 +48,7 @@ __license__ = 'Python license' # standard library modules import threading -import Queue +from polyglot import queue # exceptions @@ -75,7 +75,7 @@ class WorkerThread(threading.Thread): def __init__(self, requestsQueue, resultsQueue, **kwds): """Set up thread in daemonic mode and start it immediatedly. - requestsQueue and resultQueue are instances of Queue.Queue passed + requestsQueue and resultQueue are instances of queue.Queue passed by the ThreadPool class when it creates a new worker thread. """ @@ -174,8 +174,8 @@ class ThreadPool: more work requests in it (see putRequest method). """ - self.requestsQueue = Queue.Queue(q_size) - self.resultsQueue = Queue.Queue() + self.requestsQueue = queue.Queue(q_size) + self.resultsQueue = queue.Queue() self.workers = [] self.workRequests = {} self.createWorkers(num_workers) @@ -223,7 +223,7 @@ class ThreadPool: (request.exception and request.exc_callback): request.callback(request, result) del self.workRequests[request.requestID] - except Queue.Empty: + except queue.Empty: break def wait(self, sleep=0): diff --git a/src/calibre/web/__init__.py b/src/calibre/web/__init__.py index a9b35a3749..82d8a2e47c 100644 --- a/src/calibre/web/__init__.py +++ b/src/calibre/web/__init__.py @@ -7,12 +7,11 @@ class Recipe(object): def get_download_filename_from_response(response): - from urlparse import urlparse - from urllib2 import unquote as urllib2_unquote + from polyglot.urllib import unquote, urlparse filename = last_part_name = '' try: purl = urlparse(response.geturl()) - last_part_name = urllib2_unquote(purl.path.split('/')[-1]) + last_part_name = unquote(purl.path.split('/')[-1]) disposition = response.info().get('Content-disposition', '') for p in disposition.split(';'): if 'filename' in p: @@ -25,7 +24,7 @@ def get_download_filename_from_response(response): filename = filename[1:] if filename[-1] in ('\'', '"'): filename = filename[:-1] - filename = urllib2_unquote(filename) + filename = unquote(filename) break except Exception: import traceback diff --git a/src/calibre/web/feeds/news.py b/src/calibre/web/feeds/news.py index 9ca3aae8c7..8b684d0048 100644 --- a/src/calibre/web/feeds/news.py +++ b/src/calibre/web/feeds/news.py @@ -7,7 +7,7 @@ Defines various abstract base classes that can be subclassed to create powerful __docformat__ = "restructuredtext en" -import os, time, traceback, re, urlparse, sys, io +import os, time, traceback, re, sys, io from collections import defaultdict from functools import partial from contextlib import nested, closing @@ -32,6 +32,7 @@ from calibre.utils.img import save_cover_data_to, add_borders_to_image, image_to from calibre.utils.localization import canonicalize_lang from calibre.utils.logging import ThreadSafeWrapper from polyglot.builtins import unicode_type, string_or_bytes +from polyglot.urllib import urlparse, urlsplit class LoginFailed(ValueError): @@ -652,7 +653,7 @@ class BasicNewsRecipe(Recipe): download an article. ''' try: - parts = urlparse.urlparse(url) + parts = urlparse(url) except Exception: self.log.error('Failed to parse url: %r, ignoring' % url) return frozenset() @@ -1092,7 +1093,7 @@ class BasicNewsRecipe(Recipe): if feed.image_url in self.image_map: feed.image_url = self.image_map[feed.image_url] else: - bn = urlparse.urlsplit(feed.image_url).path + bn = urlsplit(feed.image_url).path if bn: bn = bn.rpartition('/')[-1] if bn: diff --git a/src/calibre/web/fetch/simple.py b/src/calibre/web/fetch/simple.py index a894691510..3d0a3dc6db 100644 --- a/src/calibre/web/fetch/simple.py +++ b/src/calibre/web/fetch/simple.py @@ -7,8 +7,7 @@ __copyright__ = '2008, Kovid Goyal ' Fetch a webpage and its links recursively. The webpages are saved to disk in UTF-8 encoding with any charset declarations removed. ''' -import sys, socket, os, urlparse, re, time, urllib2, threading, traceback -from urllib import url2pathname, quote +import sys, socket, os, re, time, threading, traceback from httplib import responses from base64 import b64decode @@ -25,6 +24,8 @@ from calibre.utils.img import image_from_data, image_to_data from calibre.utils.imghdr import what from calibre.web.fetch.utils import rescale_image from polyglot.builtins import unicode_type +from polyglot.urllib import (quote, URLError, url2pathname, urljoin, + urlparse, urlsplit, urlunsplit) class AbortArticle(Exception): @@ -57,7 +58,7 @@ bad_url_counter = 0 def basename(url): try: - parts = urlparse.urlsplit(url) + parts = urlsplit(url) path = url2pathname(parts.path) res = os.path.basename(path) except: @@ -261,16 +262,16 @@ class RecursiveFetcher(object): # handles quoting automatically, but leaving it # in case it breaks something if re.search(r'\s+', url) is not None: - purl = list(urlparse.urlparse(url)) + purl = list(urlparse(url)) for i in range(2, 6): purl[i] = quote(purl[i]) - url = urlparse.urlunparse(purl) + url = urlunparse(purl) open_func = getattr(self.browser, 'open_novisit', self.browser.open) try: with closing(open_func(url, timeout=self.timeout)) as f: data = response(f.read()+f.read()) data.newurl = f.geturl() - except urllib2.URLError as err: + except URLError as err: if hasattr(err, 'code') and err.code in responses: raise FetchError(responses[err.code]) if getattr(err, 'reason', [0])[0] == 104 or \ @@ -325,8 +326,8 @@ class RecursiveFetcher(object): for c, tag in enumerate(soup.findAll(lambda tag: tag.name.lower()in ['link', 'style'] and tag.has_key('type') and tag['type'].lower() == 'text/css')): # noqa if tag.has_key('href'): # noqa iurl = tag['href'] - if not urlparse.urlsplit(iurl).scheme: - iurl = urlparse.urljoin(baseurl, iurl, False) + if not urlsplit(iurl).scheme: + iurl = urljoin(baseurl, iurl, False) with self.stylemap_lock: if self.stylemap.has_key(iurl): # noqa tag['href'] = self.stylemap[iurl] @@ -348,8 +349,8 @@ class RecursiveFetcher(object): m = self.__class__.CSS_IMPORT_PATTERN.search(src) if m: iurl = m.group(1) - if not urlparse.urlsplit(iurl).scheme: - iurl = urlparse.urljoin(baseurl, iurl, False) + if not urlsplit(iurl).scheme: + iurl = urljoin(baseurl, iurl, False) with self.stylemap_lock: if self.stylemap.has_key(iurl): # noqa ns.replaceWith(src.replace(m.group(1), self.stylemap[iurl])) @@ -386,8 +387,8 @@ class RecursiveFetcher(object): else: if callable(self.image_url_processor): iurl = self.image_url_processor(baseurl, iurl) - if not urlparse.urlsplit(iurl).scheme: - iurl = urlparse.urljoin(baseurl, iurl, False) + if not urlsplit(iurl).scheme: + iurl = urljoin(baseurl, iurl, False) with self.imagemap_lock: if self.imagemap.has_key(iurl): # noqa tag['src'] = self.imagemap[iurl] @@ -443,11 +444,11 @@ class RecursiveFetcher(object): def absurl(self, baseurl, tag, key, filter=True): iurl = tag[key] - parts = urlparse.urlsplit(iurl) + parts = urlsplit(iurl) if not parts.netloc and not parts.path and not parts.query: return None if not parts.scheme: - iurl = urlparse.urljoin(baseurl, iurl, False) + iurl = urljoin(baseurl, iurl, False) if not self.is_link_ok(iurl): self.log.debug('Skipping invalid link:', iurl) return None @@ -457,12 +458,12 @@ class RecursiveFetcher(object): return iurl def normurl(self, url): - parts = list(urlparse.urlsplit(url)) + parts = list(urlsplit(url)) parts[4] = '' - return urlparse.urlunsplit(parts) + return urlunsplit(parts) def localize_link(self, tag, key, path): - parts = urlparse.urlsplit(tag[key]) + parts = urlsplit(tag[key]) suffix = ('#'+parts.fragment) if parts.fragment else '' tag[key] = path+suffix @@ -547,7 +548,7 @@ class RecursiveFetcher(object): if newbaseurl and not newbaseurl.startswith('/'): for atag in soup.findAll('a', href=lambda x: x and x.startswith('/')): - atag['href'] = urlparse.urljoin(newbaseurl, atag['href'], True) + atag['href'] = urljoin(newbaseurl, atag['href'], True) if callable(self.postprocess_html_ext): soup = self.postprocess_html_ext(soup, c==0 and recursion_level==0 and not getattr(self, 'called_first', False), diff --git a/src/polyglot/queue.py b/src/polyglot/queue.py new file mode 100644 index 0000000000..17323ed37b --- /dev/null +++ b/src/polyglot/queue.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python2 +# vim:fileencoding=utf-8 +# License: GPL v3 Copyright: 2019, Eli Schwartz + +from polyglot.builtins import is_py3 + +if is_py3: + from queue import * # noqa +else: + from Queue import * # noqa diff --git a/src/polyglot/urllib.py b/src/polyglot/urllib.py index a79a535fbb..9a706fcdf5 100644 --- a/src/polyglot/urllib.py +++ b/src/polyglot/urllib.py @@ -2,14 +2,22 @@ # vim:fileencoding=utf-8 # License: GPL v3 Copyright: 2018, Kovid Goyal -from __future__ import absolute_import, division, print_function, unicode_literals - +from __future__ import absolute_import from polyglot.builtins import is_py3 if is_py3: - from urllib.request import urlopen, Request # noqa - from urllib.parse import urlencode # noqa + from urllib.request import (build_opener, getproxies, install_opener, # noqa + HTTPBasicAuthHandler, HTTPCookieProcessor, HTTPDigestAuthHandler, # noqa + url2pathname, urlopen, Request) # noqa + from urllib.parse import (parse_qs, quote, unquote, quote_plus, urldefrag, # noqa + urlencode, urljoin, urlparse, urlunparse, urlsplit, urlunsplit) # noqa + from urllib.error import HTTPError, URLError # noqa else: - from urllib import urlencode # noqa - from urllib2 import urlopen, Request # noqa + from urllib import (getproxies, quote, unquote, quote_plus, url2pathname, # noqa + urlencode) # noqa + from urllib2 import (build_opener, install_opener, HTTPBasicAuthHandler, # noqa + HTTPCookieProcessor, HTTPDigestAuthHandler, HTTPError, URLError, # noqa + urlopen, Request) # noqa + from urlparse import (parse_qs, urldefrag, urljoin, urlparse, urlunparse, # noqa + urlsplit, urlunsplit) # noqa