static string BuildStringToSign(IRequest request)
{
var sb = new StringBuilder("", 256);
sb.Append(request.HttpMethod);
sb.Append("\n");
var headers = request.Headers;
var parameters = request.Parameters;
if (headers != null)
{
string value = null;
if (headers.ContainsKey(HeaderKeys.ContentMD5Header) && !String.IsNullOrEmpty(value = headers[HeaderKeys.ContentMD5Header]))
{
sb.Append(value);
}
sb.Append("\n");
if (parameters.ContainsKey("ContentType"))
{
sb.Append(parameters["ContentType"]);
}
else if (headers.ContainsKey(HeaderKeys.ContentTypeHeader))
{
sb.Append(headers[HeaderKeys.ContentTypeHeader]);
}
sb.Append("\n");
}
else
{
// The headers are null, but we still need to append
// the 2 newlines that are required by S3.
// Without these, S3 rejects the signature.
sb.Append("\n\n");
}
if (parameters.ContainsKey("Expires"))
{
sb.Append(parameters["Expires"]);
if (headers != null)
headers.Remove(HeaderKeys.XAmzDateHeader);
}
sb.Append("\n");
sb.Append(BuildCanonicalizedHeaders(headers));
var canonicalizedResource = BuildCanonicalizedResource(request);
if (!string.IsNullOrEmpty(canonicalizedResource))
sb.Append(canonicalizedResource);
return sb.ToString();
}