首页 > 解决方案 > 如何使用 ngthttp2 发送帖子数据?

问题描述

我正在使用 nghttp2 发送 http post 数据,但没有成功,有人可以帮助解决我的问题。

nghttp2的主要api是nghttp2_submit_request,关键代码如下:

静态无效_h2_client_submit_request(h2_client_session_data *session_data){

int32_t stream_id;
h2_client_stream_data *stream_data = session_data->stream_data;
const char *uri = stream_data->uri;
const struct http_parser_url *u = stream_data->u;
char slen[10] = {0};
sprintf(slen, "%u", (unsigned int)strlen("{\"value\": \"my_password\"}"));

nghttp2_nv hdrs[] ={
                        MAKE_NV2(":method", "POST"),
                        MAKE_NV(":scheme", &uri[u->field_data[UF_SCHEMA].off], u->field_data[UF_SCHEMA].len),
                        MAKE_NV(":authority", stream_data->authority, stream_data->authoritylen),
                        MAKE_NV(":path", stream_data->path, stream_data->pathlen),
                        MAKE_NV2("Content-Length", slen),
                        MAKE_NV("content-type", HTTP_CONTENT_TYPE_JSON, sizeof(HTTP_CONTENT_TYPE_JSON))
                    };
nghttp2_data_provider data_prd;
data_prd.source.fd = 0;
data_prd.source.ptr = NULL;
data_prd.read_callback = data_prd_read_callback;
log_debug(COMP_SERVICE_SEPP, "[nghttp2-client] Request headers:");
_h2_client_print_headers(stderr, hdrs, ARRLEN(hdrs));
stream_id = nghttp2_submit_request(session_data->session, NULL, hdrs, ARRLEN(hdrs), &data_prd, stream_data);
if (stream_id < 0)
{
    log_error(COMP_SERVICE_SEPP, "[nghttp2-client] Could not submit HTTP request: %s", nghttp2_strerror(stream_id));
}

stream_data->stream_id = stream_id;

}

int send_len = 0; ssize_t data_prd_read_callback(nghttp2_session *session, int32_t stream_id, uint8_t *buf, size_t length, uint32_t *data_flags, nghttp2_data_source *source, void *user_data)

{

log_debug(COMP_SERVICE_SEPP, "[nghttp2-client] data post data, length[%zu] send_len[%d] flags[%d]", length, send_len, *data_flags);


if(send_len > 0)
{
    *data_flags |= NGHTTP2_DATA_FLAG_EOF;
    return send_len;
}

/* writting my opened audio file into buffer*/
int len = strlen("{\"value\": \"my_password\"}");
memcpy(buf, "{\"value\": \"my_password\"}", len); 

send_len += len;
log_debug(COMP_SERVICE_SEPP, "[nghttp2-client] stream_id:%d, len:%zu\r", stream_id, len);

return send_len;

}

标签: nghttp2

解决方案


推荐阅读