YouTubeApiKeyHandler.cs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536
  1. using Application.Abstractions.YouTube;
  2. using Microsoft.Extensions.Logging;
  3. namespace Infrastructure.YouTube;
  4. /// <summary>
  5. /// YouTube Data API v3 요청에 API Key를 자동으로 추가하는 DelegatingHandler.
  6. /// 실제 캐시/조회는 <see cref="IYouTubeApiKeyProvider"/> 싱글톤에 위임.
  7. /// </summary>
  8. internal sealed class YouTubeApiKeyHandler(
  9. IYouTubeApiKeyProvider keyProvider,
  10. ILogger<YouTubeApiKeyHandler> logger
  11. ) : DelegatingHandler
  12. {
  13. protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
  14. {
  15. var apiKey = await keyProvider.GetAsync(cancellationToken);
  16. if (!string.IsNullOrEmpty(apiKey) && request.RequestUri is not null)
  17. {
  18. // 이미 Authorization 헤더(OAuth)가 있으면 API Key 추가 안 함
  19. if (request.Headers.Authorization is null)
  20. {
  21. var uriStr = request.RequestUri.ToString();
  22. var separator = uriStr.Contains('?') ? "&" : "?";
  23. request.RequestUri = new Uri($"{uriStr}{separator}key={Uri.EscapeDataString(apiKey)}");
  24. }
  25. }
  26. else
  27. {
  28. logger.LogWarning("[YouTube] API Key가 비어있습니다. DB Config > External > YouTubeApiKeyEnc를 확인하세요.");
  29. }
  30. return await base.SendAsync(request, cancellationToken);
  31. }
  32. }