Skip to content

支持了按 chunk 返回的 HTTP 客户端 #1718

@Barenboim

Description

@Barenboim

这个功能非常适合于访问大模型服务,之后我们会给出一个和deepseek对话的示例出来。
接口头文件:
https://github.com/sogou/workflow/blob/master/src/client/WFHttpChunkedClient.h

其中WFHttpChunkedClient是一个静态类,用于创建基于 chunk 回调的 HTTP 任务,类型为WFHttpChunkedTask
示例:

#include "workflow/WFHttpChunkedClient.h"
#include "workflow/WFFacilities.h"
#include <stdio.h>

void extract(WFHttpChunkedTask *task)
{
    protocol::HttpResponse *resp = task->get_resp();   // 可以获得resp的header等信息。
    protocol::HttpMessageChunk *chunk = task->get_chunk();
    const void *chunk_data;
    size_t chunk_size;

    chunk->get_chunk_data(&chunk_data, &chunk_size);    // extract函数里,get_chunk_data必然成功
    printf("Chunk size = %zu. Chunk data:\n", chunk_size);
    fwrite(chunk_data, chunk_size, 1, stdout);
    printf("\n");
}

WFFacilities::WaitGroup wg(1);

void callback(WFHttpChunkedTask *task)
{
    protocol::HttpResponse *resp = task->get_resp();
    printf("state = %d, error = %d\n", task->get_state(), task->get_error());
    if (task->get_state() == WFT_STATE_SUCCESS)
        printf("%s %s %s", resp->get_http_version(), resp->get_status_code(), resp->get_reason_phrase());

    wg.done();
}

int main()
{
    WFHttpChunkedTask *task = WFHttpChunkedClient::create_chunked_task("http://github.com/", 3, extract, callback);
    task->start();
    wg.wait();
}

这个client的特色是支持重定向,create_chunked_task函数的第二个参数就是重定向最大次数。示例中指定的HTTP URL会重定向到 HTTPS。

另外,如果返回 HTTP 回复不是chunked编码,则extract函数不会被调用,用户可以在callback里获得完整的 HTTP 消息体。相当于退化为普通的 HTTP 任务。

WFHttpChunkedTask类代理了WFHttpTask的大多数接口,简单参考头文件即可了解用法。

extract函数的调用位置是在网络io线程,串行调用。用户不应该在extract函数内阻塞或调用执行大量CPU计算。可以通过HttpMessageChunk类的move_chunk_data(),把数据无拷贝的移动走以便后续处理(需自行调用free释放内存),也可以std::move()移动整个chunk对象,例如:

void extract(WFHttpChunkedTask *task)
{
    protocol::HttpMessageChunk *chunk = task->get_chunk();
    auto *c = new protocol::HttpMessageChunk(std::move(*chunk));
    ...
}

这个与我们大多数网络任务里,移动resp数据的做法是一致的。

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentationenhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions