Exemplo n.º 1
0
        private string determineContentType()
        {
            if (this._fileTransporterRequest.IsSetContentType())
            {
                return(this._fileTransporterRequest.ContentType);
            }

            if (this._fileTransporterRequest.IsSetFilePath() ||
                this._fileTransporterRequest.IsSetKey())
            {
                // Get the extension of the file from the path.
                // Try the key as well.
                string ext = Path.GetExtension(this._fileTransporterRequest.FilePath);
                if (String.IsNullOrEmpty(ext) &&
                    this._fileTransporterRequest.IsSetKey())
                {
                    ext = Path.GetExtension(this._fileTransporterRequest.Key);
                }

                string type = AmazonS3Util.MimeTypeFromExtension(ext);
                return(type);
            }

            return(null);
        }
        public static void ValidateFileContents(string bucketName, string key, string path)
        {
            // test assumes we used a known extension and added it to the file key
            var ext = Path.GetExtension(key);

            ValidateFileContents(bucketName, key, path, AmazonS3Util.MimeTypeFromExtension(ext));
        }
Exemplo n.º 3
0
        private Task ValidateFileContentsAsync(string bucketName, string key, string path)
        {
            // test assumes we used a known extension and added it to the file key
            var ext = Path.GetExtension(key);

            return(ValidateFileContentsAsync(bucketName, key, path, AmazonS3Util.MimeTypeFromExtension(ext)));
        }
        private void CreateSignedPolicy(PostObjectRequest request)
        {
            if (request.ContentType == null)
            {
                int    pos = request.Key.LastIndexOf('.');
                string ext = null;
                if (pos != -1)
                {
                    ext = request.Key.Substring(pos, request.Key.Length - pos);
                    request.ContentType = AmazonS3Util.MimeTypeFromExtension(ext);
                }
                else
                {
                    request.ContentType = "application/octet-stream";
                }
            }

            string policyString = null;
            int    position     = request.Key.LastIndexOf('/');

            if (position == -1)
            {
                policyString = "{\"expiration\": \"" + DateTime.UtcNow.AddHours(24).ToString("yyyy-MM-ddTHH:mm:ssZ") + "\",\"conditions\": [{\"bucket\": \"" +
                               request.Bucket + "\"},[\"starts-with\", \"$key\", \"" + "\"],{\"acl\": \"private\"},[\"eq\", \"$Content-Type\", " + "\"" + request.ContentType + "\"" + "]]}";
            }
            else
            {
                policyString = "{\"expiration\": \"" + DateTime.UtcNow.AddHours(24).ToString("yyyy-MM-ddTHH:mm:ssZ") + "\",\"conditions\": [{\"bucket\": \"" +
                               request.Bucket + "\"},[\"starts-with\", \"$key\", \"" + request.Key.Substring(0, position) + "/\"],{\"acl\": \"private\"},[\"eq\", \"$Content-Type\", " + "\"" + request.ContentType + "\"" + "]]}";
            }
            request.SignedPolicy = S3PostUploadSignedPolicy.GetSignedPolicy(policyString, base.Credentials);
        }
        /// <summary>
        /// Lists the files within a storage provider's path.
        /// </summary>
        /// <param name="path">The relative path to the folder which files to list.</param>
        /// <returns>The list of files in the folder.</returns>
        public IEnumerable <IStorageFile> ListFiles(string path)
        {
            EnsureInitialized();
            if (_client == null)
            {
                return(null);
            }
            var files   = new List <S3StorageFile>();
            var objects = new List <S3Object>();

            var request = new ListObjectsRequest();

            request.BucketName = BucketName;
            request.Prefix     = path;
            request.MaxKeys    = 5000;

            var response = _client.ListObjects(request);

            objects.AddRange(response.S3Objects);
            while (response.IsTruncated)
            {
                request.Marker = response.NextMarker;
                response       = _client.ListObjects(request);
                objects.AddRange(response.S3Objects);
            }

            foreach (var entry in objects.Where(e => e.Key.Last() != '/'))
            {
                var mimeType = AmazonS3Util.MimeTypeFromExtension(entry.Key.Substring(entry.Key.LastIndexOf(".", System.StringComparison.Ordinal)));
                files.Add(new S3StorageFile(new S3FileInfo(_client, BucketName, entry.Key), this));
            }

            return(files);
        }
