Пример #1
0
        public static string AuthField(
            Credentials creds,
            string verb,
            string date,
            string resourcePath,
            IDictionary <string, string> queryString,
            string md5         = "",
            string contentType = "",
            IDictionary <string, string> amzHeaders = null)
        {
            var payload = BuildPayload(
                verb,
                date,
                resourcePath,
                queryString,
                md5,
                contentType,
                amzHeaders ?? new Dictionary <string, string>()
                );

            return("AWS " + creds.AccessId + ":" + S3Signer.Signature(creds.Key, payload));
        }
Пример #2
0
        private HttpWebRequest CreateRequest(Ds3Request request, Stream content)
        {
            if (request.Verb == HttpVerb.PUT || request.Verb == HttpVerb.POST)
            {
                if (content != Stream.Null && !content.CanRead)
                {
                    throw new Ds3.Runtime.Ds3RequestException(Resources.InvalidStreamException);
                }
            }

            DateTime   date       = DateTime.UtcNow;
            UriBuilder uriBuilder = new UriBuilder(_endpoint);

            uriBuilder.Path = HttpHelper.PercentEncodePath(request.Path);

            if (request.QueryParams.Count > 0)
            {
                uriBuilder.Query = BuildQueryParams(request.QueryParams);
            }

            HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(uriBuilder.ToString());

            httpRequest.ServicePoint.ConnectionLimit = _connectionLimit;
            httpRequest.Method = request.Verb.ToString();
            if (Proxy != null)
            {
                WebProxy webProxy = new WebProxy();
                webProxy.Address  = Proxy;
                httpRequest.Proxy = webProxy;
            }
            httpRequest.Date = date;
            httpRequest.Host = CreateHostString(_endpoint);
            httpRequest.AllowAutoRedirect         = false;
            httpRequest.AllowWriteStreamBuffering = false;
            httpRequest.ReadWriteTimeout          = this._readWriteTimeout;
            httpRequest.Timeout = this._requestTimeout;

            var md5 = ComputeChecksum(request.Md5, content);

            if (!string.IsNullOrEmpty(md5))
            {
                httpRequest.Headers.Add(HttpHeaders.ContentMd5, md5);
            }
            httpRequest.Headers.Add(HttpHeaders.Authorization, S3Signer.AuthField(
                                        _creds,
                                        request.Verb.ToString(),
                                        date.ToString("r"),
                                        request.Path,
                                        request.QueryParams,
                                        md5: md5,
                                        amzHeaders: request.Headers
                                        ));

            foreach (var byteRange in request.GetByteRanges())
            {
                httpRequest.AddRange(byteRange.Start, byteRange.End);
            }

            foreach (var header in request.Headers)
            {
                httpRequest.Headers.Add(header.Key, header.Value);
            }

            if (request.Verb == HttpVerb.PUT || request.Verb == HttpVerb.POST)
            {
                httpRequest.ContentLength = content.Length;
                if (content != Stream.Null)
                {
                    using (var requestStream = httpRequest.GetRequestStream())
                    {
                        if (content.Position != 0)
                        {
                            content.Seek(0, SeekOrigin.Begin);
                        }
                        content.CopyTo(requestStream, this.CopyBufferSize);
                        requestStream.Flush();
                    }
                }
            }
            return(httpRequest);
        }