|
@@ -122,23 +122,30 @@ class ZipCodeCoordinatesService
|
|
|
'mode' => 'preload',
|
|
'mode' => 'preload',
|
|
|
'pending_count' => count($pending),
|
|
'pending_count' => count($pending),
|
|
|
'zip_codes_sample' => array_slice(array_values($pending), 0, 20),
|
|
'zip_codes_sample' => array_slice(array_values($pending), 0, 20),
|
|
|
|
|
+ 'connect_timeout' => (int) config('services.brasil_api.connect_timeout', 2),
|
|
|
|
|
+ 'timeout' => (int) config('services.brasil_api.timeout', 3),
|
|
|
|
|
+ 'ip_resolve' => 'ipv4',
|
|
|
]);
|
|
]);
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
|
$baseUrl = rtrim((string) config('services.brasil_api.base_url'), '/');
|
|
$baseUrl = rtrim((string) config('services.brasil_api.base_url'), '/');
|
|
|
|
|
+ $startedAt = microtime(true);
|
|
|
|
|
|
|
|
$responses = Http::pool(fn (Pool $pool) => array_map(
|
|
$responses = Http::pool(fn (Pool $pool) => array_map(
|
|
|
fn (string $zipCode) => $pool
|
|
fn (string $zipCode) => $pool
|
|
|
->as($zipCode)
|
|
->as($zipCode)
|
|
|
->acceptJson()
|
|
->acceptJson()
|
|
|
|
|
+ ->withUserAgent($this->brasilApiUserAgent())
|
|
|
->connectTimeout((int) config('services.brasil_api.connect_timeout', 2))
|
|
->connectTimeout((int) config('services.brasil_api.connect_timeout', 2))
|
|
|
->timeout((int) config('services.brasil_api.timeout', 3))
|
|
->timeout((int) config('services.brasil_api.timeout', 3))
|
|
|
|
|
+ ->withOptions($this->curlForceIpv4Options())
|
|
|
->get("{$baseUrl}/api/cep/v2/{$zipCode}"),
|
|
->get("{$baseUrl}/api/cep/v2/{$zipCode}"),
|
|
|
$pending,
|
|
$pending,
|
|
|
));
|
|
));
|
|
|
} catch (Throwable $exception) {
|
|
} catch (Throwable $exception) {
|
|
|
Log::warning('ZipCodeCoordinates Brasil API preload failed', [
|
|
Log::warning('ZipCodeCoordinates Brasil API preload failed', [
|
|
|
'pending_count' => count($pending),
|
|
'pending_count' => count($pending),
|
|
|
|
|
+ 'elapsed_ms' => isset($startedAt) ? round((microtime(true) - $startedAt) * 1000, 2) : null,
|
|
|
'error' => $exception->getMessage(),
|
|
'error' => $exception->getMessage(),
|
|
|
]);
|
|
]);
|
|
|
|
|
|
|
@@ -156,6 +163,7 @@ class ZipCodeCoordinatesService
|
|
|
'zip_code' => $zipCode,
|
|
'zip_code' => $zipCode,
|
|
|
'has_response' => $response instanceof Response,
|
|
'has_response' => $response instanceof Response,
|
|
|
'status' => $response instanceof Response ? $response->status() : null,
|
|
'status' => $response instanceof Response ? $response->status() : null,
|
|
|
|
|
+ 'elapsed_ms' => isset($startedAt) ? round((microtime(true) - $startedAt) * 1000, 2) : null,
|
|
|
'found' => $coordinates !== null,
|
|
'found' => $coordinates !== null,
|
|
|
'coordinates' => $coordinates,
|
|
'coordinates' => $coordinates,
|
|
|
]);
|
|
]);
|
|
@@ -206,23 +214,33 @@ class ZipCodeCoordinatesService
|
|
|
|
|
|
|
|
private function requestCoordinates(string $zipCode): ?array
|
|
private function requestCoordinates(string $zipCode): ?array
|
|
|
{
|
|
{
|
|
|
|
|
+ $startedAt = microtime(true);
|
|
|
|
|
+
|
|
|
try {
|
|
try {
|
|
|
Log::info('ZipCodeCoordinates calling Brasil API', [
|
|
Log::info('ZipCodeCoordinates calling Brasil API', [
|
|
|
- 'zip_code' => $zipCode,
|
|
|
|
|
- 'base_url' => rtrim((string) config('services.brasil_api.base_url'), '/'),
|
|
|
|
|
|
|
+ 'zip_code' => $zipCode,
|
|
|
|
|
+ 'base_url' => rtrim((string) config('services.brasil_api.base_url'), '/'),
|
|
|
|
|
+ 'user_agent' => $this->brasilApiUserAgent(),
|
|
|
|
|
+ 'connect_timeout' => (int) config('services.brasil_api.connect_timeout', 2),
|
|
|
|
|
+ 'timeout' => (int) config('services.brasil_api.timeout', 3),
|
|
|
|
|
+ 'ip_resolve' => 'ipv4',
|
|
|
]);
|
|
]);
|
|
|
|
|
|
|
|
- $response = Http::baseUrl(rtrim((string) config('services.brasil_api.base_url'), '/'))
|
|
|
|
|
- ->acceptJson()
|
|
|
|
|
|
|
+ $baseUrl = rtrim((string) config('services.brasil_api.base_url'), '/');
|
|
|
|
|
+
|
|
|
|
|
+ $response = Http::acceptJson()
|
|
|
|
|
+ ->withUserAgent($this->brasilApiUserAgent())
|
|
|
|
|
+ ->withOptions($this->curlForceIpv4Options())
|
|
|
->connectTimeout((int) config('services.brasil_api.connect_timeout', 2))
|
|
->connectTimeout((int) config('services.brasil_api.connect_timeout', 2))
|
|
|
->timeout((int) config('services.brasil_api.timeout', 3))
|
|
->timeout((int) config('services.brasil_api.timeout', 3))
|
|
|
- ->get("api/cep/v2/{$zipCode}");
|
|
|
|
|
|
|
+ ->get("{$baseUrl}/api/cep/v2/{$zipCode}");
|
|
|
|
|
|
|
|
$coordinates = $this->coordinatesFromResponse($response);
|
|
$coordinates = $this->coordinatesFromResponse($response);
|
|
|
|
|
|
|
|
Log::info('ZipCodeCoordinates Brasil API response', [
|
|
Log::info('ZipCodeCoordinates Brasil API response', [
|
|
|
'zip_code' => $zipCode,
|
|
'zip_code' => $zipCode,
|
|
|
'status' => $response->status(),
|
|
'status' => $response->status(),
|
|
|
|
|
+ 'elapsed_ms' => round((microtime(true) - $startedAt) * 1000, 2),
|
|
|
'found' => $coordinates !== null,
|
|
'found' => $coordinates !== null,
|
|
|
'coordinates' => $coordinates,
|
|
'coordinates' => $coordinates,
|
|
|
]);
|
|
]);
|
|
@@ -230,14 +248,33 @@ class ZipCodeCoordinatesService
|
|
|
return $coordinates;
|
|
return $coordinates;
|
|
|
} catch (Throwable $exception) {
|
|
} catch (Throwable $exception) {
|
|
|
Log::warning('ZipCodeCoordinates Brasil API request failed', [
|
|
Log::warning('ZipCodeCoordinates Brasil API request failed', [
|
|
|
- 'zip_code' => $zipCode,
|
|
|
|
|
- 'error' => $exception->getMessage(),
|
|
|
|
|
|
|
+ 'zip_code' => $zipCode,
|
|
|
|
|
+ 'elapsed_ms' => round((microtime(true) - $startedAt) * 1000, 2),
|
|
|
|
|
+ 'error' => $exception->getMessage(),
|
|
|
]);
|
|
]);
|
|
|
|
|
|
|
|
return null;
|
|
return null;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ private function curlForceIpv4Options(): array
|
|
|
|
|
+ {
|
|
|
|
|
+ if (! defined('CURLOPT_IPRESOLVE') || ! defined('CURL_IPRESOLVE_V4')) {
|
|
|
|
|
+ return [];
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return [
|
|
|
|
|
+ 'curl' => [
|
|
|
|
|
+ CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4,
|
|
|
|
|
+ ],
|
|
|
|
|
+ ];
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private function brasilApiUserAgent(): string
|
|
|
|
|
+ {
|
|
|
|
|
+ return 'insomnia/11.3.0';
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private function coordinatesFromResponse(Response $response): ?array
|
|
private function coordinatesFromResponse(Response $response): ?array
|
|
|
{
|
|
{
|
|
|
if (! $response->successful()) {
|
|
if (! $response->successful()) {
|