summaryrefslogtreecommitdiff
path: root/sphinx/transforms/post_transforms/images.py
diff options
context:
space:
mode:
Diffstat (limited to 'sphinx/transforms/post_transforms/images.py')
-rw-r--r--sphinx/transforms/post_transforms/images.py25
1 files changed, 16 insertions, 9 deletions
diff --git a/sphinx/transforms/post_transforms/images.py b/sphinx/transforms/post_transforms/images.py
index 7e73332ff..44b099198 100644
--- a/sphinx/transforms/post_transforms/images.py
+++ b/sphinx/transforms/post_transforms/images.py
@@ -31,6 +31,8 @@ if False:
logger = logging.getLogger(__name__)
+MAX_FILENAME_LEN = 32
+
class BaseImageConverter(SphinxTransform):
def apply(self):
@@ -67,16 +69,21 @@ class ImageDownloader(BaseImageConverter):
def handle(self, node):
# type: (nodes.Node) -> None
- basename = os.path.basename(node['uri'])
- if '?' in basename:
- basename = basename.split('?')[0]
- if basename == '':
- basename = sha1(node['uri'].encode("utf-8")).hexdigest()
- dirname = node['uri'].replace('://', '/').translate({ord("?"): u"/",
- ord("&"): u"/"})
- ensuredir(os.path.join(self.imagedir, dirname))
- path = os.path.join(self.imagedir, dirname, basename)
try:
+ basename = os.path.basename(node['uri'])
+ if '?' in basename:
+ basename = basename.split('?')[0]
+ if basename == '' or len(basename) > MAX_FILENAME_LEN:
+ filename, ext = os.path.splitext(node['uri'])
+ basename = sha1(filename.encode("utf-8")).hexdigest() + ext
+
+ dirname = node['uri'].replace('://', '/').translate({ord("?"): u"/",
+ ord("&"): u"/"})
+ if len(dirname) > MAX_FILENAME_LEN:
+ dirname = sha1(dirname.encode('utf-8')).hexdigest()
+ ensuredir(os.path.join(self.imagedir, dirname))
+ path = os.path.join(self.imagedir, dirname, basename)
+
headers = {}
if os.path.exists(path):
timestamp = ceil(os.stat(path).st_mtime) # type: float