首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nghttp2多部分POST消息

nghttp2多部分POST消息
EN

Stack Overflow用户
提问于 2017-07-17 21:53:17
回答 1查看 1.8K关注 0票数 8

我目前正在尝试使用nghttp2构建一个多部分消息。该消息应该是如下结构的。

我应该使用nghttp2_submit_request(在这里)函数,nva作为我的HTTP/2报头,而nghttp2_data_provider *data_prd作为我的数据。但是,我仍然不明白如何才能准确地创建两条消息(带有两个消息头)。

更新:

我能描述一下我在源代码中的想法吗?请看下面的内容。在这里,我使用nghttp2_data_provider打开一个音频文件,并写入缓冲区。

代码语言:javascript
复制
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) 
{

  printf("[INFO] C ----------------------------> S (DATA post body), length:%zu\n", length);

  int fd = source->fd;
  ssize_t r;
// writting my opened audio file into buffer
  while ((r = read(fd, buf, length)) == -1 && errno == EINTR); 
  printf("stream_id:%d, nread:%zu\r\n", stream_id, r);
  return nread;
}



void submit_postAudio(http2_session_data *session_data) {
  int32_t stream_id;
  http2_stream_data *stream_data = session_data->stream_data[STREAM_ID_REQUESTAUDIO];
  const char *uri = stream_data->uri;
  const struct http_parser_url *u = stream_data->u;
  char byLength = 0;

  const nghttp2_nv hdrs[] = {
  MAKE_NV(":method", "POST"),   MAKE_NV_CS(":path", stream_data->path),
  MAKE_NV(":scheme", "https"), MAKE_NV("accept", "*/*"),    
  MAKE_NV_CS("authorization", stream_data->access_token),
  MAKE_NV("content-type", "multipart/form-data; boundary=abcdefg123")
  };

  fprintf(stderr, "Request headers:\n");
  print_headers(stderr, hdrs, ARRLEN(hdrs));

  int fileDescriptor = open ("/my_audio.wmv", O_APPEND);  // open my audio file 
  nghttp2_data_provider data_prd;
  data_prd.source.fd = fileDescriptor   // set the file descriptor 
  data_prd.source.ptr = NULL;
  data_prd.read_callback = data_prd_read_callback;

  stream_id = nghttp2_submit_request(session_data->session, NULL, hdrs,
                                     ARRLEN(hdrs), &data_prd, stream_data);
  if (stream_id < 0) {
    errx(1, "Could not submit HTTP request: %s", nghttp2_strerror(stream_id));
  }

  stream_data->stream_id = stream_id;
}

令我困惑的是,如何在音频中添加标题(消息头更具体)。2)如何将其追加到Json文件之后。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-19 23:46:28

多部分mime标头通常定义如下:

代码语言:javascript
复制
-----boundary_id
name: value  # header stuff here, ie. "name: value" per line. No spaces in name, all ASCII
CRLF         # End of header is defined with an extra linefeed, AKA a "null line", see ref 1.

content here, ends at next boundary id

-----boundary_id

参1

如果内容是二进制的,您将使用固定行长的通常将其编码为base-64 (您也可以发送二进制数据,但必须注意额外的空白,如最后的行提要)。可以包括一个标头字段名,说明这一点:

代码语言:javascript
复制
Content-Transfer-Encoding: Base64

(对于二进制数据,使用值“二进制”代替)。

边界标识必须是唯一的,以避免成为任何其他内容的一部分。当在主标题中定义时,它不使用双破折号,但是您需要在任何地方使用这样的双破折号作为分隔符。

因此,在这种情况下,整个消息应该如下所示:

代码语言:javascript
复制
name1: value1
name2: value2
name3: value3
x-comment: "as required by the specs (ignore this line)"
content-type: multipart/form-data; boundary: my_unique_boundary_id

--my_unique_boundary_id
Content-Disposition: form-data; name="metadata"
Content-Type: application/json; charset=UTF-08

{JSON data here}

--my_unique_boundary_id
Content-Disposition: form-data; name="audio"
Content-Type: application/octet-stream
Content-Transfer-Encoding: Base64
x-comment: "binary audio encoded as base-64 follows next"

UklGRuKlAABXQVZFZm10ICgAAAABAAEARKwAAIhYAQACABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAc2NvdLQBAAAAAAAAVGhlIFJoeXRobSBNYWNoaW5lICAgICAgICAgICAgICAgICAgICAgICAg
IFRSTTEAICA6MDAAAAAAAAAvADAwMDAwMDAwMDAwMAAAALkBTQABAAAAJQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKYXNvbiBE
b25uZWxseSAoYWthIGRqIHB1enpsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIDAwQwAAAAAAADEyMTMwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
... etc.

--my_unique_boundary_id
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45154246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档