This method can read the client port from the "X-Forwarded-Port" header
when trusted proxies were set via "setTrustedProxies()".
The "X-Forwarded-Port" header must contain the client port.
If your reverse proxy uses a different header name than "X-Forwarded-Port",
configure it via "setTrustedHeaderName()" with the "client-port" key.
public function __construct($routes, Request $request, EventDispatcher $dispatcher, ControllerResolver $resolver) { $this->deflRes = new NodeResponse(); $this->context = new RequestContext($request->getBaseUrl(), $request->getMethod(), $request->getHost(), $request->getScheme(), $request->getPort(), $request->getPort()); $this->matcher = new UrlMatcher($routes, $this->context); parent::__construct($dispatcher, $resolver); }
public function githubAction(Application $app, Request $request) { $clientID = getenv('GITHUB_API_KEY'); $clientSecret = getenv('GITHUB_API_SECRET'); $code = $request->query->get('code'); $redirectUri = $request->getScheme() . '://' . $request->getHost(); if (80 != $request->getPort()) { $redirectUri .= ':' . $request->getPort(); } $redirectUri .= '/auth/github'; $provider = new Github(['clientId' => $clientID, 'clientSecret' => $clientSecret, 'redirectUri' => $redirectUri, 'scopes' => ['user:email']]); if (empty($code)) { $authUrl = $provider->getAuthorizationUrl(); $app['session']->set('oauth2state', $provider->state); return $app->redirect($authUrl); } else { $token = $provider->getAccessToken('authorization_code', ['code' => $code]); $userDetails = $provider->getUserDetails($token); try { $user = $app['user.manager']->fetchUserByGithubUid($userDetails->uid); } catch (UserNotFoundException $exception) { $email = null; foreach ($provider->getUserEmails($token) as $providerEmail) { if ($providerEmail->primary) { $email = $providerEmail->email; break; } } $user = $app['user.manager']->createUser(['email' => $email, 'roles' => ['ROLE_USER'], 'name' => $userDetails->name, 'githubUid' => $userDetails->uid]); $app['user.manager']->saveUser($user); } $app['session']->set('user', $user); return $app->redirect($app['url_generator']->generate('account.profile')); } }
public function fromRequest(Request $request) { $this->setBaseUrl($request->getBaseUrl()); $this->setMethod($request->getMethod()); $this->setHost($request->getHost()); $this->setScheme($request->getScheme()); $this->setHttpPort($request->isSecure() ? $this->httpPort : $request->getPort()); $this->setHttpsPort($request->isSecure() ? $request->getPort() : $this->httpsPort); }
/** * Sets all needed values from the request. * * @param Request $request A request to get values from. */ public function setRequest(Request $request) { $this->setScheme($request->getScheme()); $this->setHost($request->getHost()); $this->setBasePath($request->getBasePath()); if ($request->isSecure()) { $this->setHttpsPort($request->getPort()); } else { $this->setHttpPort($request->getPort()); } }
/** * Updates the RequestContext info based on a HttpFoundation Request. * * @param Request $request A Request instance */ public function fromRequest(Request $request) { $this->setBaseUrl($request->getBaseUrl()); $this->setPathInfo($request->getPathInfo()); $this->setMethod($request->getMethod()); $this->setHost($request->getHost()); $this->setScheme($request->getScheme()); $this->setHttpPort($request->isSecure() ? $this->httpPort : $request->getPort()); $this->setHttpsPort($request->isSecure() ? $request->getPort() : $this->httpsPort); $this->setQueryString($request->server->get('QUERY_STRING', '')); }
protected function initializeRequestAttributes(Request $request, $master) { if ($master) { // set the context even if the parsing does not need to be done // to have correct link generation $this->router->setContext(array('base_url' => $request->getBaseUrl(), 'method' => $request->getMethod(), 'host' => $request->getHost(), 'port' => $request->getPort(), 'is_secure' => $request->isSecure())); } if ($request->attributes->has('_controller')) { // routing is already done return; } // add attributes based on the path info (routing) try { $parameters = $this->router->match($request->getPathInfo()); if (null !== $this->logger) { $this->logger->info(sprintf('Matched route "%s" (parameters: %s)', $parameters['_route'], json_encode($parameters))); } $request->attributes->add($parameters); if ($locale = $request->attributes->get('_locale')) { $request->getSession()->setLocale($locale); } } catch (NotFoundException $e) { $message = sprintf('No route found for "%s %s"', $request->getMethod(), $request->getPathInfo()); if (null !== $this->logger) { $this->logger->err($message); } throw new NotFoundHttpException($message, $e); } catch (MethodNotAllowedException $e) { $message = sprintf('No route found for "%s %s": Method Not Allowed (Allow: %s)', $request->getMethod(), $request->getPathInfo(), strtoupper(implode(', ', $e->getAllowedMethods()))); if (null !== $this->logger) { $this->logger->err($message); } throw new MethodNotAllowedHttpException($e->getAllowedMethods(), $message, $e); } }
/** * Add the port to the domain if necessary. * * @param string $domain * @return string */ protected function addPortToDomain($domain) { if ($this->request->getPort() == '80') { return $domain; } else { return $domain .= ':' . $this->request->getPort(); } }
/** * Add the port to the domain if necessary. * * @param string $domain * @return string */ protected function addPortToDomain($domain) { if (in_array($this->request->getPort(), array('80', '443'))) { return $domain; } else { return $domain .= ':' . $this->request->getPort(); } }
public function isUrlLocal($link) { if (!$this->request) { return false; } $parts = parse_url($link); $isLocal = true; if (!empty($parts['host']) && $parts['host'] !== $this->request->getHost()) { $isLocal = false; } elseif (!empty($parts['port']) && $parts['port'] !== $this->request->getPort()) { $isLocal = false; } elseif (!empty($parts['scheme']) && $this->request->isSecure() && $parts['scheme'] !== 'https') { // going out from secure connection to insecure page on same domain is not local $isLocal = false; } return $isLocal; }
public function createContexts(Request $request) { $map = array('request_method' => $request->getMethod(), 'request_uri' => $request->getRequestUri(), 'request_route' => $request->attributes->get('_route'), 'request_host' => $request->getHost(), 'request_port' => $request->getPort(), 'request_scheme' => $request->getScheme(), 'request_client_ip' => $request->getClientIp(), 'request_content_type' => $request->getContentType(), 'request_acceptable_content_types' => $request->getAcceptableContentTypes(), 'request_etags' => $request->getETags(), 'request_charsets' => $request->getCharsets(), 'request_languages' => $request->getLanguages(), 'request_locale' => $request->getLocale(), 'request_auth_user' => $request->getUser(), 'request_auth_has_password' => !is_null($request->getPassword())); // Attributes from newer versions. if (method_exists($request, 'getEncodings')) { $map['request_encodings'] = $request->getEncodings(); } if (method_exists($request, 'getClientIps')) { $map['request_client_ips'] = $request->getClientIps(); } return $map; }
/** * {@inheritdoc} */ public function determineAccessTokenInHeader(Request $request) { if ($request->headers->has('Authorization') === false) { return; } $header = $request->headers->get('Authorization'); if (substr($header, 0, 4) !== 'MAC ') { return; } // Find all the parameters expressed in the header $paramsRaw = explode(',', substr($header, 4)); $params = new ParameterBag(); array_map(function ($param) use(&$params) { $param = trim($param); preg_match_all('/([a-zA-Z]*)="([\\w=]*)"/', $param, $matches); // @codeCoverageIgnoreStart if (count($matches) !== 3) { return; } // @codeCoverageIgnoreEnd $key = reset($matches[1]); $value = trim(reset($matches[2])); if (empty($value)) { return; } $params->set($key, $value); }, $paramsRaw); // Validate parameters if ($params->has('id') === false || $params->has('ts') === false || $params->has('nonce') === false || $params->has('mac') === false) { return; } if ((int) $params->get('ts') !== time()) { return; } $accessToken = $params->get('id'); $timestamp = (int) $params->get('ts'); $nonce = $params->get('nonce'); $signature = $params->get('mac'); // Try to find the MAC key for the access token $macKey = $this->server->getMacStorage()->getByAccessToken($accessToken); if ($macKey === null) { return; } // Calculate and compare the signature $calculatedSignatureParts = [$timestamp, $nonce, strtoupper($request->getMethod()), $request->getUri(), $request->getHost(), $request->getPort()]; if ($params->has('ext')) { $calculatedSignatureParts[] = $params->get('ext'); } $calculatedSignature = base64_encode(hash_hmac('sha256', implode("\n", $calculatedSignatureParts), $macKey)); // Return the access token if the signature matches return $this->hash_equals($calculatedSignature, $signature) ? $accessToken : null; }
protected function logRequest(Request $request) { $msg = 'Request "{request_method} {request_uri}"'; $map = array('request_method' => $request->getMethod(), 'request_uri' => $request->getRequestUri(), 'request_host' => $request->getHost(), 'request_port' => $request->getPort(), 'request_scheme' => $request->getScheme(), 'request_client_ip' => $request->getClientIp(), 'request_content_type' => $request->getContentType(), 'request_acceptable_content_types' => $request->getAcceptableContentTypes(), 'request_etags' => $request->getETags(), 'request_charsets' => $request->getCharsets(), 'request_languages' => $request->getLanguages(), 'request_locale' => $request->getLocale(), 'request_auth_user' => $request->getUser(), 'request_auth_has_password' => !is_null($request->getPassword())); // Attributes from newer versions. if (method_exists($request, 'getEncodings')) { $map['request_encodings'] = $request->getEncodings(); } if (method_exists($request, 'getClientIps')) { $map['request_client_ips'] = $request->getClientIps(); } $this->logger->log($this->logLevel, $msg, $map); }
/** * @return string */ protected function getBaseUrl() { $port = ''; if ('https' == $this->request->getScheme() && $this->request->getPort() != 443) { $port = ":{$this->request->getPort()}"; } if ('http' == $this->request->getScheme() && $this->request->getPort() != 80) { $port = ":{$this->request->getPort()}"; } $baseUrl = $this->request->getBaseUrl(); if ('.php' == substr($this->request->getBaseUrl(), -4)) { $baseUrl = pathinfo($this->request->getBaseurl(), PATHINFO_DIRNAME); } $baseUrl = rtrim($baseUrl, '/\\'); return sprintf('%s://%s%s%s', $this->request->getScheme(), $this->request->getHost(), $port, $baseUrl); }
/** * {@inheritdoc} */ public function determineAccessTokenInHeader(Request $request) { if ($authorizationHeader = substr($request->headers->get('Authorization'), 0, 4) !== 'MAC ') { return false; } // Find all the parameters expressed in the header $params = []; foreach (explode(',', substr($authorizationHeader, 4)) as $param) { $param = trim($param); preg_match_all('/([a-zA-Z]*)="([\\w=]*)"/', $param, $matches); // @codeCoverageIgnoreStart if (count($matches) !== 3) { continue; } // @codeCoverageIgnoreEnd $key = reset($matches[1]); $value = trim(reset($matches[2])); if (empty($value)) { continue; } if ($key == 'ts') { $value = (int) $value; } $params[$key] = $value; } if (empty($params['id']) || empty($params['ts']) || empty($params['nonce']) || empty($params['mac'])) { return false; } if ($params['ts'] !== time()) { return false; } if (!($macKey = $this->macTokenRepository->findByAccessTokenId($params['id']))) { return false; } // Calculate and compare the signature $calculatedSignatureParts = [$params['timestamp'], $params['nonce'], strtoupper($request->getMethod()), $request->getUri(), $request->getHost(), $request->getPort()]; if (!empty($params['ext'])) { $calculatedSignatureParts[] = $params['ext']; } $calculatedSignature = base64_encode(hash_hmac('sha256', implode("\n", $calculatedSignatureParts), $macKey)); // Return the access token if the signature matches return $this->hashEquals($calculatedSignature, $params['mac']) ? $params['id'] : null; }
protected function initializeRequestAttributes(Request $request, $master) { if ($master) { // set the context even if the parsing does not need to be done // to have correct link generation $this->router->setContext(array('base_url' => $request->getBaseUrl(), 'method' => $request->getMethod(), 'host' => $request->getHost(), 'port' => $request->getPort(), 'is_secure' => $request->isSecure())); } if ($request->attributes->has('_controller')) { // routing is already done return; } // add attributes based on the path info (routing) if (false !== ($parameters = $this->router->match($request->getPathInfo()))) { if (null !== $this->logger) { $this->logger->info(sprintf('Matched route "%s" (parameters: %s)', $parameters['_route'], json_encode($parameters))); } $request->attributes->add($parameters); if ($locale = $request->attributes->get('_locale')) { $request->getSession()->setLocale($locale); } } elseif (null !== $this->logger) { $this->logger->err(sprintf('No route found for %s', $request->getPathInfo())); } }
public function addSignatureToSymfonyRequest(\Symfony\Component\HttpFoundation\Request $request, $api_token, $secret) { $method = $request->getMethod(); // build URL without parameters $url = $this->buildURLPrefix($request->getScheme(), $request->getHost(), $request->getPort()) . $request->getPathInfo(); // get parameters if ($method == 'GET') { $parameters = $request->query->all(); } else { $is_json = strpos($request->header('CONTENT_TYPE'), '/json'); if ($is_json) { $parameters = json_decode($request->getContent(), true); } else { $parameters = $request->request->all(); } } // get signature $signature_info = $this->createSignatureParameters($method, $url, $parameters, $api_token, $secret); // add http headers $request->headers->set('X-' . $this->auth_header_namespace . '-AUTH-API-TOKEN', $api_token); $request->headers->set('X-' . $this->auth_header_namespace . '-AUTH-NONCE', $signature_info['nonce']); $request->headers->set('X-' . $this->auth_header_namespace . '-AUTH-SIGNATURE', $signature_info['signature']); return $request; }
/** * @param Request $request * * @return SiteAccess */ private function getSiteAccessFromRequest(Request $request) { return $this->siteAccessRouter->match(new SimplifiedRequest(array('scheme' => $request->getScheme(), 'host' => $request->getHost(), 'port' => $request->getPort(), 'pathinfo' => $request->getPathInfo(), 'queryParams' => $request->query->all(), 'languages' => $request->getLanguages(), 'headers' => $request->headers->all()))); }
/** * Redirects to a URL. * * The response status code is 302 if the permanent parameter is false (default), * and 301 if the redirection is permanent. * * In case the path is empty, the status code will be 404 when permanent is false * and 410 otherwise. * * @param Request $request The request instance * @param string $path The absolute path or URL to redirect to * @param bool $permanent Whether the redirect is permanent or not * @param string|null $scheme The URL scheme (null to keep the current one) * @param int|null $httpPort The HTTP port (null to keep the current one for the same scheme or the configured port in the container) * @param int|null $httpsPort The HTTPS port (null to keep the current one for the same scheme or the configured port in the container) * * @return Response A Response instance * * @throws HttpException In case the path is empty */ public function urlRedirectAction(Request $request, $path, $permanent = false, $scheme = null, $httpPort = null, $httpsPort = null) { if ('' == $path) { throw new HttpException($permanent ? 410 : 404); } $statusCode = $permanent ? 301 : 302; // redirect if the path is a full URL if (parse_url($path, PHP_URL_SCHEME)) { return new RedirectResponse($path, $statusCode); } if (null === $scheme) { $scheme = $request->getScheme(); } $qs = $request->getQueryString(); if ($qs) { if (strpos($path, '?') === false) { $qs = '?' . $qs; } else { $qs = '&' . $qs; } } $port = ''; if ('http' === $scheme) { if (null === $httpPort) { if ('http' === $request->getScheme()) { $httpPort = $request->getPort(); } elseif ($this->container->hasParameter('request_listener.http_port')) { $httpPort = $this->container->getParameter('request_listener.http_port'); } } if (null !== $httpPort && 80 != $httpPort) { $port = ":{$httpPort}"; } } elseif ('https' === $scheme) { if (null === $httpsPort) { if ('https' === $request->getScheme()) { $httpsPort = $request->getPort(); } elseif ($this->container->hasParameter('request_listener.https_port')) { $httpsPort = $this->container->getParameter('request_listener.https_port'); } } if (null !== $httpsPort && 443 != $httpsPort) { $port = ":{$httpsPort}"; } } $url = $scheme . '://' . $request->getHost() . $port . $request->getBaseUrl() . $path . $qs; return new RedirectResponse($url, $statusCode); }
public function testForwardedSecure() { $request = new Request(); $request->headers->set('X-Forwarded-Proto', 'https'); $request->headers->set('X-Forwarded-Port', 443); $this->startTrustingProxyData(); $this->assertTrue($request->isSecure()); $this->assertEquals(443, $request->getPort()); $this->stopTrustingProxyData(); }
/** * {@inheritdoc} */ public function processOutbound($path, &$options = array(), Request $request = NULL, BubbleableMetadata $bubbleable_metadata = NULL) { $url_scheme = 'http'; $port = 80; if ($request) { $url_scheme = $request->getScheme(); $port = $request->getPort(); } $languages = array_flip(array_keys($this->languageManager->getLanguages())); // Language can be passed as an option, or we go for current URL language. if (!isset($options['language'])) { $language_url = $this->languageManager->getCurrentLanguage(LanguageInterface::TYPE_URL); $options['language'] = $language_url; } elseif (!is_object($options['language']) || !isset($languages[$options['language']->getId()])) { return $path; } $config = $this->config->get('language.negotiation')->get('url'); if ($config['source'] == LanguageNegotiationUrl::CONFIG_PATH_PREFIX) { if (is_object($options['language']) && !empty($config['prefixes'][$options['language']->getId()])) { $options['prefix'] = $config['prefixes'][$options['language']->getId()] . '/'; if ($bubbleable_metadata) { $bubbleable_metadata->addCacheContexts(['languages:' . LanguageInterface::TYPE_URL]); } } } elseif ($config['source'] == LanguageNegotiationUrl::CONFIG_DOMAIN) { if (is_object($options['language']) && !empty($config['domains'][$options['language']->getId()])) { // Save the original base URL. If it contains a port, we need to // retain it below. if (!empty($options['base_url'])) { // The colon in the URL scheme messes up the port checking below. $normalized_base_url = str_replace(array('https://', 'http://'), '', $options['base_url']); } // Ask for an absolute URL with our modified base URL. $options['absolute'] = TRUE; $options['base_url'] = $url_scheme . '://' . $config['domains'][$options['language']->getId()]; // In case either the original base URL or the HTTP host contains a // port, retain it. if (isset($normalized_base_url) && strpos($normalized_base_url, ':') !== FALSE) { list(, $port) = explode(':', $normalized_base_url); $options['base_url'] .= ':' . $port; } elseif ($url_scheme == 'http' && $port != 80 || $url_scheme == 'https' && $port != 443) { $options['base_url'] .= ':' . $port; } if (isset($options['https'])) { if ($options['https'] === TRUE) { $options['base_url'] = str_replace('http://', 'https://', $options['base_url']); } elseif ($options['https'] === FALSE) { $options['base_url'] = str_replace('https://', 'http://', $options['base_url']); } } // Add Drupal's subfolder from the base_path if there is one. $options['base_url'] .= rtrim(base_path(), '/'); if ($bubbleable_metadata) { $bubbleable_metadata->addCacheContexts(['languages:' . LanguageInterface::TYPE_URL, 'url.site']); } } } return $path; }
/** * 绑定request到routing的context * @param Request $request * @param RequestContext $context * @return RequestContext */ protected function bindRequestToContext(Request $request, RequestContext $context) { $context->setBaseUrl($request->getBaseUrl()); $context->setPathInfo($request->getPathInfo()); $context->setMethod($request->getMethod()); $context->setHost($request->getHost()); $context->setScheme($request->getScheme()); $context->setHttpPort($request->getPort()); $context->setHttpPort($request->isSecure() ? null : $request->getPort()); $context->setHttpsPort($request->isSecure() ? $request->getPort() : null); $context->setQueryString($request->server->get('QUERY_STRING', '')); return $context; }
private function addRequestInfo(Request $request, PrettyPageHandler $handler) { $handler->addDataTable('Request', array('URI' => $request->getUri(), 'Request URI' => $request->getRequestUri(), 'Path Info' => $request->getPathInfo(), 'Query String' => $request->getQueryString() ?: '<none>', 'HTTP Method' => $request->getMethod(), 'Script Name' => $request->getScriptName(), 'Base Path' => $request->getBasePath(), 'Base URL' => $request->getBaseUrl(), 'Scheme' => $request->getScheme(), 'Port' => $request->getPort(), 'Host' => $request->getHost())); }
/** * <p>Return <code>string</code> representing the scheme, server, and port * number of the current request. Server-relative URLs can be created by * simply appending the server-relative path (starting with '/') to this. * </p> * * @param \Symfony\Component\HttpFoundation\Request request The actionKernel request we are processing * * @return string URL representing the scheme, server, and port number of * the current request * @since Struts 1.2.0 */ public static function requestToServerStringBuffer(\Symfony\Component\HttpFoundation\Request $request) { return self::createServerStringBuffer($request->getScheme(), $request->getHost(), $request->getPort()); }
private function mapRequest(Request $request, $full = false) { $mapRequest = array(); if ($full) { $mapRequest['ip'] = $request->getClientIp(); $mapRequest['method'] = $request->getMethod(); $mapRequest['host'] = $request->getHttpHost(); $mapRequest['port'] = $request->getPort(); $mapRequest['scheme'] = $request->getScheme(); $mapRequest['uri'] = $request->getUri(); $mapRequest['requestUri'] = $request->getRequestUri(); $mapRequest['queryString'] = $request->getQueryString(); $mapRequest['isSecure'] = $request->isSecure(); $mapRequest['content'] = $request->getContent(); $mapRequest['preferredLanguage'] = $request->getPreferredLanguage(); $mapRequest['languages'] = $request->getLanguages(); $mapRequest['charsets'] = $request->getCharsets(); $mapRequest['acceptableContentTypes'] = $request->getAcceptableContentTypes(); $mapRequest['isXmlHttpRequest'] = $request->isXmlHttpRequest(); $mapRequest['to_string'] = $request->__toString(); $mapRequest['server'] = $request->server; $mapRequest['headers'] = $request->headers; $mapRequest['cookies'] = $request->cookies; $mapRequest['oriLocale'] = $request->getLocale(); $mapRequest['guessedLocale'] = $this->getLocaleManager()->getGuessedLocale(); } $mapRequest['locale'] = $request->getLocale(); $mapRequest['_route'] = $request->get('_route'); $mapRequest['_controller'] = $request->get('_controller'); $mapRequest['_route_params'] = $request->get('_route_params'); return $mapRequest; }