Exemplo n.º 6
0
        /// <summary>
        /// Write the multipart/form-data for this request for all fields except the file data to a stream
        /// </summary>
        internal void WriteFormData(string boundary, Stream outputStream)
        {
            if (!String.IsNullOrEmpty(this.Key))
            {
                WriteFormDatum(outputStream, S3Constants.PostFormDataObjectKey, this.Key, boundary);
            }

            WriteFormDatum(outputStream, S3Constants.PostFormDataAcl, this.CannedACL, boundary);

            if (this._isSetStorageClass)
            {
                WriteFormDatum(outputStream, HeaderKeys.XAmzStorageClassHeader, this.StorageClass, boundary);
            }

            if (this._isSetActionStatus)
            {
                WriteFormDatum(outputStream, S3Constants.PostFormDataStatus, ((Int32)this.SuccessActionStatus).ToString(CultureInfo.InvariantCulture), boundary);
            }

            if (!String.IsNullOrEmpty(this.SuccessActionRedirect))
            {
                WriteFormDatum(outputStream, S3Constants.PostFormDataRedirect, this.SuccessActionRedirect, boundary);
            }

            if (String.IsNullOrEmpty(this.ContentType))
            {
                if (this.Key.IndexOf('.') > -1)
                {
                    this.ContentType = AmazonS3Util.MimeTypeFromExtension(this.Key.Substring(this.Key.LastIndexOf('.')));
                }
                else if (!String.IsNullOrEmpty(this.Path) && this.Path.IndexOf('.') > -1)
                {
                    this.ContentType = AmazonS3Util.MimeTypeFromExtension(this.Key.Substring(this.Path.LastIndexOf('.')));
                }
            }

            WriteFormDatum(outputStream, S3Constants.PostFormDataContentType, this.ContentType, boundary);

            if (this.SignedPolicy != null && !string.IsNullOrEmpty(this.SignedPolicy.SecurityToken))
            {
                this.Metadata[S3Constants.PostFormDataSecurityToken] = this.SignedPolicy.SecurityToken;
            }

            foreach (var kvp in this.Metadata)
            {
                var metakey = kvp.Key.StartsWith(S3Constants.PostFormDataXAmzPrefix, StringComparison.Ordinal) ? kvp.Key : S3Constants.PostFormDataMetaPrefix + kvp.Key;
                WriteFormDatum(outputStream, metakey, kvp.Value, boundary);
            }

            if (this.SignedPolicy != null)
            {
                WriteFormDatum(outputStream, S3Constants.PostFormDataAccessKeyId, this.SignedPolicy.AccessKeyId, boundary);
                WriteFormDatum(outputStream, S3Constants.PostFormDataPolicy, this.SignedPolicy.Policy, boundary);
                WriteFormDatum(outputStream, S3Constants.PostFormDataSignature, this.SignedPolicy.Signature, boundary);
            }
        }
Exemplo n.º 7
0
        // methods
        public void Run(Object obj)
        {
            // counter for retires
            if (retry > 0)
            {
                // make the amazon client
                AmazonS3Client s3Client = new AmazonS3Client(awsKey, awsSecret, RegionEndpoint.GetBySystemName(region));

                try
                {
                    // request object with file
                    PutObjectRequest req = new PutObjectRequest();
                    req.BucketName = bucket;
                    req.Key        = key;
                    req.FilePath   = file;
                    req.CannedACL  = ACL();
                    req.Timeout    = new TimeSpan(2, 0, 0);

                    // set the appropriate mime type
                    if (file.Contains("."))
                    {
                        string ext  = file.Substring(file.LastIndexOf('.'));
                        string mime = AmazonS3Util.MimeTypeFromExtension(ext);
                        req.Headers.ContentType = mime;
                    }

                    // set timeout
                    if (timeout > 0)
                    {
                        req.Timeout = new TimeSpan(0, 0, timeout);
                    }

                    // put the object
                    PutObjectResponse res = s3Client.PutObject(req);

                    // feedback
                    Console.WriteLine("File '" + key + "' in bucket '" + bucket + "' has been added");
                }
                catch (Exception e)
                {
                    // output error
                    Console.WriteLine("Warning adding file '" + file + "' in bucket '" + bucket + "': " + e.Message + " (operation will be retried)");

                    // lower the counter and rerun
                    retry = retry - 1;
                    Run(obj);
                }
            }
            else
            {
                // exceeded retries, time to output error
                Console.WriteLine("Error adding file '" + file + "' in bucket '" + bucket + "'");
            }
        }
        private void InvokeHelperForS3PostObject(AsyncResult asyncResult, PostObjectRequest request)
        {
            if (asyncResult.RetriesAttempt == 0 || Config.ResignRetries)
            {
                // Add Post policy
                if (request.PostPolicy == null)
                {
                    int    position = request.Key.LastIndexOf('.');
                    string ext = null, contentType = null;
                    if (position != -1)
                    {
                        ext         = request.Key.Substring(position, request.Key.Length - position);
                        contentType = AmazonS3Util.MimeTypeFromExtension(ext);
                    }
                    else
                    {
                        contentType = "application/octet-stream";
                    }
                    request.PostPolicy = S3PostPolicyBuilder.GetPostPolicy(request.Bucket, request.Key, contentType);
                }



                if (Credentials is CognitoAWSCredentials)
                {
                    var cred = Credentials as CognitoAWSCredentials;
                    // very hacky solution
                    cred.GetCredentialsAsync(delegate(AmazonServiceResult voidResult)
                    {
                        if (voidResult.Exception != null)
                        {
                            asyncResult.IsCompleted = true;
                            AmazonLogging.LogError(AmazonLogging.AmazonLoggingLevel.Errors, "CognitoAWSCredentials", voidResult.Exception.Message);
                            asyncResult.HandleException(voidResult.Exception);
                            return;
                        }
                        request.SignedPolicy = S3PostUploadSignedPolicy.GetSignedPolicy(request.PostPolicy, cred);
                        ProcessS3PostRequest(asyncResult, request);
                    }, null);
                    return;
                }
                request.SignedPolicy = S3PostUploadSignedPolicy.GetSignedPolicy(request.PostPolicy, Credentials);
            }

            ProcessS3PostRequest(asyncResult, request);
        }
