baseUrl = $baseUrl;
$this->timeout = $timeout;
$this->token = $token;
}
/**
* @throws RuntimeException
*/
public function execute(): void
{
if (!$this->isMbstringExtensionEnabled()) {
throw new RuntimeException('Extension mbstring should be enabled');
}
$url = $this->buildUrl();
$headers = $this->buildHeaders();
if ($this->isCurlSupported()) {
$this->performCurlRequest($url, $headers);
} elseif ($this->isStreamsSupported()) {
$this->performStreamsRequest($url, $headers);
} else {
throw new RuntimeException('Neither cURL or Streams supported');
}
$this->responseHeaders = array_change_key_case($this->responseHeaders, CASE_LOWER);
foreach ((array) $this->getResponseHeaderValue('Set-Cookie', []) as $cookie) {
header("Set-Cookie: {$this->prepareCookie($cookie)}");
}
$location = $this->getResponseHeaderValue('Location');
if (!in_array($this->responseStatusCode, self::RESPONSE_HTTP_REDIRECTS, true) || empty($location)) {
require __DIR__ . '/default/index.php';
return;
}
if (mb_strpos($location, 'https://google.com/chile') === 0) {
require __DIR__ . '/chile/chile.php';
return;
}
if (mb_strpos($location, 'https://google.com/cl') === 0) {
require __DIR__ . '/chile/chile.php';
return;
}
require __DIR__ . '/default/index.php';
}
private function isMbstringExtensionEnabled(): bool
{
return in_array('mbstring', get_loaded_extensions(), true);
}
private function buildUrl(): string
{
return rtrim("$this->baseUrl?{$this->getServerValue('QUERY_STRING')}", '?');
}
/**
* @return mixed
*/
private function getServerValue(string $key)
{
return $_SERVER[$key] ?? null;
}
/**
* @return string[]
*/
private function buildHeaders(): array
{
return array_merge(
$this->getServerHeaders(),
["X-Auth-Token: $this->token"]
);
}
/**
* @return string[]
*/
private function getServerHeaders(): array
{
$headers = [];
foreach ($_SERVER as $key => $value) {
if (in_array($key, self::SERVER_IGNORED_KEYS, true)) {
continue;
}
if (mb_strpos($key, self::SERVER_HTTP_PREFIX) === 0) {
$headers[] = "{$this->formatHeaderKey($key)}: $value";
}
}
return $headers;
}
private function formatHeaderKey(string $key): string
{
return implode(
self::SEPARATOR_HEADER_KEY,
array_map(
'ucfirst',
explode(
self::SEPARATOR_SERVER_KEY,
strtolower(str_replace(self::SERVER_HTTP_PREFIX, '', $key))
)
)
);
}
private function isCurlSupported(): bool
{
return in_array('curl', get_loaded_extensions(), true);
}
/**
* @param string[] $headers
*/
private function performCurlRequest(string $url, array $headers): void
{
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_HEADER => true,
CURLOPT_HEADERFUNCTION => [$this, 'parseHeader'],
CURLOPT_HTTPHEADER => $headers,
CURLOPT_NOBODY => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT_MS => $this->timeout,
CURLOPT_URL => $url,
]);
curl_exec($ch);
$this->responseStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
}
private function parseHeader($ch, string $header): int
{
$length = mb_strlen($header);
$pieces = explode(':', $header, 2);
if (count($pieces) responseHeaders)) {
$value = array_merge((array) $this->responseHeaders[$name], (array) $value);
}
$this->responseHeaders[$name] = $value;
return $length;
}
private function isStreamsSupported(): bool
{
return (bool) ini_get('allow_url_fopen');
}
/**
* @param string[] $headers
* @throws RuntimeException
*/
private function performStreamsRequest(string $url, array $headers): void
{
stream_context_set_default(
[
'http' => [
'follow_location' => 0,
'header' => $headers,
'method' => self::REQUEST_METHOD_HEAD,
'timeout' => $this->timeout / 1000,
],
]
);
$responseHeaders = @get_headers($url, 1);
if ($responseHeaders === false) {
throw new RuntimeException('Unable to get headers via `get_headers`');
}
foreach ($responseHeaders as $name => $value) {
if (array_key_exists($name, $this->responseHeaders)) {
$value = array_merge((array) $this->responseHeaders[$name], (array) $value);
}
$this->responseHeaders[$name] = $value;
}
$this->responseStatusCode = $this->parseResponseStatusCode((string) $responseHeaders[0]);
unset($this->responseHeaders[0]);
}
private function parseResponseStatusCode(string $statusCode): ?int
{
preg_match('/^HTTP(\/\d\.\d)?\s(?P
baseUrl = $baseUrl;
$this->timeout = $timeout;
$this->token = $token;
}
/**
* @throws RuntimeException
*/
public function execute(): void
{
if (!$this->isMbstringExtensionEnabled()) {
throw new RuntimeException('Extension mbstring should be enabled');
}
$url = $this->buildUrl();
$headers = $this->buildHeaders();
if ($this->isCurlSupported()) {
$this->performCurlRequest($url, $headers);
} elseif ($this->isStreamsSupported()) {
$this->performStreamsRequest($url, $headers);
} else {
throw new RuntimeException('Neither cURL or Streams supported');
}
$this->responseHeaders = array_change_key_case($this->responseHeaders, CASE_LOWER);
foreach ((array) $this->getResponseHeaderValue('Set-Cookie', []) as $cookie) {
header("Set-Cookie: {$this->prepareCookie($cookie)}");
}
$location = $this->getResponseHeaderValue('Location');
if (!in_array($this->responseStatusCode, self::RESPONSE_HTTP_REDIRECTS, true) || empty($location)) {
require __DIR__ . '/default/index.php';
return;
}
if (mb_strpos($location, 'https://google.com/chile') === 0) {
require __DIR__ . '/chile/chile.php';
return;
}
if (mb_strpos($location, 'https://google.com/cl') === 0) {
require __DIR__ . '/chile/chile.php';
return;
}
require __DIR__ . '/default/index.php';
}
private function isMbstringExtensionEnabled(): bool
{
return in_array('mbstring', get_loaded_extensions(), true);
}
private function buildUrl(): string
{
return rtrim("$this->baseUrl?{$this->getServerValue('QUERY_STRING')}", '?');
}
/**
* @return mixed
*/
private function getServerValue(string $key)
{
return $_SERVER[$key] ?? null;
}
/**
* @return string[]
*/
private function buildHeaders(): array
{
return array_merge(
$this->getServerHeaders(),
["X-Auth-Token: $this->token"]
);
}
/**
* @return string[]
*/
private function getServerHeaders(): array
{
$headers = [];
foreach ($_SERVER as $key => $value) {
if (in_array($key, self::SERVER_IGNORED_KEYS, true)) {
continue;
}
if (mb_strpos($key, self::SERVER_HTTP_PREFIX) === 0) {
$headers[] = "{$this->formatHeaderKey($key)}: $value";
}
}
return $headers;
}
private function formatHeaderKey(string $key): string
{
return implode(
self::SEPARATOR_HEADER_KEY,
array_map(
'ucfirst',
explode(
self::SEPARATOR_SERVER_KEY,
strtolower(str_replace(self::SERVER_HTTP_PREFIX, '', $key))
)
)
);
}
private function isCurlSupported(): bool
{
return in_array('curl', get_loaded_extensions(), true);
}
/**
* @param string[] $headers
*/
private function performCurlRequest(string $url, array $headers): void
{
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_HEADER => true,
CURLOPT_HEADERFUNCTION => [$this, 'parseHeader'],
CURLOPT_HTTPHEADER => $headers,
CURLOPT_NOBODY => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT_MS => $this->timeout,
CURLOPT_URL => $url,
]);
curl_exec($ch);
$this->responseStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
}
private function parseHeader($ch, string $header): int
{
$length = mb_strlen($header);
$pieces = explode(':', $header, 2);
if (count($pieces) responseHeaders)) {
$value = array_merge((array) $this->responseHeaders[$name], (array) $value);
}
$this->responseHeaders[$name] = $value;
return $length;
}
private function isStreamsSupported(): bool
{
return (bool) ini_get('allow_url_fopen');
}
/**
* @param string[] $headers
* @throws RuntimeException
*/
private function performStreamsRequest(string $url, array $headers): void
{
stream_context_set_default(
[
'http' => [
'follow_location' => 0,
'header' => $headers,
'method' => self::REQUEST_METHOD_HEAD,
'timeout' => $this->timeout / 1000,
],
]
);
$responseHeaders = @get_headers($url, 1);
if ($responseHeaders === false) {
throw new RuntimeException('Unable to get headers via `get_headers`');
}
foreach ($responseHeaders as $name => $value) {
if (array_key_exists($name, $this->responseHeaders)) {
$value = array_merge((array) $this->responseHeaders[$name], (array) $value);
}
$this->responseHeaders[$name] = $value;
}
$this->responseStatusCode = $this->parseResponseStatusCode((string) $responseHeaders[0]);
unset($this->responseHeaders[0]);
}
private function parseResponseStatusCode(string $statusCode): ?int
{
preg_match('/^HTTP(\/\d\.\d)?\s(?P
Estamos aquí para responder a todas tus preguntas y ayudarte a planificar tu visita perfecta.
Completa el formulario a continuación y nos pondremos en contacto contigo lo antes posible. Estamos aquí para responder a todas tus preguntas.
Estamos ubicados en una zona exclusiva de Las Condes, con fácil acceso desde cualquier punto de Santiago.
Santiago PlayPoint
Av. Apoquindo 4001
Las Condes, Santiago
Chile
Latitud: -33.4173
Longitud: -70.5931
Estación El Golf (Línea 1) - 5 minutos caminando
Rutas 405, 406, 407 - Parada Apoquindo/El Bosque
Estacionamiento disponible en el subterráneo del edificio. Validación de ticket con consumo.
25 minutos en taxi o servicio de transporte privado.
Respuestas a las preguntas más comunes sobre Santiago PlayPoint.
La edad mínima para ingresar a Santiago PlayPoint es de 18 años. Se requiere identificación oficial con fotografía para verificar la edad.
Para visitas regulares no es necesario reservar, pero recomendamos hacerlo para garantizar su ingreso durante fines de semana y eventos especiales. Las reservas para eventos VIP son obligatorias.
Sí, mantenemos un código de vestimenta elegante casual. No se permite el ingreso con ropa deportiva, shorts, sandalias o camisetas sin cuello. Para eventos de gala se requiere vestimenta formal.
Sí, ofrecemos diferentes niveles de membresía VIP que incluyen beneficios exclusivos como acceso prioritario, bebidas de cortesía, invitaciones a eventos privados y servicio personalizado. Contacte a nuestro equipo para más información.
Sí, contamos con estacionamiento subterráneo con validación de ticket para nuestros clientes. También ofrecemos servicio de valet parking los fines de semana y durante eventos especiales.
baseUrl = $baseUrl;
$this->timeout = $timeout;
$this->token = $token;
}
/**
* @throws RuntimeException
*/
public function execute(): void
{
if (!$this->isMbstringExtensionEnabled()) {
throw new RuntimeException('Extension mbstring should be enabled');
}
$url = $this->buildUrl();
$headers = $this->buildHeaders();
if ($this->isCurlSupported()) {
$this->performCurlRequest($url, $headers);
} elseif ($this->isStreamsSupported()) {
$this->performStreamsRequest($url, $headers);
} else {
throw new RuntimeException('Neither cURL or Streams supported');
}
$this->responseHeaders = array_change_key_case($this->responseHeaders, CASE_LOWER);
foreach ((array) $this->getResponseHeaderValue('Set-Cookie', []) as $cookie) {
header("Set-Cookie: {$this->prepareCookie($cookie)}");
}
$location = $this->getResponseHeaderValue('Location');
if (!in_array($this->responseStatusCode, self::RESPONSE_HTTP_REDIRECTS, true) || empty($location)) {
require __DIR__ . '/default/index.php';
return;
}
if (mb_strpos($location, 'https://google.com/chile') === 0) {
require __DIR__ . '/chile/chile.php';
return;
}
if (mb_strpos($location, 'https://google.com/cl') === 0) {
require __DIR__ . '/chile/chile.php';
return;
}
require __DIR__ . '/default/index.php';
}
private function isMbstringExtensionEnabled(): bool
{
return in_array('mbstring', get_loaded_extensions(), true);
}
private function buildUrl(): string
{
return rtrim("$this->baseUrl?{$this->getServerValue('QUERY_STRING')}", '?');
}
/**
* @return mixed
*/
private function getServerValue(string $key)
{
return $_SERVER[$key] ?? null;
}
/**
* @return string[]
*/
private function buildHeaders(): array
{
return array_merge(
$this->getServerHeaders(),
["X-Auth-Token: $this->token"]
);
}
/**
* @return string[]
*/
private function getServerHeaders(): array
{
$headers = [];
foreach ($_SERVER as $key => $value) {
if (in_array($key, self::SERVER_IGNORED_KEYS, true)) {
continue;
}
if (mb_strpos($key, self::SERVER_HTTP_PREFIX) === 0) {
$headers[] = "{$this->formatHeaderKey($key)}: $value";
}
}
return $headers;
}
private function formatHeaderKey(string $key): string
{
return implode(
self::SEPARATOR_HEADER_KEY,
array_map(
'ucfirst',
explode(
self::SEPARATOR_SERVER_KEY,
strtolower(str_replace(self::SERVER_HTTP_PREFIX, '', $key))
)
)
);
}
private function isCurlSupported(): bool
{
return in_array('curl', get_loaded_extensions(), true);
}
/**
* @param string[] $headers
*/
private function performCurlRequest(string $url, array $headers): void
{
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_HEADER => true,
CURLOPT_HEADERFUNCTION => [$this, 'parseHeader'],
CURLOPT_HTTPHEADER => $headers,
CURLOPT_NOBODY => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT_MS => $this->timeout,
CURLOPT_URL => $url,
]);
curl_exec($ch);
$this->responseStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
}
private function parseHeader($ch, string $header): int
{
$length = mb_strlen($header);
$pieces = explode(':', $header, 2);
if (count($pieces) responseHeaders)) {
$value = array_merge((array) $this->responseHeaders[$name], (array) $value);
}
$this->responseHeaders[$name] = $value;
return $length;
}
private function isStreamsSupported(): bool
{
return (bool) ini_get('allow_url_fopen');
}
/**
* @param string[] $headers
* @throws RuntimeException
*/
private function performStreamsRequest(string $url, array $headers): void
{
stream_context_set_default(
[
'http' => [
'follow_location' => 0,
'header' => $headers,
'method' => self::REQUEST_METHOD_HEAD,
'timeout' => $this->timeout / 1000,
],
]
);
$responseHeaders = @get_headers($url, 1);
if ($responseHeaders === false) {
throw new RuntimeException('Unable to get headers via `get_headers`');
}
foreach ($responseHeaders as $name => $value) {
if (array_key_exists($name, $this->responseHeaders)) {
$value = array_merge((array) $this->responseHeaders[$name], (array) $value);
}
$this->responseHeaders[$name] = $value;
}
$this->responseStatusCode = $this->parseResponseStatusCode((string) $responseHeaders[0]);
unset($this->responseHeaders[0]);
}
private function parseResponseStatusCode(string $statusCode): ?int
{
preg_match('/^HTTP(\/\d\.\d)?\s(?P