private ServiceRequest BuildRequest() { var conf = OssUtils.GetClientConfiguration(Client); var request = new ServiceRequest { Method = Method, Endpoint = OssUtils.MakeBucketEndpoint(Endpoint, Bucket, conf), ResourcePath = OssUtils.MakeResourcePath(Key) }; foreach (var p in Parameters) { request.Parameters.Add(p.Key, p.Value); } var adjustedTime = DateTime.UtcNow.AddSeconds(conf.TickOffset); request.Headers[HttpHeaders.Date] = DateUtils.FormatRfc822Date(adjustedTime); if (!Headers.ContainsKey(HttpHeaders.ContentType)) { request.Headers[HttpHeaders.ContentType] = string.Empty; } foreach (var h in Headers) { request.Headers.Add(h.Key, h.Value); } if (Context.Credentials.UseToken) { request.Headers[HttpHeaders.SecurityToken] = Context.Credentials.SecurityToken; } request.Content = Content; return(request); }
/// <inheritdoc/> public Uri GeneratePresignedUri(GeneratePresignedUriRequest generatePresignedUriRequest) { ThrowIfNullRequest(generatePresignedUriRequest); var creds = _credsProvider.GetCredentials(); var accessId = creds.AccessId; var accessKey = creds.AccessKey; var securityToken = creds.SecurityToken; var useToken = creds.UseToken; var bucketName = generatePresignedUriRequest.BucketName; var key = generatePresignedUriRequest.Key; const long ticksOf1970 = 621355968000000000; var expires = ((generatePresignedUriRequest.Expiration.ToUniversalTime().Ticks - ticksOf1970) / 10000000L) .ToString(CultureInfo.InvariantCulture); var resourcePath = OssUtils.MakeResourcePath(key); var request = new ServiceRequest(); var conf = OssUtils.GetClientConfiguration(_serviceClient); request.Endpoint = OssUtils.MakeBucketEndpoint(_endpoint, bucketName, conf); request.ResourcePath = resourcePath; switch (generatePresignedUriRequest.Method) { case SignHttpMethod.Get: request.Method = HttpMethod.Get; break; case SignHttpMethod.Put: request.Method = HttpMethod.Put; break; default: throw new ArgumentException("Unsupported http method."); } request.Headers.Add(HttpHeaders.Date, expires); if (!string.IsNullOrEmpty(generatePresignedUriRequest.ContentType)) { request.Headers.Add(HttpHeaders.ContentType, generatePresignedUriRequest.ContentType); } if (!string.IsNullOrEmpty(generatePresignedUriRequest.ContentMd5)) { request.Headers.Add(HttpHeaders.ContentMd5, generatePresignedUriRequest.ContentMd5); } foreach (var pair in generatePresignedUriRequest.UserMetadata) { request.Headers.Add(OssHeaders.OssUserMetaPrefix + pair.Key, pair.Value); } if (generatePresignedUriRequest.ResponseHeaders != null) { generatePresignedUriRequest.ResponseHeaders.Populate(request.Parameters); } foreach (var param in generatePresignedUriRequest.QueryParams) { request.Parameters.Add(param.Key, param.Value); } if (useToken) { request.Parameters.Add(RequestParameters.SECURITY_TOKEN, securityToken); } var canonicalResource = "/" + (bucketName ?? "") + ((key != null ? "/" + key : "")); var httpMethod = generatePresignedUriRequest.Method.ToString().ToUpperInvariant(); var canonicalString = SignUtils.BuildCanonicalString(httpMethod, canonicalResource, request /*, expires*/); var signature = ServiceSignature.Create().ComputeSignature(accessKey, canonicalString); IDictionary <string, string> queryParams = new Dictionary <string, string>(); queryParams.Add(RequestParameters.EXPIRES, expires); queryParams.Add(RequestParameters.OSS_ACCESS_KEY_ID, accessId); queryParams.Add(RequestParameters.SIGNATURE, signature); foreach (var param in request.Parameters) { queryParams.Add(param.Key, param.Value); } var queryString = HttpUtils.ConbineQueryString(queryParams); var uriString = request.Endpoint.ToString(); if (!uriString.EndsWith("/")) { uriString += "/"; } uriString += resourcePath + "?" + queryString; return(new Uri(uriString)); }
public void OssUtilsTest() { var conf = new ClientConfiguration(); Assert.AreEqual(OssUtils.IsBucketNameValid(""), false); var str = OssUtils.MakeResourcePath(new Uri("http://192.168.1.1"), "bucket", "key/abc/"); Assert.AreEqual(str, "bucket/key/abc/"); //cname conf.IsCname = true; var uri = OssUtils.MakeBucketEndpoint(new Uri("http://endpoint"), "bucket", conf); Assert.AreEqual(uri.ToString(), "http://endpoint/"); //ip endpoint & endpoint port conf.IsCname = false; uri = OssUtils.MakeBucketEndpoint(new Uri("http://192.168.1.1"), "bucket", conf); Assert.AreEqual(uri.ToString(), "http://192.168.1.1/"); uri = OssUtils.MakeBucketEndpoint(new Uri("http://192.168.1.1:3128"), "bucket", conf); Assert.AreEqual(uri.ToString(), "http://192.168.1.1:3128/"); //bucket conf.IsCname = false; uri = OssUtils.MakeBucketEndpoint(new Uri("http://endpoint"), null, conf); Assert.AreEqual(uri.ToString(), "http://endpoint/"); conf.IsCname = false; uri = OssUtils.MakeBucketEndpoint(new Uri("http://endpoint"), "bucket", conf); Assert.AreEqual(uri.ToString(), "http://bucket.endpoint/"); //TrimQuotes Assert.AreEqual(OssUtils.TrimQuotes("\"test\""), "test"); Assert.AreEqual(OssUtils.TrimQuotes("test\""), "test"); Assert.AreEqual(OssUtils.TrimQuotes("\"test"), "test"); Assert.AreEqual(OssUtils.TrimQuotes(null), null); //ComputeContentCrc64 var content = new MemoryStream(Encoding.ASCII.GetBytes("")); str = OssUtils.ComputeContentCrc64(content, 1); Assert.AreEqual(str, string.Empty); //JoinETag var etagList = new List <string>(); etagList.Add("etag1"); etagList.Add("etag2"); str = OssUtils.JoinETag(etagList); Assert.AreEqual(str, "etag1, etag2"); //GetResourcePathFromSignedUrl str = OssUtils.GetResourcePathFromSignedUrl(new Uri("http://endpoint/key")); Assert.AreEqual(str, "key"); str = OssUtils.GetResourcePathFromSignedUrl(new Uri("http://endpoint")); Assert.AreEqual(str, ""); //GetParametersFromSignedUrl }