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)); }
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); }
/// <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); } }
// 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); }
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"; } } }
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); }
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); } } } }
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); } }
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); } } } }
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); } }
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); } } }