1
0
Fork 0
mirror of https://we.phorge.it/source/arcanist.git synced 2024-11-25 08:12:40 +01:00

Add "HTTPSFuture->addCurlOption()" for raw access to "curl_setopt()"

Summary: Fixes T13533. This is a narrow, fragile API for a particular Kerberos use case on one install.

Test Plan:
- Set a non-scalar key, got an exception.
- Set <"duck", "quack">, got an exception from cURL that the value was invalid.
- Set a bunch of made-up options to arbitrary values, no errors. cURL accepts anything so there's nothing we can do about this.
- Set `CURLOPT_NOBODY` and saw the request behavior change, demonstrating that the call can produce effects.

Maniphest Tasks: T13533

Differential Revision: https://secure.phabricator.com/D21251
This commit is contained in:
epriestley 2020-05-14 08:58:27 -07:00
parent 6937d38947
commit b76b9c4065

View file

@ -27,6 +27,8 @@ final class HTTPSFuture extends BaseHTTPFuture {
private $parser; private $parser;
private $progressSink; private $progressSink;
private $curlOptions = array();
/** /**
* Create a temp file containing an SSL cert, and use it for this session. * Create a temp file containing an SSL cert, and use it for this session.
* *
@ -164,6 +166,22 @@ final class HTTPSFuture extends BaseHTTPFuture {
return $this->progressSink; return $this->progressSink;
} }
/**
* See T13533. This supports an install-specific Kerberos workflow.
*/
public function addCURLOption($option_key, $option_value) {
if (!is_scalar($option_key)) {
throw new Exception(
pht(
'Expected option key passed to "addCurlOption(<key>, ...)" to be '.
'a scalar, got "%s".',
phutil_describe_type($option_key)));
}
$this->curlOptions[] = array($option_key, $option_value);
return $this;
}
/** /**
* Attach a file to the request. * Attach a file to the request.
* *
@ -409,6 +427,24 @@ final class HTTPSFuture extends BaseHTTPFuture {
curl_setopt($curl, CURLOPT_PROXY, (string)$proxy); curl_setopt($curl, CURLOPT_PROXY, (string)$proxy);
} }
foreach ($this->curlOptions as $curl_option) {
list($curl_key, $curl_value) = $curl_option;
try {
$ok = curl_setopt($curl, $curl_key, $curl_value);
if (!$ok) {
throw new Exception(
pht(
'Call to "curl_setopt(...)" returned "false".'));
}
} catch (Exception $ex) {
throw new PhutilProxyException(
pht(
'Call to "curl_setopt(...) failed for option key "%s".',
$curl_key),
$ex);
}
}
if ($is_download) { if ($is_download) {
$this->downloadHandle = @fopen($this->downloadPath, 'wb+'); $this->downloadHandle = @fopen($this->downloadPath, 'wb+');
if (!$this->downloadHandle) { if (!$this->downloadHandle) {