public function prepareRequest($path, $method, $apiVersion, $baseUrl = Azure::URL_MANAGEMENT_WINDOWS, $queryData = [], $postFields = [], $headers = [])
{
if (!in_array($method, static::$httpMethods)) {
throw new InvalidArgumentException(sprintf('Http method %s not supported or not exists.', $method));
}
try {
$url = $baseUrl . $path;
$parts = parse_url($url);
if (isset($parts['query'])) {
parse_str($parts['query'], $query);
}
if (!isset($query['api-version'])) {
$queryData['api-version'] = $apiVersion;
}
$request = new Request($method, $url);
$proxySettings = $this->azure->getProxy();
if ($proxySettings !== false) {
$request->setOptions(['proxyhost' => $proxySettings['host'], 'proxyport' => $proxySettings['port'], 'proxytype' => $proxySettings['type']]);
if ($proxySettings['user']) {
$request->setOptions(['proxyauth' => "{$proxySettings['user']}:{$proxySettings['pass']}", 'proxyauthtype' => $proxySettings['authtype']]);
}
}
$request->addQuery($queryData);
if ($baseUrl === Azure::URL_MANAGEMENT_WINDOWS) {
$headers['Content-Type'] = 'application/json';
}
if (empty($headers['Authorization']) && $baseUrl === Azure::URL_MANAGEMENT_WINDOWS) {
$headers['Authorization'] = 'Bearer ' . $this->azure->getClientToken(Azure::URL_MANAGEMENT_WINDOWS)->token;
}
if (count($postFields)) {
$request->append(json_encode($postFields));
} else {
if ($method == 'POST' && !isset($headers['Content-Length'])) {
// pecl_http does not include Content-Length for empty posts what breaks integration with Azure.
$headers['Content-Length'] = 1;
$request->append(" ");
} else {
if (in_array($method, ['PUT', 'PATCH']) && !isset($headers['Content-Length'])) {
// pecl_http does not include Content-Length for empty posts what breaks integration with Azure.
$headers['Content-Length'] = 0;
}
}
}
if (count($headers)) {
$request->addHeaders($headers);
}
} catch (Exception $e) {
throw new AzureException($e->getMessage());
}
return $request;
}