2017-07-17 21 views
7

現在、マルチパートメッセージを作成するのにnghttp2を使用しようとしています。メッセージは次のようにstrcutureでなければなりません。nghttp2マルチパートPOSTメッセージ

enter image description here

私は私のデータのための私のHTTP/2ヘッダとしてnva、及びnghttp2_data_provider *data_prdと、nghttp2_submit_request(here)関数を使用する必要があります。しかし、私はまだ正確に2つのメッセージ(2つのメッセージヘッダー)を作成することができます理解していない。


更新:

それは私が私が私のソースコードに考えていたかを説明することは可能ですか?下記を参照してください。ここでは、nghttp2_data_providerを使用してオーディオファイルを開き、バッファに書き込みます。私を混同しては何

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; 
} 

は 1)どのように私はオーディオに(メッセージヘッダは、より具体的には)ヘッダーを追加します。 2)Jsonファイルの後ろにどのように追加しますか?

答えて

0

マルチパートMIMEヘッダは、通常のように定義される:

-----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 

Ref 1

コンテンツを使用すると、固定された線の長さを有するusually encode it as base-64(あなたすぎるバイナリデータを送信することができるであろうバイナリである場合最後の改行などの余分な空白については予防措置を講じる必要があります)。これを知らせるヘッダフィールド名を含めることができる。

Content-Transfer-Encoding: Base64 

(代わりにバイナリデータの使用値の「バイナリ」)。

境界IDは、他のコンテンツの一部にならないように一意である必要があります。メインヘッダーで定義されているときは二重ダッシュは使用しませんが、セパレータとして動作するたびに二重ダッシュを前置する必要があります。最後のMIME部分に本体からヘッダーを分離するのに必要な

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 
+0

空行:

したがって、この場合にはメッセージ全体は次のようになります。 – Alex

+0

@Alex ups、私は間違ってCRLF表現を削除すると削除されました – K3N

+0

あなたの答えをありがとう。 'ssize_t data_prd_read_callback( nghttp2_session *セッション、int32_t stream_id、uint8_t * buf、size_t length、 uint32_t * data_flags、nghttp2_data_source * source、void * user_data)'から、バッファ( 'uint8_t *')を使ってmyペイロードへ。あなたは、この形式で正しい文字列と改行を使ってcharを書いてから、オーディオファイルをフォローすることを提案していますか? – wrek

関連する問題