
WaterCrawl result downloads disable HTTP timeouts
快速结论:该问题出现在 Dify 自托管部署中,使用 WaterCrawl 作为数据源采集网站内容时。问题根因是 download_result() 方法在请求结果 URL 时使用了 timeout=None,导致连接被挂起时无法触发超时。优先排查 api/core/rag/extractor/watercrawl/client.py 中 download_result 方法的超时配置。
问题场景
用户在 Dify 自托管(Self Hosted Source)部署中,配置 WaterCrawl 作为网站数据源(Website Datasource Provider)。启动爬取任务后,WaterCrawl 返回事件流,其中每个事件包含一个 result URL。当该结果 URL 的 TCP 连接正常建立但返回 JSON 数据时发生停顿,则触发该问题。
报错原文
response = httpx.get(result_object["result"], timeout=None)
原因分析
在 api/core/rag/extractor/watercrawl/client.py 的 download_result() 方法中(第 220 行左右),调用 httpx.get() 时传入了 timeout=None,这会禁用 HTTPX 的请求超时机制。这与 process_eventstream() 中处理长时间运行的 SSE 流不同,download_result() 仅用于下载单个 JSON 结果载荷,应当使用有限超时时间。如果结果端点停顿,会导致处理 WaterCrawl 提取的工作线程或请求无限期等待而不会失败。
环境排查
- Dify 版本:main branch at
b6b9165d - 部署方式:Self Hosted (Source)
- 检查文件路径:
api/core/rag/extractor/watercrawl/client.py - 检查具体行号:第 219-226 行之间的
download_result()方法
解决步骤
- 打开
api/core/rag/extractor/watercrawl/client.py文件。 - 找到
download_result()方法,定位到response = httpx.get(result_object["result"], timeout=None)这行代码。 - 可优先尝试:将该行中的
timeout=None替换为合理的有限超时时间,例如timeout=httpx.Timeout(10.0, connect=3.0)(读取超时 10 秒,连接超时 3 秒)。对于较大载荷可适当调整读取超时。 - 相关修改可参考已有 PR #33267,该 PR 对 WaterCrawl 的认证提供者 HTTP 调用添加了明确的超时设置,但未覆盖
download_result()。 - 保存文件并重启 Dify 服务。
验证方法
重新配置 WaterCrawl 数据源并启动爬取任务,确保在结果 URL 停顿或缓慢响应时,请求能在超时时间内断开并返回错误(如超时异常),而不是无限期等待。