Exemplo n.º 9
0
 private void InferContentType(PostObjectRequest request)
 {
     if (String.IsNullOrEmpty(request.Headers.ContentType))
     {
         if (request.Key.IndexOf('.') > -1)
         {
             request.Headers.ContentType = AmazonS3Util.MimeTypeFromExtension(request.Key.Substring(request.Key.LastIndexOf('.')));
         }
         else if (!String.IsNullOrEmpty(request.Path) && request.Path.IndexOf('.') > -1)
         {
             request.Headers.ContentType = AmazonS3Util.MimeTypeFromExtension(request.Key.Substring(request.Path.LastIndexOf('.')));
         }
         else
         {
             request.Headers.ContentType = "application/octet-stream";
         }
     }
 }
Exemplo n.º 10
0
        private void CreateSignedPolicy(PostObjectRequest request)
        {
            if (request.ContentType == null)
            {
                int    pos = request.Key.LastIndexOf('.');
                string ext = null;
                if (pos != -1)
                {
                    ext = request.Key.Substring(pos, request.Key.Length - pos);
                    request.ContentType = AmazonS3Util.MimeTypeFromExtension(ext);
                }
                else
                {
                    request.ContentType = "application/octet-stream";
                }
            }

            StringBuilder metadataPolicy = new StringBuilder();

            foreach (var kvp in request.Metadata)
            {
                var metakey = kvp.Key.StartsWith(S3Constants.PostFormDataXAmzPrefix, StringComparison.Ordinal) ? kvp.Key : S3Constants.PostFormDataMetaPrefix + kvp.Key;
                metadataPolicy.Append(string.Format(",{{\"{0}\": \"{1}\"}}", metakey, kvp.Value));
            }

            string policyString = null;
            int    position     = request.Key.LastIndexOf('/');

            if (position == -1)
            {
                policyString = "{\"expiration\": \"" + DateTime.UtcNow.AddHours(24).ToString("yyyy-MM-ddTHH:mm:ssZ") + "\",\"conditions\": [{\"bucket\": \"" +
                               request.Bucket + "\"},[\"starts-with\", \"$key\", \"" + "\"],{\"acl\": \"" + request.CannedACL.Value + "\"},[\"eq\", \"$Content-Type\", " + "\"" + request.ContentType + "\"" + "]" + metadataPolicy.ToString() + "]}";
            }
            else
            {
                policyString = "{\"expiration\": \"" + DateTime.UtcNow.AddHours(24).ToString("yyyy-MM-ddTHH:mm:ssZ") + "\",\"conditions\": [{\"bucket\": \"" +
                               request.Bucket + "\"},[\"starts-with\", \"$key\", \"" + request.Key.Substring(0, position) + "/\"],{\"acl\": \"" + request.CannedACL.Value + "\"},[\"eq\", \"$Content-Type\", " + "\"" + request.ContentType + "\"" + "]" + metadataPolicy.ToString() + "]}";
            }
            request.SignedPolicy = S3PostUploadSignedPolicy.GetSignedPolicy(policyString, base.Credentials);
        }
