2017-07-17 10 views
7

मैं वर्तमान में nghttp2 उपयोग करने के लिए एक बहुखण्डीय संदेश का निर्माण करने की कोशिश कर रहा हूँ। संदेश निम्न के रूप में स्ट्रक्चर होना चाहिए।nghttp2 बहुखण्डीय पोस्ट संदेश

enter image description here

मैं nva मेरी HTTP/2 हेडर के रूप में, और अपने डेटा के लिए nghttp2_data_provider *data_prd साथ, nghttp2_submit_request(here) समारोह का उपयोग करना चाहिए। हालांकि, मैं अभी भी समझ नहीं पा रहा हूं कि मैं वास्तव में दो संदेश कैसे बना सकता हूं (दो संदेश शीर्षलेखों के साथ)।


अद्यतन:

यह मुझे का वर्णन करने के लिए मैं क्या मेरी स्रोत कोड में लगता था संभव है? कृपया नीचे देखे। यहाँ, मैं 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) मैं अपनी जेसन फ़ाइल के बाद इसे कैसे जोड़ूं।

उत्तर

0

एक बहु हिस्सा माइम हैडर आमतौर पर इस तरह परिभाषित किया गया है:

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

(इसके बजाय बाइनरी डेटा उपयोग मूल्य "बाइनरी" के लिए)।

सीमा आईडी पर्याप्त अद्वितीय किसी भी अन्य सामग्री का हिस्सा होने के जोखिम नहीं होना चाहिए। यह मुख्य हेडर में परिभाषित होने पर डबल-डैश का उपयोग नहीं करता है, लेकिन आपको इसे डबल-डैश के साथ प्रीपेड करने की आवश्यकता है, जहां यह एक विभाजक के रूप में कार्य करता है।

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 अप, मैं गलती से जब एक CRLF प्रतिनिधित्व को हटाने – K3N

+0

अपने जवाब के लिए धन्यवाद नष्ट कर दिया। 'Ssize_t data_prd_read_callback ( nghttp2_session * सत्र, int32_t stream_id, uint8_t * buf, size_t लंबाई, uint32_t * data_flags, nghttp2_data_source * स्रोत, शून्य * user_data) ', मेरे पास केवल एक बफर (' uint8_t * ') लिखने के लिए है पेलोड करने के लिए। क्या आप बस इस प्रारूप में सही लिखने का सुझाव दे रहे हैं (सही दूरी और नई लाइन के साथ), और उसके बाद ऑडियो फ़ाइल का पालन करें? – wrek

संबंधित मुद्दे