public string BuildUrl(string source) { if (String.IsNullOrEmpty(m_cloudName)) { throw new ArgumentException("cloudName must be specified!"); } if (source == null) { source = m_source; } if (source == null) { source = String.Empty; } if (Regex.IsMatch(source.ToLower(), "^https?:/.*") && (m_action == "upload" || m_action == "asset")) { return(source); } if (m_action == "fetch" && !String.IsNullOrEmpty(FormatValue)) { Transformation.FetchFormat(FormatValue); FormatValue = null; } string transformationStr = Transformation.Generate(); var src = UpdateSource(source); bool sharedDomain; var prefix = GetPrefix(src.Source, out sharedDomain); List <string> urlParts = new List <string>(new string[] { prefix }); if (!String.IsNullOrEmpty(m_apiVersion)) { urlParts.Add(m_apiVersion); urlParts.Add(m_cloudName); } else if (sharedDomain) { urlParts.Add(m_cloudName); } UpdateAction(); urlParts.Add(m_resourceType); urlParts.Add(m_action); urlParts.AddRange(m_customParts); if (src.SourceToSign.Contains("/") && !Regex.IsMatch(src.SourceToSign, "^v[0-9]+/") && !Regex.IsMatch(src.SourceToSign, "https?:/.*") && String.IsNullOrEmpty(m_version)) { m_version = "1"; } var version = String.IsNullOrEmpty(m_version) ? String.Empty : String.Format("v{0}", m_version); if (m_signed && (m_AuthToken == null && CloudinaryConfiguration.AuthToken == null)) { if (m_signProvider == null) { throw new NullReferenceException("Reference to ISignProvider-compatible object must be provided in order to sign URI!"); } var signedPart = String.Join("/", new string[] { transformationStr, src.SourceToSign }); signedPart = Regex.Replace(signedPart, "^/+", String.Empty); signedPart = Regex.Replace(signedPart, "([^:])/{2,}", "$1/"); signedPart = Regex.Replace(signedPart, "/$", String.Empty); signedPart = m_signProvider.SignUriPart(signedPart); urlParts.Add(signedPart); } urlParts.Add(transformationStr); urlParts.Add(version); urlParts.Add(src.Source); string uriStr = String.Join("/", urlParts.ToArray()); uriStr = Regex.Replace(uriStr, "([^:])/{2,}", "$1/"); uriStr = Regex.Replace(uriStr, "/$", String.Empty); if (m_signed && (m_AuthToken != null || CloudinaryConfiguration.AuthToken != null)) { AuthToken token = m_AuthToken != null ? m_AuthToken : (CloudinaryConfiguration.AuthToken != null ? CloudinaryConfiguration.AuthToken : null); if (token != null && token != CloudinaryDotNet.AuthToken.NULL_AUTH_TOKEN) { string tokenStr = token.Generate(); uriStr = string.Format("{0}?{1}", uriStr, tokenStr); } } return(uriStr); }