
WaterCrawl API client disables HTTP timeouts for crawl requests
快速结论:该问题发生在 Dify 自托管环境中使用 WaterCrawl 网站爬取功能时,由于 WaterCrawl API 客户端的共享 httpx.Client 被设置为 timeout=None,导致所有请求无超时限制。优先排查并替换 init_session() 中的 timeout=None 为有界超时配置。
问题场景
用户在使用 Dify 自托管(Source 或 Docker)环境,配置 WaterCrawl 作为网站爬取提供者时触发。当 WaterCrawl 的 base_url 指向一个接受 TCP 连接但不返回响应的端点时,crawl 创建、状态轮询、结果分页或爬取操作会被无限阻塞。
报错原文
WaterCrawlAPIClient disables httpx timeouts for its shared session
return httpx.Client(headers=headers, timeout=None)
{'timeout': None, 'has_timeout_key': True, 'client_type': 'DummyClient'}
原因分析
WaterCrawl API 客户端的 init_session() 方法在 BaseAPIClient 中显式设置了 timeout=None,导致共享的 httpx.Client 对所有请求路径(包括 create_crawl_request、get_crawl_request、get_crawl_request_results、monitor_crawl_request、scrape_url)禁用超时处理。虽然 download_result() 方法已通过 PR #37495 修复为 timeout=30,但共享会话的超时问题仍未解决。
环境排查
- Dify 版本:当前 main 分支(通过代码审查确认)
- 部署方式:Self Hosted (Source) 或 Self Hosted (Docker)
- 相关文件路径:api/core/rag/extractor/watercrawl/client.py
- 检查组件:WaterCrawl 爬取提供者配置
解决步骤
- 可优先尝试:修改
init_session()方法,将timeout=None替换为有界超时配置。参考 PR #33267 的模式,可使用httpx.Timeout(30.0, connect=10.0)作为默认值。 - 对于
monitor_crawl_request()这类流式请求,如果需要更长的读取超时,可以为该特定请求单独传递一个 per-request 超时参数。 - 添加单元测试,断言共享客户端不再传递
timeout=None。 - 更新代码后,重启 Dify 服务使配置生效。
验证方法
执行以下验证步骤:
- 配置 WaterCrawl 爬取提供者,指向一个会延迟响应或滞后的端点。
- 创建 crawl 请求,发起爬取任务。
- 确认任务在可接受时间内超时或正常返回,不再无限阻塞。
- 检查日志确认 httpx 客户端超时设置已生效(可通过小规模本地测试验证 timeout 值不再是 None)。



