C# HttpWebRequest Date Header Formatting

后端 未结 4 981
無奈伤痛
無奈伤痛 2020-12-30 13:13

I\'m making a HttpWebRequest to S3, and I\'m trying to set the Date header to something like this:

\"Mon, 16 Jul 2012 01:16:18 -0000\"

4条回答
  •  忘掉有多难
    2020-12-30 13:45

    You should use "X-Amz-Date" header.

    public void GetObject(string AccessKeyID, string SecretKey){           
            /*objectKey = folder/folder/filename.zzz*/
            var url = "http://somehost/bucket/objectkey"
    
            HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url);
            /*Fiddler proxy*/
            /*request.Proxy = new WebProxy("http://127.0.0.1:8888");*/
    
            request.Headers.Add("X-Amz-Date",String.Format("{0:ffffd,' 'dd' 'MMM' 'yyyy' 'HH':'mm':'ss' 'K}", DateTime.Now));
            request.Headers.Add("Authorization", $"AWS {AccessKeyID}:{SignAuthorizationString(request, SecretKey)}");
    
            WebResponse response = request.GetResponse();
            }
    private string SignAuthorizationString(HttpWebRequest request, string SecretKey){
            //TODO: DOCS - http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html
    
            string canonicalizedResource = request.RequestUri.PathAndQuery;
            string canonicalizedAmzHeaders  = ComposeSignatureAmzHeadersForSigning(request);
            string stringToSign = request.Method + "\n"
                                  + request.Headers.Get("Content-MD5") + "\n"
                                  + request.ContentType + "\n"
                                  + request.Headers.Get("Date") + "\n" /*Here the date will be blank*/
                                  + canonicalizedAmzHeaders + canonicalizedResource;
    
            return GetSignedMessage(SecretKey, stringToSign);
            }
     private string ComposeSignatureAmzHeadersForSigning(HttpWebRequest request){
            SortedDictionary headersDictionary = new SortedDictionary(StringComparer.OrdinalIgnoreCase);
            foreach (string _key in request.Headers.Keys)
            {
                key = _key.ToLower(); 
                if (key.StartsWith("x-amz"))
                {
                    if ("x-amz-meta-reviewedby".Equals(key))
                    {
                        if (headersDictionary.ContainsKey(key))
                            headersDictionary[key] = headersDictionary[key] + "," + request.Headers[key];
                        else
                            headersDictionary[key] = request.Headers[key];
                    }
                    else
                        headersDictionary[key] = request.Headers.Get(key);
                }
            }
            StringBuilder stringBuilder = new StringBuilder();
            foreach (var pair in headersDictionary)
            {
                stringBuilder.Append(pair.Key)
                    .Append(":")
                    .Append(pair.Value)
                    .Append("\n");
    
            }
            return stringBuilder.ToString();
            }
    private static string GetSignedMessage(string key, string message){
            var crypt = HMACSHA1.Create();
            crypt.Key = Encoding.ASCII.GetBytes(key);
            crypt.ComputeHash(Encoding.UTF8.GetBytes(message));
    
            return Convert.ToBase64String(crypt.Hash);
            }
    

提交回复
热议问题