flymzero/webdav_client

关于wdWriteWithStream的options的问题

Opened this issue · 5 comments

我有看着在源代码中 lib/src/webdav_dio.dart中有以下代码。

 Future<void> wdWriteWithStream(
    Client self,
    String path,
    Stream<List<int>> data,
    int length, {
    void Function(int count, int total)? onProgress,
    CancelToken? cancelToken,
  }) async {
    // fix auth error
    var pResp = await this.wdOptions(self, path, cancelToken: cancelToken);
    if (pResp.statusCode != 200) {
      throw newResponseError(pResp);
    }
   .......
}

个人认为在上传文件时,特别是多级目录。
options 预检 服务端一般都是返回404的。此处判断!=200. 就直接异常 不太合适。

如果在wdWriteWithStream之前,自己手动调用目录的创建, 但wdWriteWithStream中又调用了一次。 多次请求浪费。
不知道大佬怎么看?

这个库其实一开始是参考golang的一个开源库写的,协议的标准我没去翻,所以有!=200的这样处理。

另一个重复请求我记得是我封装了通用方法,可能这块没注意重复请求了。

目前好久没解决bug了,其实有重构的想法(有个其他项目在开发,后面可能会用到这个库),可能到那时候会重构,或者通过ffi的方式引入更健全的其他语言库

我目前是存在,多级目录 /a/b/c/d/1.png。这种情况直接使用 是无法成功的。在服务端那边options返回404.

1 在客户端的处理方案,writeFromFile 之前,先检测目录是否已存在(这里,没有合适的方法。client,没有提供wdPropfind,需要自己去client.c.wdPropfind 或者req) 不存在则创建目录。 如果执行这个逻辑,在wdWriteWithStream中 默认有去调用_createParent。这就造成了两次创建目录请求

2 修改服务端。
2.1 我之前是打算用flutter写服务端的,但没有找到合适的库,我刚开始对webdav规范也不熟。所以只能放弃
2.2 我目前使用的是python WsgiDAV 做服务端。
2.2.1 这里也需要自定义一些东西,他不支持文件的创建时间修改。
2.2.2 自定义了 FilesystemProvider. 实现了文件创建时间的修改,另外修改了options 404.我返回了200。

虽然完成了需求,但总感觉怪怪的。

最后,期待大佬的新作品。

我当时单测用的是坚果云,你可以试试不同服务端一致性(从以往的问题来看,不同服务端的返回还是有很多差异的)

刚遇到一个新问题

我文件上次 单个任务是成功的。但并发失败。

image

注释的代码,我想并发执行。但上传失败。目前我还没法确认是服务端还是客服端的原因。
从先有服务端反馈来看,存在大量401. 很奇怪。

明天在继续查找问题

刚遇到一个新问题

我文件上次 单个任务是成功的。但并发失败。

image

注释的代码,我想并发执行。但上传失败。目前我还没法确认是服务端还是客服端的原因。 从先有服务端反馈来看,存在大量401. 很奇怪。

明天在继续查找问题

是的,并发的时候好像会丢失 auth 字段,导致身份验证失败