This commit is contained in:
jinql
2025-09-05 23:09:25 +08:00
parent 407c803550
commit d6696ff765
7 changed files with 24 additions and 60 deletions

View File

@@ -311,10 +311,10 @@ class Favicon:
Returns:
域名是否合法且非内网地址
"""
return _check_internal(domain) and _pattern_domain.match(domain)
return Favicon.check_internal(domain) and _pattern_domain.match(domain)
@staticmethod
def _check_internal(domain: str) -> bool:
def check_internal(domain: str) -> bool:
"""检查网址是否非内网地址
Args:
@@ -348,27 +348,4 @@ _pattern_domain = re.compile(
def _check_url(domain: str) -> Optional[Any]:
return _check_internal(domain) and _pattern_domain.match(domain)
def _check_internal(domain: str) -> bool:
"""
检查网址是否非内网地址
Args:
domain:
Returns: True 非内网False 是内网/无法解析
"""
try:
if domain.replace('.', '').isdigit():
return not ipaddress.ip_address(domain).is_private
else:
ips = socket.getaddrinfo(domain, None)
for ip_info in ips:
ip = ip_info[4][0]
if '.' in ip:
return not ipaddress.ip_address(ip).is_private
return True
except Exception as e:
print(f"解析网址出错: {e}")
return False
return Favicon.check_internal(domain) and _pattern_domain.match(domain)

View File

@@ -344,7 +344,7 @@ class FaviconService:
with self._lock:
if entity.domain in self.domain_list:
self.domain_list.remove(entity.domain)
# 同时从两个队列中移元素(处理完成)
# 任务完成,从两个队列中移元素
self._queue_pull(True, self.icon_queue)
self._queue_pull(True, self.total_queue)
@@ -401,7 +401,8 @@ class FaviconService:
if _cached and not cached_icon:
# 缓存已过期,后台刷新缓存
logger.info(f"缓存已过期,加入后台队列刷新: {entity.domain}")
# 只增加总队列计数,不增加实时队列计数(后台任务)
# 开始图标处理,加入两个队列
self.icon_queue.put(entity.domain)
self.total_queue.put(entity.domain)
bg_tasks.add_task(self.get_icon_sync, entity, _cached)
@@ -415,31 +416,33 @@ class FaviconService:
if not is_sync:
# 返回默认图片并加入后台队列
logger.info(f"返回默认图片并加入后台队列: {entity.domain}")
# 只增加总队列计数,不增加实时队列计数(后台任务)
# 开始图标处理,加入两个队列
self.icon_queue.put(entity.domain)
self.total_queue.put(entity.domain)
bg_tasks.add_task(self.get_icon_sync, entity, _cached)
return self.get_default(0)
return self.get_default()
else:
# 没有缓存,实时处理,检查队列大小
queue_size = self.icon_queue.qsize()
if queue_size >= self.MAX_QUEUE_SIZE:
# 加入后台队列并返回默认图片
logger.info(f"队列大小({queue_size})>={self.MAX_QUEUE_SIZE},返回默认图片并加入后台队列: {entity.domain}")
# 只增加总队列计数,不增加实时队列计数(后台任务)
# 开始图标处理,加入两个队列
self.icon_queue.put(entity.domain)
self.total_queue.put(entity.domain)
bg_tasks.add_task(self.get_icon_sync, entity, _cached)
return self.get_default(0)
return self.get_default()
else:
# 队列<MAX_QUEUE_SIZE实时处理
logger.info(f"队列大小({queue_size})<{self.MAX_QUEUE_SIZE},实时处理: {entity.domain}")
# 同时增加两个队列计数(实时处理任务)
# 开始图标处理,加入两个队列
self.icon_queue.put(entity.domain)
self.total_queue.put(entity.domain)
icon_content = self.get_icon_sync(entity, _cached)
if not icon_content:
# 获取失败,返回默认图标,不缓存
return self.get_default(0)
return self.get_default()
# 确定内容类型和缓存时间
content_type = filetype.guess_mime(icon_content) if icon_content else ""
@@ -451,7 +454,7 @@ class FaviconService:
except Exception as e:
logger.error(f"处理图标请求时发生错误 {url}: {e}")
# 返回默认图标
return self.get_default(0)
return self.get_default()
def get_header(self, content_type: str, cache_time: int = None) -> dict:
return self._get_header(content_type, cache_time)