1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace B2; |
4
|
|
|
|
5
|
|
|
use B2\Files\Files; |
6
|
|
|
use PartnerIT\Curl\Network\CurlRequest; |
7
|
|
|
|
8
|
|
|
class B2Client |
9
|
|
|
{ |
10
|
|
|
|
11
|
|
|
/** |
12
|
|
|
* @var string |
13
|
|
|
*/ |
14
|
|
|
protected $accountId; |
15
|
|
|
|
16
|
|
|
/** |
17
|
|
|
* @var string |
18
|
|
|
*/ |
19
|
|
|
protected $applicationKey; |
20
|
|
|
|
21
|
|
|
/** |
22
|
|
|
* @var string |
23
|
|
|
*/ |
24
|
|
|
protected $apiUrl; |
25
|
|
|
|
26
|
|
|
/** |
27
|
|
|
* @var string |
28
|
|
|
*/ |
29
|
|
|
protected $authorizationToken; |
30
|
|
|
|
31
|
|
|
/** |
32
|
|
|
* @var string |
33
|
|
|
*/ |
34
|
|
|
protected $downloadUrl; |
35
|
|
|
|
36
|
|
|
/** |
37
|
|
|
* @var CurlRequest |
38
|
|
|
*/ |
39
|
|
|
protected $CurlRequest; |
40
|
|
|
|
41
|
|
|
/** |
42
|
|
|
* @var Files |
43
|
|
|
*/ |
44
|
|
|
public $Files; |
45
|
|
|
|
46
|
|
|
|
47
|
|
|
/** |
48
|
|
|
* B2Client constructor. |
49
|
|
|
* @param string $accountId |
50
|
|
|
* @param string $applicationKey |
51
|
|
|
*/ |
52
|
2 |
|
public function __construct($accountId, $applicationKey, CurlRequest $curlRequest = null) |
53
|
|
|
{ |
54
|
|
|
|
55
|
2 |
|
if (!$curlRequest) { |
56
|
1 |
|
$this->CurlRequest = new CurlRequest(); |
57
|
1 |
|
} else { |
58
|
1 |
|
$this->CurlRequest = $curlRequest; |
59
|
|
|
} |
60
|
|
|
|
61
|
2 |
|
$this->accountId = $accountId; |
62
|
2 |
|
$this->applicationKey = $applicationKey; |
63
|
2 |
|
$this->Files = new Files($this); |
64
|
|
|
|
65
|
2 |
|
} |
66
|
|
|
|
67
|
|
|
/** |
68
|
|
|
* @param array $result |
69
|
|
|
*/ |
70
|
1 |
|
public function setToken($result) |
71
|
1 |
|
{ |
72
|
1 |
|
$this->authorizationToken = $result['authorizationToken']; |
73
|
1 |
|
$this->apiUrl = $result['apiUrl']; |
74
|
|
|
$this->downloadUrl = $result['downloadUrl']; |
75
|
|
|
} |
76
|
|
|
|
77
|
|
|
/** |
78
|
|
|
* |
79
|
|
|
*/ |
80
|
|
|
public function requestToken() |
81
|
|
|
{ |
82
|
|
|
|
83
|
|
|
$results = $this->curl('https://api.backblaze.com/b2api/v1/b2_authorize_account', 'GET', [ |
84
|
|
|
$this->buildBasicAuthHeader() |
85
|
|
|
]); |
86
|
|
|
|
87
|
|
|
if ($results['statusCode'] === 200) { |
88
|
|
|
$this->setToken($results['responseBody']); |
89
|
|
|
} else { |
90
|
|
|
throw new \RuntimeException('Failed to get token: ' . $results['responseBody']['message']); |
91
|
|
|
} |
92
|
|
|
|
93
|
|
|
} |
94
|
|
|
|
95
|
|
|
/** |
96
|
|
|
* @param $endpoint |
97
|
|
|
* @param $method |
98
|
|
|
* @param array $data |
99
|
|
|
* @return mixed |
100
|
1 |
|
* @throws \Exception |
101
|
|
|
*/ |
102
|
|
|
public function call($endpoint, $method, $data = []) |
103
|
1 |
|
{ |
104
|
|
|
|
105
|
|
|
if (empty($this->authorizationToken)) { |
106
|
|
|
throw new \Exception('You must set or generate a token'); |
107
|
|
|
} |
108
|
1 |
|
|
109
|
1 |
|
$headers = [ |
110
|
|
|
$this->buildTokenAuthHeader() |
111
|
1 |
|
]; |
112
|
|
|
|
113
|
1 |
|
$result = $this->curl($this->apiUrl . '/b2api/v1/' . $endpoint, $method, $headers, $data); |
114
|
1 |
|
|
115
|
|
|
if ($result['statusCode'] >= 200 && $result['statusCode'] < 300) { |
116
|
|
|
return $result['responseBody']; |
117
|
|
|
} |
118
|
|
|
|
119
|
|
|
if ($result['statusCode'] >= 400) { |
120
|
|
|
throw new \RuntimeException('Error ' . $result['statusCode'] . ' - ' . $result['responseBody']['message']); |
121
|
|
|
} |
122
|
|
|
|
123
|
|
|
} |
124
|
|
|
|
125
|
|
|
/** |
126
|
|
|
* @param $uri |
127
|
|
|
* @param string $method |
128
|
|
|
* @param array $headers |
129
|
|
|
* @param array $body |
130
|
|
|
* @return array |
131
|
|
|
* @throws \Exception |
132
|
|
|
*/ |
133
|
|
|
public function curl($uri, $method = 'GET', $headers = [], $body = []) |
134
|
|
|
{ |
135
|
|
|
|
136
|
|
|
$this->CurlRequest->setOption(CURLOPT_URL, $uri); |
137
|
|
|
$this->CurlRequest->setOption(CURLOPT_CUSTOMREQUEST, $method); |
138
|
|
|
$this->CurlRequest->setOption(CURLOPT_RETURNTRANSFER, 1); |
139
|
|
|
|
140
|
|
|
$headers[] = 'Content-Type: application/json'; |
141
|
|
|
$headers[] = "Accept: application/json"; |
142
|
|
|
|
143
|
|
|
$this->CurlRequest->setOption(CURLOPT_POST, 1); |
144
|
|
|
$body = json_encode($body); |
145
|
|
|
$this->CurlRequest->setOption(CURLOPT_POSTFIELDS, $body); |
146
|
|
|
$this->CurlRequest->setOption(CURLOPT_HTTPHEADER, $headers); |
147
|
|
|
|
148
|
|
|
$resp = $this->CurlRequest->execute(); |
149
|
|
View Code Duplication |
if ($this->CurlRequest->getErrorNo() !== 0) { |
|
|
|
|
150
|
|
|
throw new \RuntimeException('curl error ' . $this->CurlRequest->getError() . '" - Code: ' . $this->CurlRequest->getErrorNo()); |
151
|
|
|
} else { |
152
|
|
|
return [ |
153
|
|
|
'statusCode' => $this->CurlRequest->getInfo(CURLINFO_HTTP_CODE), |
154
|
|
|
'responseBody' => json_decode($resp, true) |
155
|
|
|
]; |
156
|
|
|
} |
157
|
|
|
} |
158
|
|
|
|
159
|
|
|
/** |
160
|
|
|
* @return string |
161
|
|
|
*/ |
162
|
|
|
public function buildBasicAuthHeader() |
163
|
|
|
{ |
164
|
|
|
return 'Authorization: Basic ' . base64_encode($this->accountId . ':' . $this->applicationKey); |
165
|
|
|
} |
166
|
|
|
|
167
|
|
|
/** |
168
|
1 |
|
* @return string |
169
|
|
|
*/ |
170
|
1 |
|
public function buildTokenAuthHeader() |
171
|
|
|
{ |
172
|
|
|
return 'Authorization: ' . $this->authorizationToken; |
173
|
|
|
} |
174
|
|
|
|
175
|
|
|
/** |
176
|
|
|
* @param $data |
177
|
|
|
* @param $sha1 |
178
|
|
|
* @param $fileName |
179
|
|
|
* @param $url |
180
|
|
|
* @param $token |
181
|
|
|
*/ |
182
|
|
|
public function uploadData($fileData, $fileDataSha1, $fileName, $contentType, $uploadUrl, $uploadToken) |
183
|
|
|
{ |
184
|
|
|
$headers = []; |
185
|
|
|
$headers[] = "Authorization: " . $uploadToken; |
186
|
|
|
$headers[] = "X-Bz-File-Name: " . $fileName; |
187
|
|
|
$headers[] = "Content-Type: " . $contentType; |
188
|
|
|
$headers[] = "X-Bz-Content-Sha1: " . $fileDataSha1; |
189
|
|
|
|
190
|
|
|
$this->CurlRequest->setOption(CURLOPT_URL, $uploadUrl); |
191
|
|
|
$this->CurlRequest->setOption(CURLOPT_POST, true); |
192
|
|
|
$this->CurlRequest->setOption(CURLOPT_POSTFIELDS, $fileData); |
193
|
|
|
$this->CurlRequest->setOption(CURLOPT_HTTPHEADER, $headers); |
194
|
|
|
|
195
|
|
|
$resp = $this->CurlRequest->execute(); |
196
|
|
View Code Duplication |
if ($this->CurlRequest->getErrorNo() !== 0) { |
|
|
|
|
197
|
|
|
throw new \RuntimeException('curl error ' . $this->CurlRequest->getError() . '" - Code: ' . $this->CurlRequest->getErrorNo()); |
198
|
|
|
} else { |
199
|
|
|
return [ |
200
|
|
|
'statusCode' => $this->CurlRequest->getInfo(CURLINFO_HTTP_CODE), |
201
|
|
|
'responseBody' => json_decode($resp, true) |
202
|
|
|
]; |
203
|
|
|
} |
204
|
|
|
} |
205
|
|
|
|
206
|
|
|
/** |
207
|
|
|
* @param $url |
208
|
|
|
*/ |
209
|
|
|
public function downloadFileByName($uri) { |
210
|
|
|
|
211
|
|
|
$uri = $this->downloadUrl . "/file/" . $uri; |
212
|
|
|
$this->CurlRequest->setOption(CURLOPT_URL, $uri); |
213
|
|
|
$this->CurlRequest->setOption(CURLOPT_CUSTOMREQUEST, 'GET'); |
214
|
|
|
$this->CurlRequest->setOption(CURLOPT_RETURNTRANSFER, 1); |
215
|
|
|
|
216
|
|
|
$headers = [ |
217
|
|
|
$this->buildTokenAuthHeader() |
218
|
|
|
]; |
219
|
|
|
|
220
|
|
|
$this->CurlRequest->setOption(CURLOPT_HTTPHEADER, $headers); |
221
|
|
|
|
222
|
|
|
$resp = $this->CurlRequest->execute(); |
223
|
|
|
if ($this->CurlRequest->getErrorNo() !== 0) { |
224
|
|
|
throw new \RuntimeException('curl error ' . $this->CurlRequest->getError() . '" - Code: ' . $this->CurlRequest->getErrorNo()); |
225
|
|
|
} else { |
226
|
|
|
return $resp; |
227
|
|
|
} |
228
|
|
|
} |
229
|
|
|
|
230
|
|
|
} |
231
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.