@@ -246,8 +246,9 @@ defmodule Base do
246
246
247
247
"""
248
248
@ spec decode64 ( binary ) :: { :ok , binary } | :error
249
- def decode64 ( string ) when is_binary ( string ) do
250
- { :ok , decode64! ( string ) }
249
+ @ spec decode64 ( binary , Keyword . t ) :: { :ok , binary } | :error
250
+ def decode64 ( string , opts \\ [ ] ) when is_binary ( string ) do
251
+ { :ok , decode64! ( string , opts ) }
251
252
rescue
252
253
ArgumentError -> :error
253
254
end
@@ -267,12 +268,9 @@ defmodule Base do
267
268
268
269
"""
269
270
@ spec decode64! ( binary ) :: binary
270
- def decode64! ( string ) when is_binary ( string ) and rem ( byte_size ( string ) , 4 ) == 0 do
271
- do_decode64 ( string )
272
- end
273
-
274
- def decode64! ( string ) when is_binary ( string ) do
275
- raise ArgumentError , "incorrect padding"
271
+ @ spec decode64! ( binary , Keyword . t ) :: binary
272
+ def decode64! ( string , opts \\ [ ] ) when is_binary ( string ) do
273
+ string |> filter_ignored ( opts [ :ignore ] ) |> do_decode64 ( )
276
274
end
277
275
278
276
@ doc """
@@ -301,8 +299,9 @@ defmodule Base do
301
299
302
300
"""
303
301
@ spec url_decode64 ( binary ) :: { :ok , binary } | :error
304
- def url_decode64 ( string ) when is_binary ( string ) do
305
- { :ok , url_decode64! ( string ) }
302
+ @ spec url_decode64 ( binary , Keyword . t ) :: { :ok , binary } | :error
303
+ def url_decode64 ( string , opts \\ [ ] ) when is_binary ( string ) do
304
+ { :ok , url_decode64! ( string , opts ) }
306
305
rescue
307
306
ArgumentError -> :error
308
307
end
@@ -321,12 +320,9 @@ defmodule Base do
321
320
322
321
"""
323
322
@ spec url_decode64! ( binary ) :: binary
324
- def url_decode64! ( string ) when is_binary ( string ) and rem ( byte_size ( string ) , 4 ) == 0 do
325
- do_decode64url ( string )
326
- end
327
-
328
- def url_decode64! ( string ) when is_binary ( string ) do
329
- raise ArgumentError , "incorrect padding"
323
+ @ spec url_decode64! ( binary , Keyword . t ) :: binary
324
+ def url_decode64! ( string , opts \\ [ ] ) when is_binary ( string ) do
325
+ string |> filter_ignored ( opts [ :ignore ] ) |> do_decode64url ( )
330
326
end
331
327
332
328
@ doc """
@@ -500,6 +496,11 @@ defmodule Base do
500
496
raise ArgumentError , "incorrect padding"
501
497
end
502
498
499
+ defp filter_ignored ( string , nil ) , do: string
500
+ defp filter_ignored ( string , :whitespace ) do
501
+ for << c :: 8 <- string >> , not c in '\s \t \r \n ' , into: << >> , do: << c :: 8 >>
502
+ end
503
+
503
504
defp do_encode16 ( _ , << >> ) , do: << >>
504
505
defp do_encode16 ( :upper , data ) do
505
506
for << c :: 4 <- data >> , into: << >> , do: << enc16 ( c ) :: 8 >>
@@ -541,7 +542,7 @@ defmodule Base do
541
542
end
542
543
543
544
defp do_decode64 ( << >> ) , do: << >>
544
- defp do_decode64 ( string ) do
545
+ defp do_decode64 ( string ) when rem ( byte_size ( string ) , 4 ) == 0 do
545
546
split = byte_size ( string ) - 4
546
547
<< main :: size ( split ) - binary , rest :: binary >> = string
547
548
main = for << c :: 8 <- main >> , into: << >> , do: << dec64 ( c ) :: 6 >>
@@ -556,6 +557,9 @@ defmodule Base do
556
557
main
557
558
end
558
559
end
560
+ defp do_decode64 ( _ ) do
561
+ raise ArgumentError , "incorrect padding"
562
+ end
559
563
560
564
defp do_encode64url ( << >> ) , do: << >>
561
565
defp do_encode64url ( data ) do
@@ -573,7 +577,7 @@ defmodule Base do
573
577
end
574
578
575
579
defp do_decode64url ( << >> ) , do: << >>
576
- defp do_decode64url ( string ) do
580
+ defp do_decode64url ( string ) when rem ( byte_size ( string ) , 4 ) == 0 do
577
581
split = byte_size ( string ) - 4
578
582
<< main :: size ( split ) - binary , rest :: binary >> = string
579
583
main = for << c :: 8 <- main >> , into: << >> , do: << dec64url ( c ) :: 6 >>
@@ -588,8 +592,9 @@ defmodule Base do
588
592
main
589
593
end
590
594
end
591
-
592
-
595
+ defp do_decode64url ( _ ) do
596
+ raise ArgumentError , "incorrect padding"
597
+ end
593
598
594
599
defp do_encode32 ( _ , << >> ) , do: << >>
595
600
0 commit comments