Ejemplo n.º 1
0
        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);
        }