From 4f51496e090cdd2f77855dc97c2a638cbbadaaaf Mon Sep 17 00:00:00 2001 From: Kyle Kelley Date: Wed, 13 Nov 2024 11:26:42 -0800 Subject: [PATCH] Allow base64 encoded images to be decoded with or without padding (#20616) The R kernel doesn't use base64 padding whereas the Python kernel (via matplotlib) sometimes uses padding. We have to use the `base64` crate's `Indifferent` mode. /cherry-pick v0.161.x Release Notes: - N/A --- crates/repl/src/outputs/image.rs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/crates/repl/src/outputs/image.rs b/crates/repl/src/outputs/image.rs index aab90e55a624dfc36144faa215d764c0189182a2..721833f44c4182a0a2904b087d8977f023fe7ab0 100644 --- a/crates/repl/src/outputs/image.rs +++ b/crates/repl/src/outputs/image.rs @@ -1,5 +1,9 @@ use anyhow::Result; -use base64::prelude::*; +use base64::{ + alphabet, + engine::{DecodePaddingMode, GeneralPurpose, GeneralPurposeConfig}, + Engine as _, +}; use gpui::{img, ClipboardItem, Image, ImageFormat, Pixels, RenderImage, WindowContext}; use std::sync::Arc; use ui::{div, prelude::*, IntoElement, Styled}; @@ -14,11 +18,18 @@ pub struct ImageView { image: Arc, } +pub const STANDARD_INDIFFERENT: GeneralPurpose = GeneralPurpose::new( + &alphabet::STANDARD, + GeneralPurposeConfig::new() + .with_encode_padding(false) + .with_decode_padding_mode(DecodePaddingMode::Indifferent), +); + impl ImageView { pub fn from(base64_encoded_data: &str) -> Result { let filtered = base64_encoded_data.replace(&[' ', '\n', '\t', '\r', '\x0b', '\x0c'][..], ""); - let bytes = BASE64_STANDARD_NO_PAD.decode(filtered)?; + let bytes = STANDARD_INDIFFERENT.decode(filtered)?; let format = image::guess_format(&bytes)?;