如何通过HTTP / 2使用libcurl上传流数据?

时间:2019-01-01 07:35:44

标签: curl http2

描述

我正在使用一个将libcurl与http / 2结合使用的项目,以上传流数据。

工作流程为:

数据生成器->缓冲区-> curl->服务器。

当袜子准备发送时,由CURLOPT_READFUNCTION设置的

read_cb将从缓冲区中获取数据。

  1. 当curl太快地获取数据时,缓冲区可能为空。空缓冲区会导致read_cb返回0,然后我就不能再使用curl句柄发送数据了。(CURLOPT_READFUNCTION

  2. 我使用curl_easy_pause来防止read_cb返回0。我只想暂停调用read_cb(仅设置CURL_READFUNC_PAUSE),但似乎write_cb也已暂停,因此我无法接收数据(可以捕获Wireshark恢复的数据。

问题

使用libcurl上传流的解决方案是什么? 还是我弄错了任何步骤?

感谢您的建议。

我的示例代码:

size_t read_cb(void* ptr, size_t size, size_t nitems, void* userdata) {
    Buffer* buf = (Buffer*)userdata;
    if (buf->empty())
        return CURL_READFUNC_PAUSE;
    ...
}
size_t Buffer::put(const char* data, size_t* len) {
    ...
    curl_easy_pause(easy_, CURL_READFUNC_PAUSE);
    ...
}

1 个答案:

答案 0 :(得分:0)

请遵循以下三个步骤:

  1. 我需要安装nghttp2 from GitHUB

    sudo apt-get install git g++ make binutils autoconf automake autotools-dev libtool pkg-config \
    zlib1g-dev libcunit1-dev libssl-dev libxml2-dev libev-dev libevent-dev libjansson-dev \
    libjemalloc-dev cython python3-dev python-setuptools
    git clone https://github.com/tatsuhiro-t/nghttp2.git
    cd nghttp2
    autoreconf -i
    automake
    autoconf
    ./configure
    make
    sudo maeke install
    
  2. 使用

    升级您的curl版本
    cd ~
    sudo apt-get build-dep curl
    
    wget http://curl.haxx.se/download/curl-7.46.0.tar.bz2
    tar -xvjf curl-7.46.0.tar.bz2
    cd curl-7.46.0
    ./configure --with-nghttp2=/usr/local --with-ssl
    sudo make && make install
    
    echo '/usr/local/lib' > /etc/ld.so.conf.d/local.conf
    ldconfig
    
  3. 执行以下命令

    cur —version