code: func (c *Config) StorageFor(caURL string) (Storage, error) {
  	// Validate CA URL
  	if caURL == "" {
  		caURL = DefaultCAUrl
  	}
  	if caURL == "" {
  		return nil, fmt.Errorf("cannot create storage without CA URL")
  	}
  	caURL = strings.ToLower(caURL)
  
  	// scheme required or host will be parsed as path (as of Go 1.6)
  	if !strings.Contains(caURL, "://") {
  		caURL = "https://" + caURL
  	}
  
  	u, err := url.Parse(caURL)
  	if err != nil {
  		return nil, fmt.Errorf("%s: unable to parse CA URL: %v", caURL, err)
  	}
  
  	if u.Host == "" {
  		return nil, fmt.Errorf("%s: no host in CA URL", caURL)
  	}
  
  	// Create the storage based on the URL
  	var s Storage
  	if c.StorageProvider == "" {
  		c.StorageProvider = "file"
  	}
  
  	creator, ok := storageProviders[c.StorageProvider]
  	if !ok {
  		return nil, fmt.Errorf("%s: Unknown storage: %v", caURL, c.StorageProvider)
  	}
  
  	s, err = creator(u)
  	if err != nil {
  		return nil, fmt.Errorf("%s: unable to create custom storage '%v': %v", caURL, c.StorageProvider, err)
  	}
  
  	return s, nil
  }
docs: // StorageFor obtains a TLS Storage instance for the given CA URL which should
  // be unique for every different ACME CA. If a StorageCreator is set on this
  // Config, it will be used. Otherwise the default file storage implementation
  // is used. When the error is nil, this is guaranteed to return a non-nil
  // Storage instance.