如何使用libmicrohttpd库让其以chunked模式工作

按照HTTP的协议, 当服务器知道要发送的Content的长度时, 在HTTP头就会生成 Content-Length:xxx 这样的长度信息,

但是有时候我们即使知道长度, 也希望用Chunked模式发送内容, 那要怎么使用?

经过查看libmicrohttpd的源码里有这个关键函数:

static int     try_ready_chunked_body (struct MHD_Connection *connection)

这是chunk模式下专门处理chunk的,仔细看懂这个函数的代码就知道怎么处理chunk模式了。


应用层使用方法如下 :

response = MHD_create_response_from_callback (MHD_SIZE_UNKNOWN/*stbuf.st_size*/, 32 * 1024, &file_reader, file, &free_callback);
if (response == NULL)
{
	fclose (file);
	return MHD_NO;
}
ret = MHD_queue_response (connection, MHD_HTTP_OK, response);
MHD_add_response_header (response, MHD_HTTP_HEADER_TRANSFER_ENCODING, "chunked");
MHD_add_response_header (response, MHD_HTTP_HEADER_CONNECTION, "Keep-Alive");
MHD_destroy_response (response);

回调函数file_reader要如下使用 :

static ssize_t  file_reader (void *cls, uint64_t pos, char *buf, size_t max)
{
    FILE *file = (FILE*)cls;

    (void)  fseek (file, pos, SEEK_SET);
    int n = fread (buf, 1, max, file);

    if (0 == n) 
        return MHD_CONTENT_READER_END_OF_STREAM;
    if (n < 0) 
        return MHD_CONTENT_READER_END_WITH_ERROR;
    return n;
}

这样就可以了。

你可能感兴趣的:(如何使用libmicrohttpd库让其以chunked模式工作)