Repository: python-visualization/folium

Issue:
ImageOverlay does not accept data uris as valid and treats them as file name instead
**Describe the bug**

Supplying a data URI as image parameter to ImageOverlay raise FileNotFound error.

**To Reproduce**

```python
from folium.raster_layers import ImageOverlay
img_url = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
ImageOverlay(img_url, bounds=[[0,0], [1,1]])
```

**Expected behavior**
Image url is passed into output as is.


**Environment (please complete the following information):**
 - Browser firefox
 - Jupyter Notebook or html files -- jupyter lab?
 - Python version 3.8
 - folium version 0.11.0
 - branca version 0.3.1

**Possible solutions**

Problem is due to `data` scheme being absent from the allow list here:

https://github.com/python-visualization/folium/blob/ae12f975277085e4727f0bd094ad907e3ef11901/folium/utilities.py#L22-L23

Patching it at run time solves the problem, i.e. this works as expected
```python
import folium.utilities
folium.utilities._VALID_URLS.add('data')

from folium.raster_layers import ImageOverlay
img_url = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
ImageOverlay(img_url, bounds=[[0,0], [1,1]])
```


Discussion:

Patch:
diff --git a/folium/utilities.py b/folium/utilities.py
index bd7f190c..f44828f8 100644
--- a/folium/utilities.py
+++ b/folium/utilities.py
@@ -21,6 +21,7 @@ except ImportError:
 
 _VALID_URLS = set(uses_relative + uses_netloc + uses_params)
 _VALID_URLS.discard('')
+_VALID_URLS.add('data')
 
 
 def validate_location(location):  # noqa: C901


Test patch:
diff --git a/tests/test_utilities.py b/tests/test_utilities.py
index 5a31a0ad..9e012d4f 100644
--- a/tests/test_utilities.py
+++ b/tests/test_utilities.py
@@ -11,6 +11,7 @@ from folium.utilities import (
     deep_copy,
     get_obj_in_upper_tree,
     parse_options,
+    _is_url,
 )
 
 
@@ -154,3 +155,14 @@ def test_parse_options():
     assert parse_options(thing=None) == {}
     assert parse_options(long_thing=42) == {'longThing': 42}
     assert parse_options(thing=42, lst=[1, 2]) == {'thing': 42, 'lst': [1, 2]}
+
+
+@pytest.mark.parametrize('url', [
+    "https://example.com/img.png",
+    "http://example.com/img.png",
+    "ftp://example.com/img.png",
+    "file:///t.jpg",
+    "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",
+])
+def test_is_url(url):
+    assert _is_url(url) is True