Exemplo n.º 11
0
        private void UploadToCdn()
        {
            try
            {
                // one thread only
                if (Interlocked.CompareExchange(ref work, 1, 0) == 0)
                {
                    var @continue = false;
                    try
                    {
                        CdnItem item;
                        if (queue.TryDequeue(out item))
                        {
                            @continue = true;

                            var cdnpath     = GetCdnPath(item.Bundle.Path);
                            var key         = new Uri(cdnpath).PathAndQuery.TrimStart('/');
                            var content     = Encoding.UTF8.GetBytes(item.Response.Content);
                            var inputStream = new MemoryStream();

                            if (ClientSettings.GZipEnabled)
                            {
                                using (var zip = new GZipStream(inputStream, CompressionMode.Compress, true))
                                {
                                    zip.Write(content, 0, content.Length);
                                    zip.Flush();
                                }
                            }
                            else
                            {
                                inputStream.Write(content, 0, content.Length);
                            }

                            var checksum = AmazonS3Util.GenerateChecksumForContent(item.Response.Content, true);

                            var config = new AmazonS3Config
                            {
                                RegionEndpoint = RegionEndpoint.GetBySystemName(s3region),
                                UseHttp        = true
                            };
                            using (var s3 = new AmazonS3Client(s3publickey, s3privatekey, config))
                            {
                                var upload = false;
                                try
                                {
                                    var request = new GetObjectMetadataRequest
                                    {
                                        BucketName = s3bucket,
                                        Key        = key,
                                    };
                                    var response = s3.GetObjectMetadata(request);
                                    upload = !string.Equals(checksum, response.Metadata["x-amz-meta-etag"], StringComparison.InvariantCultureIgnoreCase);
                                }
                                catch (AmazonS3Exception ex)
                                {
                                    if (ex.StatusCode == HttpStatusCode.NotFound)
                                    {
                                        upload = true;
                                    }
                                    else
                                    {
                                        throw;
                                    }
                                }

                                if (upload)
                                {
                                    var request = new PutObjectRequest
                                    {
                                        BucketName              = s3bucket,
                                        CannedACL               = S3CannedACL.PublicRead,
                                        AutoCloseStream         = true,
                                        AutoResetStreamPosition = true,
                                        Key         = key,
                                        ContentType = AmazonS3Util.MimeTypeFromExtension(Path.GetExtension(key).ToLowerInvariant()),
                                        InputStream = inputStream
                                    };

                                    if (ClientSettings.GZipEnabled)
                                    {
                                        request.Headers.ContentEncoding = "gzip";
                                    }

                                    var cache = TimeSpan.FromDays(365);
                                    request.Headers.CacheControl       = string.Format("public, maxage={0}", (int)cache.TotalSeconds);
                                    request.Headers.ExpiresUtc         = DateTime.UtcNow.Add(cache);
                                    request.Headers["x-amz-meta-etag"] = checksum;

                                    s3.PutObject(request);
                                }
                                else
                                {
                                    inputStream.Close();
                                }

                                item.Bundle.CdnPath = cdnpath;
                            }
                        }
                    }
                    catch (Exception err)
                    {
                        log.Error(err);
                    }
                    finally
                    {
                        work = 0;
                        if (@continue)
                        {
                            Action upload = () => UploadToCdn();
                            upload.BeginInvoke(null, null);
                        }
                    }
                }
            }
            catch (Exception fatal)
            {
                log.Fatal(fatal);
            }
        }
        protected override void ProcessPreRequestHandlers(AmazonWebServiceRequest request)
        {
            base.ProcessPreRequestHandlers(request);

            var putObjectRequest = request as PutObjectRequest;

            if (putObjectRequest != null)
            {
                if (putObjectRequest.InputStream != null && !string.IsNullOrEmpty(putObjectRequest.FilePath))
                {
                    throw new ArgumentException("Please specify one of either an InputStream or a FilePath to be PUT as an S3 object.");
                }
                if (!string.IsNullOrEmpty(putObjectRequest.ContentBody) && !string.IsNullOrEmpty(putObjectRequest.FilePath))
                {
                    throw new ArgumentException("Please specify one of either a FilePath or the ContentBody to be PUT as an S3 object.");
                }
                if (putObjectRequest.InputStream != null && !string.IsNullOrEmpty(putObjectRequest.ContentBody))
                {
                    throw new ArgumentException("Please specify one of either an InputStream or the ContentBody to be PUT as an S3 object.");
                }

                if (!putObjectRequest.Headers.IsSetContentType())
                {
                    // Get the extension of the file from the path.
                    // Try the key as well.
                    string ext = null;
                    if (!string.IsNullOrEmpty(putObjectRequest.FilePath))
                    {
                        ext = Path.GetExtension(putObjectRequest.FilePath);
                    }
#if WIN_RT || WINDOWS_PHONE
                    if (putObjectRequest.StorageFile != null)
                    {
                        ext = Path.GetExtension(putObjectRequest.StorageFile.Path);
                    }
#endif
                    if (String.IsNullOrEmpty(ext) && putObjectRequest.IsSetKey())
                    {
                        ext = Path.GetExtension(putObjectRequest.Key);
                    }
                    // Use the extension to get the mime-type
                    if (!String.IsNullOrEmpty(ext))
                    {
                        putObjectRequest.Headers.ContentType = AmazonS3Util.MimeTypeFromExtension(ext);
                    }
                }

                if (putObjectRequest.InputStream != null)
                {
                    if (putObjectRequest.AutoResetStreamPosition && putObjectRequest.InputStream.CanSeek)
                    {
                        putObjectRequest.InputStream.Seek(0, SeekOrigin.Begin);
                    }
                }

                if (!string.IsNullOrEmpty(putObjectRequest.FilePath))
                {
                    putObjectRequest.SetupForFilePath();
                }
#if WIN_RT || WINDOWS_PHONE
                else if (putObjectRequest.StorageFile != null)
                {
                    putObjectRequest.InputStream = Task.Run(() =>
                                                            putObjectRequest.StorageFile.OpenAsync(Windows.Storage.FileAccessMode.Read).AsTask())
                                                   .Result.AsStreamForRead();
                    if (string.IsNullOrEmpty(putObjectRequest.Key))
                    {
                        putObjectRequest.Key = Path.GetFileName(putObjectRequest.StorageFile.Name);
                    }
                }
#endif
                else if (null == putObjectRequest.InputStream)
                {
                    if (string.IsNullOrEmpty(putObjectRequest.Headers.ContentType))
                    {
                        putObjectRequest.Headers.ContentType = "text/plain";
                    }

                    var payload = Encoding.UTF8.GetBytes(putObjectRequest.ContentBody ?? "");
                    //putObjectRequest.Headers[AWS4Signer.XAmzContentSha256]
                    //        = AWSSDKUtils.ToHex(AWS4Signer.ComputeHash(payload), true);
                    putObjectRequest.InputStream = new MemoryStream(payload);
                }
            }

            var putBucketRequest = request as PutBucketRequest;
            if (putBucketRequest != null)
            {
                // UseClientRegion only applies if neither BucketRegionName and BucketRegion are set.
                if (putBucketRequest.UseClientRegion &&
                    !(putBucketRequest.IsSetBucketRegionName() || putBucketRequest.IsSetBucketRegion()))
                {
                    var regionCode = Amazon.Util.AWSSDKUtils.DetermineRegion(this.Config.DetermineServiceURL());
                    if (regionCode == S3Constants.REGION_US_EAST_1)
                    {
                        regionCode = null;
                    }
                    else if (regionCode == S3Constants.REGION_EU_WEST_1)
                    {
                        regionCode = "EU";
                    }

                    putBucketRequest.BucketRegion = regionCode;
                }
            }

            var deleteBucketRequest = request as DeleteBucketRequest;
            if (deleteBucketRequest != null)
            {
                if (deleteBucketRequest.UseClientRegion && !deleteBucketRequest.IsSetBucketRegion())
                {
                    var regionCode = Amazon.Util.AWSSDKUtils.DetermineRegion(this.Config.DetermineServiceURL());
                    if (regionCode == S3Constants.REGION_US_EAST_1)
                    {
                        regionCode = null;
                    }
                    //else if (regionCode == S3Constants.REGION_EU_WEST_1)
                    //    regionCode = "EU";

                    if (regionCode != null)
                    {
                        deleteBucketRequest.BucketRegion = regionCode;
                    }
                }
            }

            var uploadPartRequest = request as UploadPartRequest;
            if (uploadPartRequest != null)
            {
                if (uploadPartRequest.InputStream != null && !string.IsNullOrEmpty(uploadPartRequest.FilePath))
                {
                    throw new ArgumentException("Please specify one of either a InputStream or a FilePath to be PUT as an S3 object.");
                }

                if (uploadPartRequest.IsSetFilePath())
                {
                    uploadPartRequest.SetupForFilePath();
                }
#if WIN_RT || WINDOWS_PHONE
                else if (uploadPartRequest.StorageFile != null)
                {
                    uploadPartRequest.InputStream = Task.Run(() =>
                                                             uploadPartRequest.StorageFile.OpenAsync(Windows.Storage.FileAccessMode.Read).AsTask())
                                                    .Result.AsStreamForRead();
                    uploadPartRequest.InputStream.Position = uploadPartRequest.FilePosition;
                }
#endif
            }

            var initMultipartRequest = request as InitiateMultipartUploadRequest;
            if (initMultipartRequest != null)
            {
                if (!initMultipartRequest.Headers.IsSetContentType())
                {
                    // Get the extension of the object key.
                    string ext = Path.GetExtension(initMultipartRequest.Key);

                    // Use the extension to get the mime-type
                    if (!String.IsNullOrEmpty(ext))
                    {
                        initMultipartRequest.Headers.ContentType = AmazonS3Util.MimeTypeFromExtension(ext);
                    }
                }
            }
        }
