@@ -403,6 +403,7 @@ def _make_ssrf_safe_request(
403403 allow_private_network : bool = False ,
404404 block_loopback_and_link_local : bool = True ,
405405 block_link_local_only : bool = False ,
406+ https_only : bool = False ,
406407 ** kwargs : Any ,
407408) -> requests .Response :
408409 """
@@ -421,12 +422,18 @@ def _make_ssrf_safe_request(
421422 it to ``block_link_local_only`` so loopback services are reachable while
422423 cloud-metadata stays blocked.
423424 """
425+ if https_only and urlparse (url ).scheme != "https" :
426+ raise SSRFException (
427+ f"Invalid URL scheme '{ urlparse (url ).scheme } '. Only https is allowed."
428+ )
429+
424430 if allow_private_network :
425431 validate_outbound_http_url (
426432 url ,
427433 allow_private_network = True ,
428434 block_loopback_and_link_local = block_loopback_and_link_local ,
429435 block_link_local_only = block_link_local_only ,
436+ https_only = https_only ,
430437 )
431438 parsed = urlparse (url )
432439 hostname = parsed .hostname or ""
@@ -458,6 +465,7 @@ def ssrf_safe_get(
458465 allow_private_network : bool = False ,
459466 block_loopback_and_link_local : bool = True ,
460467 block_link_local_only : bool = False ,
468+ https_only : bool = False ,
461469 ** kwargs : Any ,
462470) -> requests .Response :
463471 """
@@ -493,6 +501,7 @@ def ssrf_safe_get(
493501 allow_private_network = allow_private_network ,
494502 block_loopback_and_link_local = block_loopback_and_link_local ,
495503 block_link_local_only = block_link_local_only ,
504+ https_only = https_only ,
496505 ** kwargs ,
497506 )
498507
@@ -532,6 +541,7 @@ def ssrf_safe_get(
532541 allow_private_network = allow_private_network ,
533542 block_loopback_and_link_local = block_loopback_and_link_local ,
534543 block_link_local_only = block_link_local_only ,
544+ https_only = https_only ,
535545 ** kwargs ,
536546 )
537547
0 commit comments