@@ -198,7 +198,7 @@ def decodeBase64(value, binary=True, encoding=None):
198198 True
199199 >>> decodeBase64("MTIz", binary=False)
200200 '123'
201- >>> decodeBase64("A-B_CD ") == decodeBase64("A+B/CD ")
201+ >>> decodeBase64("A-B_CDE ") == decodeBase64("A+B/CDE ")
202202 True
203203 >>> decodeBase64(b"MTIzNA") == b"1234"
204204 True
@@ -231,7 +231,7 @@ def decodeBase64(value, binary=True, encoding=None):
231231
232232 return retVal
233233
234- def encodeBase64 (value , binary = True , encoding = None , padding = True ):
234+ def encodeBase64 (value , binary = True , encoding = None , padding = True , safe = False ):
235235 """
236236 Returns a decoded representation of provided Base64 value
237237
@@ -241,6 +241,8 @@ def encodeBase64(value, binary=True, encoding=None, padding=True):
241241 'MTIzNA=='
242242 >>> encodeBase64(u"1234", binary=False, padding=False)
243243 'MTIzNA'
244+ >>> encodeBase64(decodeBase64("A-B_CDE"), binary=False, safe=True)
245+ 'A-B_CDE'
244246 """
245247
246248 if value is None :
@@ -254,6 +256,16 @@ def encodeBase64(value, binary=True, encoding=None, padding=True):
254256 if not binary :
255257 retVal = getText (retVal , encoding )
256258
259+ if safe :
260+ padding = False
261+
262+ # Reference: https://en.wikipedia.org/wiki/Base64#URL_applications
263+ # Reference: https://perldoc.perl.org/MIME/Base64.html
264+ if isinstance (retVal , bytes ):
265+ retVal = retVal .replace (b'+' , b'-' ).replace (b'/' , b'_' )
266+ else :
267+ retVal = retVal .replace ('+' , '-' ).replace ('/' , '_' )
268+
257269 if not padding :
258270 retVal = retVal .rstrip (b'=' if isinstance (retVal , bytes ) else '=' )
259271
0 commit comments