Skip to content

Commit a48b80d

Browse files
committed
Add app identifier to User-Agent for Nominatim requests
An openstreetmap.org system administrator recommended we include an app identifier in the User-Agent header. My inference is that they block based on the User-Agent. However, I did not want to use only the app identifier so I found the form that Craft uses and copied that, appending the app identifier.
1 parent da516d7 commit a48b80d

File tree

1 file changed

+21
-15
lines changed

1 file changed

+21
-15
lines changed

src/services/GeoService.php

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use GuzzleHttp\Client;
2222
use Mapkit\JWT;
2323
use Exception;
24+
use function GuzzleHttp\default_user_agent;
2425

2526
/**
2627
* Class GeoService
@@ -763,13 +764,9 @@ private static function _latLngFromAddress_Mapbox ($token, $address, $country):
763764
$url = str_replace('.json', rawurlencode(', ' . $country) . '.json', $url);
764765
}
765766

766-
$referer = Craft::$app->getRequest()->getIsConsoleRequest()
767-
? Craft::getAlias('@web')
768-
: Craft::$app->urlManager->getHostInfo();
769-
770767
$data = (string) static::_client()->get($url, [
771768
'headers' => [
772-
'referer' => $referer,
769+
'referer' => static::_referer(),
773770
]
774771
])->getBody();
775772
$data = Json::decodeIfJson($data);
@@ -796,13 +793,10 @@ private static function _latLngFromAddress_Nominatim ($address, $country): ?arra
796793
$url .= '&country=' . rawurlencode($country);
797794
}
798795

799-
$referer = Craft::$app->getRequest()->getIsConsoleRequest()
800-
? Craft::getAlias('@web')
801-
: Craft::$app->urlManager->getHostInfo();
802-
803796
$data = (string) static::_client()->get($url, [
804797
'headers' => [
805-
'referer' => $referer
798+
'referer' => static::_referer(),
799+
'user-agent' => static::_userAgent(),
806800
]
807801
])->getBody();
808802
$data = Json::decodeIfJson($data);
@@ -891,13 +885,10 @@ private static function _addressFromLatLng_Nominatim ($lat, $lng): ?array
891885
$url .= '&accept-language=' . Craft::$app->locale->getLanguageID();
892886
$url .= '&lat=' . rawurlencode($lat) . '&lon=' . rawurldecode($lng);
893887

894-
$referer = Craft::$app->getRequest()->getIsConsoleRequest()
895-
? Craft::getAlias('@web')
896-
: Craft::$app->urlManager->getHostInfo();
897-
898888
$data = (string) static::_client()->get($url, [
899889
'headers' => [
900-
'referer' => $referer
890+
'referer' => static::_referer(),
891+
'user-agent' => static::_userAgent(),
901892
]
902893
])->getBody();
903894
$data = Json::decodeIfJson($data);
@@ -930,6 +921,21 @@ private static function _client ()
930921
return $client;
931922
}
932923

924+
private static function _referer ()
925+
{
926+
return Craft::$app->getRequest()->getIsConsoleRequest()
927+
? Craft::getAlias('@web')
928+
: Craft::$app->urlManager->getHostInfo();
929+
}
930+
931+
private static function _userAgent ()
932+
{
933+
// User agent form based on Craft::createGuzzleClient
934+
return 'Craft/' . Craft::$app->getVersion()
935+
. ' ' . default_user_agent()
936+
. ' ' . static::_referer();
937+
}
938+
933939
private static function _validateCountryCode (string $code): bool
934940
{
935941
return in_array(strtoupper($code), array_keys(static::$countries));

0 commit comments

Comments
 (0)