Erlang YAWS Web服务器-如何知道下载是否成功?

Erlang YAWS Web服务器-如何知道下载是否成功?,erlang,yaws,Erlang,Yaws,我允许人们使用HTTP-GET从Yaws下载文件。我已经在yaws_appmod_dav.erl中实现了它,它运行良好 case file:read(Fd,PPS) of {ok,Data} when size(Data)<PPS -> ?DEBUG("only chunk~n"), status(200,H,{content,Mimetype,Data});

我允许人们使用HTTP-GET从Yaws下载文件。我已经在yaws_appmod_dav.erl中实现了它,它运行良好

            case file:read(Fd,PPS) of
            {ok,Data} when size(Data)<PPS ->
                ?DEBUG("only chunk~n"),
                status(200,H,{content,Mimetype,Data});
            {ok,Data} ->
                ?DEBUG("first chunk~n"),
                spawn(fun() -> deliver_rest(Pid,Fd) end),
                status(200,H,{streamcontent,Mimetype,Data});
            eof ->
                status(200,{content,"application/octet-stream",<<>>});
            {error,Reason} ->
                Response = [{'D:error',[{'xmlns:D',"DAV:"}],[Reason]}],
                status(500,{xml,Response})
            end;
案例文件:读取(Fd、PPS)
{ok,Data}当大小(Data)时
?调试(“仅块~n”),
状态(200,H,{content,Mimetype,Data});
{好的,数据}->
?调试(“第一块~n”),
繁殖(fun()->交付_rest(Pid,Fd)结束),
状态(200,H,{streamcontent,Mimetype,Data});
eof->
状态(200,{内容,“应用程序/八位字节流”,});
{错误,原因}->
响应=[{'D:error',[{'xmlns:D',“DAV:”}],[Reason]}],
状态(500,{xml,Response})
结束;
我想在服务器上标记成功下载,即当客户端接受最后一个包时

我该怎么做


一个小问题:在用于Yaws的webdav应用程序中,在获取文件时使用Yaws\u api:stream\u chunk\u deliver代替Yaws\u api:stream\u chunk\u deliver\u阻塞。(参见中的第449行)

为什么这不是一个问题?根据“只要流的生产者比消费者(即WWW客户机)快,我们就必须使用同步版本的代码。”我注意到这两个版本都可以正常工作,受影响的只是服务器上的内存量吗?

协议没有指定客户端通知服务器下载成功的方式。客户机要么获取结果代码
200
(或
206
)确认的请求数据,要么不获取,在这种情况下,它获取一个错误代码。然后客户端可以自由地重新请求该数据。因此,没有一种可靠的方法来实现你想要的

您可以记录最后一块数据已发送到客户端的事实,并假设它已成功发送,除非客户端重新请求该数据,在这种情况下,您可以使先前的假设无效

另外,请注意,HTTP规范允许在服务器发送GET请求时,从服务器请求数据的任何部分。请参阅此实现中的一个示例,以及本文中的一些详细信息。如果您不知道使用范围标头的GET请求是最后一个GET请求(例如,客户端可能会将整个文件按向后顺序分块下载),如何确定下载是否成功


这也可以回答你的小问题。客户端通过从给定文件请求指定范围的字节来控制流。我不知道WebDAV协议的实现,但它可能不会一次请求整个文件,因此服务器可以分块交付数据,并且不会使客户端溢出

HTTP范围标头是独立于的,它位于TCP协议级别(HTTP是在TCP之上实现的应用程序级别协议)。假设客户端请求了整个文件,服务器就这样发送。并不是说整个文件已经通过网络发送了。要发送的数据在内核中缓冲,并根据TCP窗口大小分块发送。如果客户端只请求带有Range头的部分数据,那么内核中将只缓冲该部分数据