-
Notifications
You must be signed in to change notification settings - Fork 33
/
CloudFront.php
106 lines (93 loc) · 3.07 KB
/
CloudFront.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
<?php
/**
* A PHP5 class for invalidating Amazon CloudFront objects via its API.
*/
require_once 'HTTP/Request2.php'; // grab with "pear install --onlyreqdeps HTTP_Request2"
class CloudFront {
var $serviceUrl;
var $accessKeyId;
var $responseBody;
var $responseCode;
var $distributionId;
/**
* Constructs a CloudFront object and assigns required account values
* @param $accessKeyId {String} AWS access key id
* @param $secretKey {String} AWS secret key
* @param $distributionId {String} CloudFront distribution id
* @param $serviceUrl {String} Optional parameter for overriding cloudfront api URL
*/
function __construct($accessKeyId, $secretKey, $distributionId, $serviceUrl="https://cloudfront.amazonaws.com/"){
$this->accessKeyId = $accessKeyId;
$this->secretKey = $secretKey;
$this->distributionId = $distributionId;
$this->serviceUrl = $serviceUrl;
}
/**
* Invalidates object with passed key on CloudFront
* @param $key {String|Array} Key of object to be invalidated, or set of such keys
*/
function invalidate($keys, $debug=false){
if (!is_array($keys)){
$keys = array($keys);
}
$date = gmdate("D, d M Y G:i:s T");
$requestUrl = $this->serviceUrl."2010-08-01/distribution/" . $this->distributionId . "/invalidation";
// assemble request body
$body = "<InvalidationBatch>";
foreach($keys as $key){
$key = (preg_match("/^\//", $key)) ? $key : "/" . $key;
$body .= "<Path>".$key."</Path>";
}
$body .= "<CallerReference>".time()."</CallerReference>";
$body .= "</InvalidationBatch>";
// make and send request
$req = & new HTTP_Request2($requestUrl, HTTP_Request2::METHOD_POST);
$req->setHeader("Date", $date);
$req->setHeader("Authorization", $this->makeKey($date));
$req->setHeader("Content-Type", "text/xml");
$req->setBody($body);
$response = $req->send();
$this->responseCode = $response->getStatus();
if ($debug==true){
$er = array();
array_push($er, "CloudFront: Invalidating Object: $key");
array_push($er, $requestUrl);
array_push($er, "body: $body");
array_push($er, "response: " . $response->getBody());
array_push($er, "");
array_push($er, "response code: " . $this->responseCode);
array_push($er, "");
return implode("\n",$er);
}
else {
return ($this->responseCode === 201);
}
}
/**
* Returns header string containing encoded authentication key
* @param $date {Date}
* @return {String}
*/
function makeKey($date){
return "AWS " . $this->accessKeyId . ":" . base64_encode($this->hmacSha1($this->secretKey, $date));
}
/**
* Returns HMAC string
* @param $key {String}
* @param $date {Date}
* @return {String}
*/
function hmacSha1($key, $date){
$blocksize = 64;
$hashfunc = 'sha1';
if (strlen($key)>$blocksize){
$key = pack('H*', $hashfunc($key));
}
$key = str_pad($key,$blocksize,chr(0x00));
$ipad = str_repeat(chr(0x36),$blocksize);
$opad = str_repeat(chr(0x5c),$blocksize);
$hmac = pack('H*', $hashfunc( ($key^$opad).pack('H*',$hashfunc(($key^$ipad).$date)) ));
return $hmac;
}
}
?>