Skip to content

Commit

Permalink
Support force_ip_resolve in StreamHandler (#1659)
Browse files Browse the repository at this point in the history
  • Loading branch information
Christian Schmidt authored and sagikazarmark committed May 1, 2017
1 parent 114516b commit 8353b3f
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 3 deletions.
2 changes: 1 addition & 1 deletion docs/request-options.rst
Expand Up @@ -438,7 +438,7 @@ force_ip_resolve

This setting must be supported by the HTTP handler used to send a request.
``force_ip_resolve`` is currently only supported by the built-in cURL
handler.
and stream handlers.


form_params
Expand Down
29 changes: 27 additions & 2 deletions src/Handler/StreamHandler.php
Expand Up @@ -310,6 +310,8 @@ private function createStream(RequestInterface $request, array $options)

throw new \InvalidArgumentException('Microsoft NTLM authentication only supported with curl handler');
}

$uri = $this->resolveHost($request, $options);

$context = $this->createResource(
function () use ($context, $params) {
Expand All @@ -318,8 +320,8 @@ function () use ($context, $params) {
);

return $this->createResource(
function () use ($request, &$http_response_header, $context, $options) {
$resource = fopen((string) $request->getUri()->withFragment(''), 'r', null, $context);
function () use ($uri, &$http_response_header, $context, $options) {
$resource = fopen((string) $uri, 'r', null, $context);
$this->lastHeaders = $http_response_header;

if (isset($options['read_timeout'])) {
Expand All @@ -334,6 +336,29 @@ function () use ($request, &$http_response_header, $context, $options) {
);
}

private function resolveHost(RequestInterface $request, array $options)
{
$uri = $request->getUri();

if (isset($options['force_ip_resolve']) && !filter_var($uri->getHost(), FILTER_VALIDATE_IP)) {
if ('v4' === $options['force_ip_resolve']) {
$records = dns_get_record($uri->getHost(), DNS_A);
if (!isset($records[0]['ip'])) {
throw new ConnectException(sprintf("Could not resolve IPv4 address for host '%s'", $uri->getHost()), $request);
}
$uri = $uri->withHost($records[0]['ip']);
} elseif ('v6' === $options['force_ip_resolve']) {
$records = dns_get_record($uri->getHost(), DNS_AAAA);
if (!isset($records[0]['ipv6'])) {
throw new ConnectException(sprintf("Could not resolve IPv6 address for host '%s'", $uri->getHost()), $request);
}
$uri = $uri->withHost('[' . $records[0]['ipv6'] . ']');
}
}

return $uri;
}

private function getDefaultContext(RequestInterface $request)
{
$headers = '';
Expand Down

0 comments on commit 8353b3f

Please sign in to comment.