मैं वर्तमान में nghttp2
उपयोग करने के लिए एक बहुखण्डीय संदेश का निर्माण करने की कोशिश कर रहा हूँ। संदेश निम्न के रूप में स्ट्रक्चर होना चाहिए।nghttp2 बहुखण्डीय पोस्ट संदेश
मैं 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) मैं अपनी जेसन फ़ाइल के बाद इसे कैसे जोड़ूं।
खाली लाइन पिछले माइम भाग में शरीर से अलग करने के लिए शीर्ष लेख की जरूरत:
तो इस मामले में पूरा संदेश कुछ इस तरह दिखेगा। – Alex
@Alex अप, मैं गलती से जब एक CRLF प्रतिनिधित्व को हटाने – K3N
अपने जवाब के लिए धन्यवाद नष्ट कर दिया। '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