Exemplo n.º 13
0
        private void UploadToCdn()
        {
            try
            {
                // one thread only
                if (Interlocked.CompareExchange(ref work, 1, 0) == 0)
                {
                    var @continue = false;
                    try
                    {
                        CdnItem item;
                        if (queue.TryDequeue(out item))
                        {
                            @continue = true;

                            var cdnpath    = GetCdnPath(item.Bundle.Path);
                            var key        = new Uri(cdnpath).PathAndQuery.TrimStart('/');
                            var contentMD5 = Hasher.Base64Hash(item.Response.Content, HashAlg.MD5);
                            var compressed = new MemoryStream();

                            if (ClientSettings.GZipEnabled)
                            {
                                using (var compression = new GZipStream(compressed, CompressionMode.Compress, true))
                                {
                                    new MemoryStream(Encoding.UTF8.GetBytes(item.Response.Content)).CopyTo(compression);
                                }
                                contentMD5 = Hasher.Base64Hash(compressed.GetCorrectBuffer(), HashAlg.MD5);
                            }

                            var config = new AmazonS3Config
                            {
                                RegionEndpoint = RegionEndpoint.GetBySystemName(s3region),
                                UseHttp        = true
                            };
                            using (var s3 = new AmazonS3Client(s3publickey, s3privatekey, config))
                            {
                                var upload = false;
                                try
                                {
                                    var request = new GetObjectMetadataRequest
                                    {
                                        BucketName = s3bucket,
                                        Key        = key
                                    };
                                    var response = s3.GetObjectMetadata(request);
                                    upload = !string.Equals(contentMD5, response.Metadata["x-amz-meta-etag"], StringComparison.InvariantCultureIgnoreCase);
                                }
                                catch (AmazonS3Exception ex)
                                {
                                    if (ex.StatusCode == HttpStatusCode.NotFound)
                                    {
                                        upload = true;
                                    }
                                    else
                                    {
                                        throw;
                                    }
                                }

                                if (upload)
                                {
                                    var request = new PutObjectRequest
                                    {
                                        BucketName  = s3bucket,
                                        CannedACL   = S3CannedACL.PublicRead,
                                        Key         = key,
                                        ContentType = AmazonS3Util.MimeTypeFromExtension(Path.GetExtension(key).ToLowerInvariant())
                                    };

                                    if (ClientSettings.GZipEnabled)
                                    {
                                        request.InputStream             = compressed;
                                        request.Headers.ContentEncoding = "gzip";
                                    }
                                    else
                                    {
                                        request.ContentBody = item.Response.Content;
                                    }

                                    var cache = TimeSpan.FromDays(365);
                                    request.Headers.CacheControl       = string.Format("public, maxage={0}", (int)cache.TotalSeconds);
                                    request.Headers.Expires            = DateTime.UtcNow.Add(cache);
                                    request.Headers.ContentMD5         = contentMD5;
                                    request.Headers["x-amz-meta-etag"] = contentMD5;
                                    //request.AddHeader("Last-Modified", DateTime.UtcNow.ToString("R"));

                                    s3.PutObject(request);
                                }

                                item.Bundle.CdnPath = cdnpath;
                            }
                        }
                    }
                    catch (Exception err)
                    {
                        log.Error(err);
                    }
                    finally
                    {
                        work = 0;
                        if (@continue)
                        {
                            Action upload = () => UploadToCdn();
                            upload.BeginInvoke(null, null);
                        }
                    }
                }
            }
            catch (Exception fatal)
            {
                log.Fatal(fatal);
            }
        }
Exemplo n.º 14
0
        private static void ProcessPreRequestHandlers(IExecutionContext executionContext)
        {
            var request = executionContext.RequestContext.OriginalRequest;
            var config  = executionContext.RequestContext.ClientConfig;


            var putObjectRequest = request as PutObjectRequest;

            if (putObjectRequest != null)
            {
                if (putObjectRequest.InputStream != null && !string.IsNullOrEmpty(putObjectRequest.FilePath))
                {
                    throw new ArgumentException("Please specify one of either an InputStream or a FilePath to be PUT as an S3 object.");
                }
                if (!string.IsNullOrEmpty(putObjectRequest.ContentBody) && !string.IsNullOrEmpty(putObjectRequest.FilePath))
                {
                    throw new ArgumentException("Please specify one of either a FilePath or the ContentBody to be PUT as an S3 object.");
                }
                if (putObjectRequest.InputStream != null && !string.IsNullOrEmpty(putObjectRequest.ContentBody))
                {
                    throw new ArgumentException("Please specify one of either an InputStream or the ContentBody to be PUT as an S3 object.");
                }

                if (!putObjectRequest.Headers.IsSetContentType())
                {
                    // Get the extension of the file from the path.
                    // Try the key as well.
                    string ext = null;
                    if (!string.IsNullOrEmpty(putObjectRequest.FilePath))
                    {
                        ext = AWSSDKUtils.GetExtension(putObjectRequest.FilePath);
                    }
                    if (String.IsNullOrEmpty(ext) && putObjectRequest.IsSetKey())
                    {
                        ext = AWSSDKUtils.GetExtension(putObjectRequest.Key);
                    }
                    if (!String.IsNullOrEmpty(ext))
                    // Use the extension to get the mime-type
                    {
                        putObjectRequest.Headers.ContentType = AmazonS3Util.MimeTypeFromExtension(ext);
                    }
                }

                if (putObjectRequest.InputStream != null)
                {
                    if (putObjectRequest.AutoResetStreamPosition && putObjectRequest.InputStream.CanSeek)
                    {
                        putObjectRequest.InputStream.Seek(0, SeekOrigin.Begin);
                    }
                }

                if (!string.IsNullOrEmpty(putObjectRequest.FilePath))
                {
                    putObjectRequest.SetupForFilePath();
                }
                else if (null == putObjectRequest.InputStream)
                {
                    if (string.IsNullOrEmpty(putObjectRequest.Headers.ContentType))
                    {
                        putObjectRequest.Headers.ContentType = "text/plain";
                    }

                    var payload = Encoding.UTF8.GetBytes(putObjectRequest.ContentBody ?? "");
                    //putObjectRequest.Headers[AWS4Signer.XAmzContentSha256]
                    //        = AWSSDKUtils.ToHex(AWS4Signer.ComputeHash(payload), true);
                    putObjectRequest.InputStream = new MemoryStream(payload);
                }
            }

            var putBucketRequest = request as PutBucketRequest;

            if (putBucketRequest != null)
            {
                // UseClientRegion only applies if neither BucketRegionName and BucketRegion are set.
                if (putBucketRequest.UseClientRegion &&
                    !(putBucketRequest.IsSetBucketRegionName() || putBucketRequest.IsSetBucketRegion()))
                {
                    var regionCode = DetermineBucketRegionCode(config);
                    if (regionCode == S3Constants.REGION_US_EAST_1)
                    {
                        regionCode = null;
                    }
                    else if (regionCode == S3Constants.REGION_EU_WEST_1)
                    {
                        regionCode = "EU";
                    }

                    putBucketRequest.BucketRegion = regionCode;
                }
            }

            var deleteBucketRequest = request as DeleteBucketRequest;

            if (deleteBucketRequest != null)
            {
                if (deleteBucketRequest.UseClientRegion && !deleteBucketRequest.IsSetBucketRegion())
                {
                    var regionCode = DetermineBucketRegionCode(config);
                    if (regionCode == S3Constants.REGION_US_EAST_1)
                    {
                        regionCode = null;
                    }
                    //else if (regionCode == S3Constants.REGION_EU_WEST_1)
                    //    regionCode = "EU";

                    if (regionCode != null)
                    {
                        deleteBucketRequest.BucketRegion = regionCode;
                    }
                }
            }

            var uploadPartRequest = request as UploadPartRequest;

            if (uploadPartRequest != null)
            {
                if (uploadPartRequest.InputStream != null && !string.IsNullOrEmpty(uploadPartRequest.FilePath))
                {
                    throw new ArgumentException("Please specify one of either a InputStream or a FilePath to be PUT as an S3 object.");
                }

                if (uploadPartRequest.IsSetFilePath())
                {
                    uploadPartRequest.SetupForFilePath();
                }
            }

            var initMultipartRequest = request as InitiateMultipartUploadRequest;

            if (initMultipartRequest != null)
            {
                if (!initMultipartRequest.Headers.IsSetContentType())
                {
                    // Get the extension of the object key.
                    string ext = AWSSDKUtils.GetExtension(initMultipartRequest.Key);

                    // Use the extension to get the mime-type
                    if (!String.IsNullOrEmpty(ext))
                    {
                        initMultipartRequest.Headers.ContentType = AmazonS3Util.MimeTypeFromExtension(ext);
                    }
                }
            }
        }
Exemplo n.º 15
0
        private void UploadToCdn()
        {
            try
            {
                // one thread only
                if (Interlocked.CompareExchange(ref work, 1, 0) == 0)
                {
                    var @continue = false;
                    try
                    {
                        CdnItem item;
                        if (queue.TryDequeue(out item))
                        {
                            @continue = true;

                            var cdnpath = GetCdnPath(item.Bundle.Path);
                            var key     = new Uri(cdnpath).PathAndQuery.TrimStart('/');
                            var etag    = AmazonS3Util.GenerateChecksumForContent(item.Response.Content, false).ToLowerInvariant();

                            var config = new AmazonS3Config
                            {
                                ServiceURL            = "s3.amazonaws.com",
                                CommunicationProtocol = Protocol.HTTP
                            };
                            using (var s3 = new AmazonS3Client(s3publickey, s3privatekey, config))
                            {
                                var upload = false;
                                try
                                {
                                    var request = new GetObjectMetadataRequest
                                    {
                                        BucketName = s3bucket,
                                        Key        = key,
                                    };
                                    using (var response = s3.GetObjectMetadata(request))
                                    {
                                        upload = !string.Equals(etag, response.ETag.Trim('"'), StringComparison.InvariantCultureIgnoreCase);
                                    }
                                }
                                catch (AmazonS3Exception ex)
                                {
                                    if (ex.StatusCode == HttpStatusCode.NotFound)
                                    {
                                        upload = true;
                                    }
                                    else
                                    {
                                        throw;
                                    }
                                }

                                if (upload)
                                {
                                    var request = new PutObjectRequest
                                    {
                                        BucketName  = s3bucket,
                                        CannedACL   = S3CannedACL.PublicRead,
                                        Key         = key,
                                        ContentType = AmazonS3Util.MimeTypeFromExtension(Path.GetExtension(key).ToLowerInvariant()),
                                    };

                                    if (ClientSettings.GZipEnabled)
                                    {
                                        var compressed = new MemoryStream();
                                        using (var compression = new GZipStream(compressed, CompressionMode.Compress, true))
                                        {
                                            new MemoryStream(Encoding.UTF8.GetBytes(item.Response.Content)).CopyTo(compression);
                                        }
                                        request.InputStream = compressed;
                                        request.AddHeader("Content-Encoding", "gzip");
                                    }
                                    else
                                    {
                                        request.ContentBody = item.Response.Content;
                                    }

                                    var cache = TimeSpan.FromDays(365);
                                    request.AddHeader("Cache-Control", string.Format("public, maxage={0}", (int)cache.TotalSeconds));
                                    request.AddHeader("Expires", DateTime.UtcNow.Add(cache).ToString("R"));
                                    request.AddHeader("Etag", etag);
                                    request.AddHeader("Last-Modified", DateTime.UtcNow.ToString("R"));

                                    using (s3.PutObject(request)) { }
                                }

                                item.Bundle.CdnPath = cdnpath;
                            }
                        }
                    }
                    catch (Exception err)
                    {
                        log.Error(err);
                    }
                    finally
                    {
                        work = 0;
                        if (@continue)
                        {
                            Action upload = () => UploadToCdn();
                            upload.BeginInvoke(null, null);
                        }
                    }
                }
            }
            catch (Exception fatal)
            {
                log.Fatal(fatal);
            }
        }
