feat(app): add vworld geocoding and native ads placeholders
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'package:lunchpick/core/utils/app_logger.dart';
|
||||
|
||||
import '../../../core/network/network_client.dart';
|
||||
@@ -37,6 +38,12 @@ class NaverUrlResolver {
|
||||
return location;
|
||||
}
|
||||
|
||||
// Location이 없는 경우, http.Client로 리다이렉트를 끝까지 따라가며 최종 URL 추출 (fallback)
|
||||
final expanded = await _followRedirectsWithHttp(shortUrl);
|
||||
if (expanded != null) {
|
||||
return expanded;
|
||||
}
|
||||
|
||||
// 리다이렉트가 없으면 원본 URL 반환
|
||||
return shortUrl;
|
||||
} on DioException catch (e) {
|
||||
@@ -54,6 +61,12 @@ class NaverUrlResolver {
|
||||
}
|
||||
}
|
||||
|
||||
// Dio 실패 시 fallback으로 http.Client 리다이렉트 추적 시도
|
||||
final expanded = await _followRedirectsWithHttp(shortUrl);
|
||||
if (expanded != null) {
|
||||
return expanded;
|
||||
}
|
||||
|
||||
// 오류 발생 시 원본 URL 반환
|
||||
return shortUrl;
|
||||
}
|
||||
@@ -161,4 +174,26 @@ class NaverUrlResolver {
|
||||
void dispose() {
|
||||
// 필요시 리소스 정리
|
||||
}
|
||||
|
||||
/// http.Client를 사용해 리다이렉트를 끝까지 따라가며 최종 URL을 반환한다.
|
||||
/// 실패 시 null 반환.
|
||||
Future<String?> _followRedirectsWithHttp(String shortUrl) async {
|
||||
final client = http.Client();
|
||||
try {
|
||||
final request = http.Request('HEAD', Uri.parse(shortUrl))
|
||||
..followRedirects = true
|
||||
..maxRedirects = 5;
|
||||
final response = await client.send(request);
|
||||
return response.request?.url.toString();
|
||||
} catch (e, stackTrace) {
|
||||
AppLogger.error(
|
||||
'_followRedirectsWithHttp error: $e',
|
||||
error: e,
|
||||
stackTrace: stackTrace,
|
||||
);
|
||||
return null;
|
||||
} finally {
|
||||
client.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user