File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 2222from datetime import datetime
2323import os
2424
25+ from six .moves .urllib .parse import urlsplit
2526from google .cloud .storage .constants import _DEFAULT_TIMEOUT
2627
2728
@@ -491,3 +492,23 @@ def _raise_if_more_than_one_set(**kwargs):
491492 )
492493
493494 raise ValueError (msg )
495+
496+
497+ def _bucket_bound_hostname_url (host , scheme = None ):
498+ """Helper to build bucket bound hostname URL.
499+
500+ :type host: str
501+ :param host: Host name.
502+
503+ :type scheme: str
504+ :param scheme: (Optional) Web scheme. If passed, use it
505+ as a scheme in the result URL.
506+
507+ :rtype: str
508+ :returns: A bucket bound hostname URL.
509+ """
510+ url_parts = urlsplit (host )
511+ if url_parts .scheme and url_parts .netloc :
512+ return host
513+
514+ return "{scheme}://{host}/" .format (scheme = scheme , host = host )
Original file line number Diff line number Diff line change 5757from google .cloud .storage ._helpers import _add_generation_match_parameters
5858from google .cloud .storage ._helpers import _PropertyMixin
5959from google .cloud .storage ._helpers import _scalar_property
60+ from google .cloud .storage ._helpers import _bucket_bound_hostname_url
6061from google .cloud .storage ._helpers import _convert_to_timestamp
6162from google .cloud .storage ._helpers import _raise_if_more_than_one_set
6263from google .cloud .storage ._signing import generate_signed_url_v2
@@ -516,12 +517,9 @@ def generate_signed_url(
516517 bucket_name = self .bucket .name
517518 )
518519 elif bucket_bound_hostname :
519- if ":" in bucket_bound_hostname :
520- api_access_endpoint = bucket_bound_hostname
521- else :
522- api_access_endpoint = "{scheme}://{bucket_bound_hostname}" .format (
523- scheme = scheme , bucket_bound_hostname = bucket_bound_hostname
524- )
520+ api_access_endpoint = _bucket_bound_hostname_url (
521+ bucket_bound_hostname , scheme
522+ )
525523 else :
526524 resource = "/{bucket_name}/{quoted_name}" .format (
527525 bucket_name = self .bucket .name , quoted_name = quoted_name
Original file line number Diff line number Diff line change 3838from google .cloud .storage ._helpers import _validate_name
3939from google .cloud .storage ._signing import generate_signed_url_v2
4040from google .cloud .storage ._signing import generate_signed_url_v4
41+ from google .cloud .storage ._helpers import _bucket_bound_hostname_url
4142from google .cloud .storage .acl import BucketACL
4243from google .cloud .storage .acl import DefaultObjectACL
4344from google .cloud .storage .blob import Blob
@@ -2861,12 +2862,9 @@ def generate_signed_url(
28612862 bucket_name = self .name
28622863 )
28632864 elif bucket_bound_hostname :
2864- if ":" in bucket_bound_hostname :
2865- api_access_endpoint = bucket_bound_hostname
2866- else :
2867- api_access_endpoint = "{scheme}://{bucket_bound_hostname}" .format (
2868- scheme = scheme , bucket_bound_hostname = bucket_bound_hostname
2869- )
2865+ api_access_endpoint = _bucket_bound_hostname_url (
2866+ bucket_bound_hostname , scheme
2867+ )
28702868 else :
28712869 resource = "/{bucket_name}" .format (bucket_name = self .name )
28722870
Original file line number Diff line number Diff line change 3030from google .cloud .client import ClientWithProject
3131from google .cloud .exceptions import NotFound
3232from google .cloud .storage ._helpers import _get_storage_host
33+ from google .cloud .storage ._helpers import _bucket_bound_hostname_url
3334from google .cloud .storage ._http import Connection
3435from google .cloud .storage ._signing import (
3536 get_expiration_seconds_v4 ,
@@ -1079,15 +1080,8 @@ def generate_signed_post_policy_v4(
10791080 # designate URL
10801081 if virtual_hosted_style :
10811082 url = "https://{}.storage.googleapis.com/" .format (bucket_name )
1082-
10831083 elif bucket_bound_hostname :
1084- if ":" in bucket_bound_hostname : # URL includes scheme
1085- url = bucket_bound_hostname
1086-
1087- else : # scheme is given separately
1088- url = "{scheme}://{host}/" .format (
1089- scheme = scheme , host = bucket_bound_hostname
1090- )
1084+ url = _bucket_bound_hostname_url (bucket_bound_hostname , scheme )
10911085 else :
10921086 url = "https://storage.googleapis.com/{}/" .format (bucket_name )
10931087
Original file line number Diff line number Diff line change @@ -525,6 +525,24 @@ def test_add_generation_match_parameters_tuple(self):
525525 )
526526
527527
528+ class Test__bucket_bound_hostname_url (unittest .TestCase ):
529+ def _call_fut (self , ** args ):
530+ from google .cloud .storage ._helpers import _bucket_bound_hostname_url
531+
532+ return _bucket_bound_hostname_url (** args )
533+
534+ def test_full_hostname (self ):
535+ HOST = "scheme://domain.tcl/"
536+ self .assertEqual (self ._call_fut (host = HOST ), HOST )
537+
538+ def test_hostname_and_scheme (self ):
539+ HOST = "domain.tcl"
540+ SCHEME = "scheme"
541+ EXPECTED_URL = SCHEME + "://" + HOST + "/"
542+
543+ self .assertEqual (self ._call_fut (host = HOST , scheme = SCHEME ), EXPECTED_URL )
544+
545+
528546class _Connection (object ):
529547 def __init__ (self , * responses ):
530548 self ._responses = responses
Original file line number Diff line number Diff line change @@ -405,6 +405,7 @@ def _generate_signed_url_helper(
405405 ):
406406 from six .moves .urllib import parse
407407 from google .cloud ._helpers import UTC
408+ from google .cloud .storage ._helpers import _bucket_bound_hostname_url
408409 from google .cloud .storage .blob import _API_ACCESS_ENDPOINT
409410 from google .cloud .storage .blob import _get_encryption_headers
410411
@@ -464,12 +465,9 @@ def _generate_signed_url_helper(
464465 bucket .name
465466 )
466467 elif bucket_bound_hostname :
467- if ":" in bucket_bound_hostname :
468- expected_api_access_endpoint = bucket_bound_hostname
469- else :
470- expected_api_access_endpoint = "{scheme}://{bucket_bound_hostname}" .format (
471- scheme = scheme , bucket_bound_hostname = bucket_bound_hostname
472- )
468+ expected_api_access_endpoint = _bucket_bound_hostname_url (
469+ bucket_bound_hostname , scheme
470+ )
473471 else :
474472 expected_api_access_endpoint = api_access_endpoint
475473 expected_resource = "/{}/{}" .format (bucket .name , quoted_name )
Original file line number Diff line number Diff line change @@ -2990,6 +2990,7 @@ def _generate_signed_url_helper(
29902990 ):
29912991 from six .moves .urllib import parse
29922992 from google .cloud ._helpers import UTC
2993+ from google .cloud .storage ._helpers import _bucket_bound_hostname_url
29932994 from google .cloud .storage .blob import _API_ACCESS_ENDPOINT
29942995
29952996 api_access_endpoint = api_access_endpoint or _API_ACCESS_ENDPOINT
@@ -3037,12 +3038,9 @@ def _generate_signed_url_helper(
30373038 bucket_name
30383039 )
30393040 elif bucket_bound_hostname :
3040- if ":" in bucket_bound_hostname :
3041- expected_api_access_endpoint = bucket_bound_hostname
3042- else :
3043- expected_api_access_endpoint = "{scheme}://{bucket_bound_hostname}" .format (
3044- scheme = scheme , bucket_bound_hostname = bucket_bound_hostname
3045- )
3041+ expected_api_access_endpoint = _bucket_bound_hostname_url (
3042+ bucket_bound_hostname , scheme
3043+ )
30463044 else :
30473045 expected_api_access_endpoint = api_access_endpoint
30483046 expected_resource = "/{}" .format (parse .quote (bucket_name ))
You can’t perform that action at this time.
0 commit comments