static void run_spdylay_frame_pack_syn_stream(void) { spdylay_zlib deflater, inflater; spdylay_frame frame, oframe; uint8_t *buf = NULL, *nvbuf = NULL; size_t buflen = 0, nvbuflen = 0; spdylay_buffer inflatebuf; ssize_t framelen; const char *nv[] = { ":host", "example.org", ":scheme", "https", NULL }; char **nv_copy; int rv; spdylay_buffer_init(&inflatebuf, 4096); rv = spdylay_zlib_deflate_hd_init(&deflater, SPDYLAY_PROTO_SPDY3); if(rv != 0) { goto deflate_init_fail; } rv = spdylay_zlib_inflate_hd_init(&inflater, SPDYLAY_PROTO_SPDY3); if(rv != 0) { goto inflate_init_fail; } nv_copy = spdylay_frame_nv_copy(nv); if(nv_copy == NULL) { goto nv_copy_fail; } spdylay_frame_syn_stream_init(&frame.syn_stream, SPDYLAY_PROTO_SPDY3, SPDYLAY_CTRL_FLAG_FIN, 1, 0, 2, nv_copy); framelen = spdylay_frame_pack_syn_stream(&buf, &buflen, &nvbuf, &nvbuflen, &frame.syn_stream, &deflater); if(framelen < 0) { goto fail; } rv = unpack_frame_with_nv_block(SPDYLAY_SYN_STREAM, SPDYLAY_PROTO_SPDY3, &oframe, &inflater, buf, framelen); if(rv != 0) { goto fail; } spdylay_frame_syn_stream_free(&oframe.syn_stream); fail: free(buf); free(nvbuf); spdylay_frame_syn_stream_free(&frame.syn_stream); nv_copy_fail: spdylay_zlib_inflate_free(&inflater); inflate_init_fail: spdylay_zlib_deflate_free(&deflater); deflate_init_fail: spdylay_buffer_free(&inflatebuf); }
ssize_t unpack_frame_with_nv_block(spdylay_frame_type type, uint16_t version, spdylay_frame *frame, spdylay_zlib *inflater, const uint8_t *in, size_t len) { spdylay_buffer buffer; ssize_t rv; ssize_t pnvlen; pnvlen = spdylay_frame_nv_offset(type, version) - SPDYLAY_HEAD_LEN; assert(pnvlen > 0); spdylay_buffer_init(&buffer, 4096); rv = spdylay_zlib_inflate_hd(inflater, &buffer, &in[SPDYLAY_HEAD_LEN + pnvlen], len - SPDYLAY_HEAD_LEN - pnvlen); CU_ASSERT(rv >= 0); switch(type) { case SPDYLAY_SYN_STREAM: rv = spdylay_frame_unpack_syn_stream(&frame->syn_stream, &in[0], SPDYLAY_HEAD_LEN, &in[SPDYLAY_HEAD_LEN], pnvlen, &buffer); break; case SPDYLAY_SYN_REPLY: rv = spdylay_frame_unpack_syn_reply(&frame->syn_reply, &in[0], SPDYLAY_HEAD_LEN, &in[SPDYLAY_HEAD_LEN], pnvlen, &buffer); break; case SPDYLAY_HEADERS: rv = spdylay_frame_unpack_headers(&frame->headers, &in[0], SPDYLAY_HEAD_LEN, &in[SPDYLAY_HEAD_LEN], pnvlen, &buffer); break; default: /* Must not be reachable */ assert(0); } spdylay_buffer_free(&buffer); return rv; }