Exemplo n.º 16
0
        private static void ProcessPreRequestHandlers(IExecutionContext executionContext)
        {
            AmazonWebServiceRequest originalRequest  = executionContext.get_RequestContext().get_OriginalRequest();
            IClientConfig           clientConfig     = executionContext.get_RequestContext().get_ClientConfig();
            PutObjectRequest        putObjectRequest = originalRequest as PutObjectRequest;

            if (putObjectRequest != null)
            {
                if (putObjectRequest.InputStream != null && !string.IsNullOrEmpty(putObjectRequest.FilePath))
                {
                    throw new ArgumentException("Please specify one of either an InputStream or a FilePath to be PUT as an S3 object.");
                }
                if (!string.IsNullOrEmpty(putObjectRequest.ContentBody) && !string.IsNullOrEmpty(putObjectRequest.FilePath))
                {
                    throw new ArgumentException("Please specify one of either a FilePath or the ContentBody to be PUT as an S3 object.");
                }
                if (putObjectRequest.InputStream != null && !string.IsNullOrEmpty(putObjectRequest.ContentBody))
                {
                    throw new ArgumentException("Please specify one of either an InputStream or the ContentBody to be PUT as an S3 object.");
                }
                if (!putObjectRequest.Headers.IsSetContentType())
                {
                    string text = null;
                    if (!string.IsNullOrEmpty(putObjectRequest.FilePath))
                    {
                        text = AWSSDKUtils.GetExtension(putObjectRequest.FilePath);
                    }
                    if (string.IsNullOrEmpty(text) && putObjectRequest.IsSetKey())
                    {
                        text = AWSSDKUtils.GetExtension(putObjectRequest.Key);
                    }
                    if (!string.IsNullOrEmpty(text))
                    {
                        putObjectRequest.Headers.ContentType = AmazonS3Util.MimeTypeFromExtension(text);
                    }
                }
                if (putObjectRequest.InputStream != null && putObjectRequest.AutoResetStreamPosition && putObjectRequest.InputStream.CanSeek)
                {
                    putObjectRequest.InputStream.Seek(0L, SeekOrigin.Begin);
                }
                if (!string.IsNullOrEmpty(putObjectRequest.FilePath))
                {
                    putObjectRequest.SetupForFilePath();
                }
                else if (putObjectRequest.InputStream == null)
                {
                    if (string.IsNullOrEmpty(putObjectRequest.Headers.ContentType))
                    {
                        putObjectRequest.Headers.ContentType = "text/plain";
                    }
                    byte[] bytes = Encoding.UTF8.GetBytes(putObjectRequest.ContentBody ?? "");
                    putObjectRequest.InputStream = new MemoryStream(bytes);
                }
            }
            PutBucketRequest putBucketRequest = originalRequest as PutBucketRequest;

            if (putBucketRequest != null && putBucketRequest.UseClientRegion && !putBucketRequest.IsSetBucketRegionName() && !putBucketRequest.IsSetBucketRegion())
            {
                string text2 = DetermineBucketRegionCode(clientConfig);
                if (text2 == "us-east-1")
                {
                    text2 = null;
                }
                else if (text2 == "eu-west-1")
                {
                    text2 = "EU";
                }
                putBucketRequest.BucketRegion = text2;
            }
            DeleteBucketRequest deleteBucketRequest = originalRequest as DeleteBucketRequest;

            if (deleteBucketRequest != null && deleteBucketRequest.UseClientRegion && !deleteBucketRequest.IsSetBucketRegion())
            {
                string text3 = DetermineBucketRegionCode(clientConfig);
                if (text3 == "us-east-1")
                {
                    text3 = null;
                }
                if (text3 != null)
                {
                    deleteBucketRequest.BucketRegion = text3;
                }
            }
            UploadPartRequest uploadPartRequest = originalRequest as UploadPartRequest;

            if (uploadPartRequest != null)
            {
                if (uploadPartRequest.InputStream != null && !string.IsNullOrEmpty(uploadPartRequest.FilePath))
                {
                    throw new ArgumentException("Please specify one of either a InputStream or a FilePath to be PUT as an S3 object.");
                }
                if (uploadPartRequest.IsSetFilePath())
                {
                    uploadPartRequest.SetupForFilePath();
                }
            }
            InitiateMultipartUploadRequest initiateMultipartUploadRequest = originalRequest as InitiateMultipartUploadRequest;

            if (initiateMultipartUploadRequest != null && !initiateMultipartUploadRequest.Headers.IsSetContentType())
            {
                string extension = AWSSDKUtils.GetExtension(initiateMultipartUploadRequest.Key);
                if (!string.IsNullOrEmpty(extension))
                {
                    initiateMultipartUploadRequest.Headers.ContentType = AmazonS3Util.MimeTypeFromExtension(extension);
                }
            }
        }