38 #if defined(MAC_OS_X_VERSION_10_7)
39 #include <CommonCrypto/CommonHMAC.h>
40 #define SHA_DIGEST_LENGTH 20
42 #include <openssl/sha.h>
43 #include <openssl/hmac.h>
44 #include <openssl/evp.h>
45 #include <openssl/bio.h>
46 #include <openssl/buffer.h>
53 ClassImp(TS3HTTPRequest);
57 TS3HTTPRequest::TS3HTTPRequest()
58 : fAuthType(kNoAuth), fHost(
"NoHost")
65 TS3HTTPRequest::TS3HTTPRequest(EHTTPVerb httpVerb,
const TString& host,
66 const TString& bucket,
const TString& objectKey, EAuthType authType,
67 const TString& accessKey,
const TString& secretKey)
72 fObjectKey = objectKey;
74 fAccessKey = accessKey;
75 fSecretKey = secretKey;
81 TS3HTTPRequest::TS3HTTPRequest(
const TS3HTTPRequest& r)
87 fObjectKey = r.fObjectKey;
88 fAuthType = r.fAuthType;
89 fAccessKey = r.fAccessKey;
90 fSecretKey = r.fSecretKey;
91 fTimeStamp = r.fTimeStamp;
97 TString TS3HTTPRequest::ComputeSignature(TS3HTTPRequest::EHTTPVerb httpVerb)
const
107 TString toSign = TString::Format(
"%s\n\n\n%s\n",
108 (
const char*)HTTPVerbToTString(httpVerb),
109 (
const char*)fTimeStamp);
110 if (fAuthType == kGoogle) {
117 toSign +=
"x-goog-api-version:1\n";
120 if (fAuthType == kAmazon) {
121 if (!fSessionToken.IsNull()) {
122 toSign +=
"x-amz-security-token:" + fSessionToken +
"\n";
126 toSign +=
"/" + fBucket + fObjectKey;
128 unsigned char digest[SHA_DIGEST_LENGTH] = {0};
129 #if defined(MAC_OS_X_VERSION_10_7)
130 CCHmac(kCCHmacAlgSHA1, fSecretKey.Data(), fSecretKey.Length() , (
unsigned char *)toSign.Data(), toSign.Length(), digest);
132 unsigned int *sd = NULL;
133 HMAC(EVP_sha1(), fSecretKey.Data(), fSecretKey.Length() , (
unsigned char *)toSign.Data(), toSign.Length(), digest, sd);
136 return TBase64::Encode((
const char *)digest, SHA_DIGEST_LENGTH);
141 TString TS3HTTPRequest::HTTPVerbToTString(TS3HTTPRequest::EHTTPVerb httpVerb)
const
144 case kGET:
return TString(
"GET");
145 case kPOST:
return TString(
"POST");
146 case kPUT:
return TString(
"PUT");
147 case kDELETE:
return TString(
"DELETE");
148 case kHEAD:
return TString(
"HEAD");
149 case kCOPY:
return TString(
"COPY");
150 default:
return TString(
"");
158 TS3HTTPRequest& TS3HTTPRequest::SetTimeStamp()
160 time_t now = time(NULL);
163 struct tm dateFormat;
164 strftime(result,
sizeof(result),
"%a, %d %b %Y %H:%M:%S GMT",
165 gmtime_r(&now, &dateFormat));
167 strftime(result,
sizeof(result),
"%a, %d %b %Y %H:%M:%S GMT",
183 TString TS3HTTPRequest::MakeRequestLine(TS3HTTPRequest::EHTTPVerb httpVerb)
const
185 return TString::Format(
"%s /%s%s HTTP/1.1",
186 (
const char*)HTTPVerbToTString(httpVerb),
187 (
const char*)fBucket,
188 (
const char*)fObjectKey);
194 TString TS3HTTPRequest::MakeHostHeader()
const
196 return "Host: " + fHost;
202 TString TS3HTTPRequest::MakeDateHeader()
const
204 return "Date: " + fTimeStamp;
210 TString TS3HTTPRequest::MakeTokenHeader()
const
212 if (fAuthType != kAmazon)
215 if (fSessionToken.IsNull())
218 return TString::Format(
"x-amz-security-token: %s",
219 (
const char*) fSessionToken.Data());
225 TString TS3HTTPRequest::MakeAuthPrefix()
const
228 case kNoAuth:
return "";
229 case kGoogle:
return "GOOG1";
231 default:
return "AWS";
238 TString TS3HTTPRequest::MakeAuthHeader(TS3HTTPRequest::EHTTPVerb httpVerb)
const
240 if (fAuthType == kNoAuth)
243 return TString::Format(
"Authorization: %s %s:%s%s",
244 (
const char*)MakeAuthPrefix(),
245 (
const char*)fAccessKey,
246 (
const char*)ComputeSignature(httpVerb),
247 (fAuthType == kGoogle) ?
"\r\nx-goog-api-version: 1" :
"");
253 TString TS3HTTPRequest::GetRequest(TS3HTTPRequest::EHTTPVerb httpVerb, Bool_t appendCRLF)
258 TString request = TString::Format(
"%s\r\n%s\r\n%s\r\n",
259 (
const char*)MakeRequestLine(httpVerb),
260 (
const char*)MakeHostHeader(),
261 (
const char*)MakeDateHeader());
262 TString tokenHeader = MakeTokenHeader();
263 if (!tokenHeader.IsNull())
264 request += tokenHeader +
"\r\n";
265 TString authHeader = MakeAuthHeader(httpVerb);
266 if (!authHeader.IsNull())
267 request += authHeader +
"\r\n";