Skip to content

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

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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions