在服务器上使用cpprestsdk下载文件

时间:2018-07-12 01:34:32

标签: c++ server stream downloading cpprest-sdk

我试图使用cpprestsdk构建HTTP服务器,但遇到了一个大问题:

我知道如何使用文件流缓冲区编写文件下载,但是我的文件实际上不是静态的。由于服务器上其他线程不断在内存中动态生成它。
因此,我决定使用producer_consumer_buffer并像这样编写代码:

// http request handler

{
    auto  p_buffer = new producer_consumer_buffer<uint8_t>();
    auto is = new basic_istream<uint8_t>(*p_buffer);    
    response.set_body(*is);
    request.refly(response);    // with code 200 and octetstream and content-disposition header
    _other_thread_call(p_buffer, is);   // call other thread to wirte data

    ...
}

// other threads

while(true)
{
    if (p_buffer ->is_open() && is ->is_open()) {       // !!! always true
        p_buffer ->putn_nocopy(el.data, el.len);
        p_buffer ->sync();  // no blocking actually
    }
    ...
}

// trace thread

while(true)
{
    cout << p_buffer ->getpos(std::ios_base::in).seekpos();     // always 0
    cout << p_buffer ->getpos(std::ios_base::out).seekpos();    // always 0
    cout << is ->is_open(); // always true
}

测试01:

我试图取消客户端的chrome下载。

期望:

  

服务器可能会收到诸如is ->is_open()错误的响应。

实际:

  

is ->is_open()仍然正确,服务器似乎一无所获。

测试02:

文件在服务器上完全生成,所有数据均写入流缓冲区。所以我关闭了流。

期望:

  将所有数据写入流缓冲区后,

文件应同步下载。

实际:

  

数据写入异步,甚至称为p_buffer->sync。因此,我不知道如何检测以及浏览器何时接收所有数据。当我在服务器上关闭流时,浏览器出现网络错误,并且由于网络传输,文件的下载量减半。

测试03:

文件在服务器上完全生成,所有数据均写入流缓冲区。不执行任何操作,直到看到文件已在浏览器中完全下载,然后在服务器上手动关闭流。

期望:

  

文件已完全下载。

实际:

  

文件已完全按预期下载。但是我仍然不知道如何解决。


结论:

我的问题是如何准确检测浏览器的下载状态,以及何时应在服务器上正确关闭流。

https://github.com/Microsoft/cpprestsdk/issues/806

0 个答案:

没有答案