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); }
static void run_spdylay_session_recv(void) { spdylay_session *session; spdylay_session_callbacks callbacks; spdylay_zlib deflater; spdylay_frame frame; uint8_t *buf = NULL, *nvbuf = NULL; size_t buflen = 0, nvbuflen = 0; ssize_t framelen; const char *nv[] = { ":host", "example.org", ":scheme", "https", NULL }; spdylay_settings_entry iv[2]; spdylay_mem_chunk proof; spdylay_mem_chunk *certs; size_t ncerts; my_user_data ud; data_feed df; int rv; memset(&callbacks, 0, sizeof(spdylay_session_callbacks)); callbacks.recv_callback = data_feed_recv_callback; ud.df = &df; spdylay_failmalloc_pause(); spdylay_zlib_deflate_hd_init(&deflater, SPDYLAY_PROTO_SPDY3); spdylay_session_server_new(&session, SPDYLAY_PROTO_SPDY3, &callbacks, &ud); spdylay_failmalloc_unpause(); /* SYN_STREAM */ spdylay_failmalloc_pause(); spdylay_frame_syn_stream_init(&frame.syn_stream, SPDYLAY_PROTO_SPDY3, SPDYLAY_CTRL_FLAG_FIN, 1, 0, 2, spdylay_frame_nv_copy(nv)); framelen = spdylay_frame_pack_syn_stream(&buf, &buflen, &nvbuf, &nvbuflen, &frame.syn_stream, &deflater); spdylay_frame_syn_stream_free(&frame.syn_stream); data_feed_init(&df, buf, framelen); spdylay_failmalloc_unpause(); rv = spdylay_session_recv(session); if(rv != 0) { goto fail; } /* PING */ spdylay_failmalloc_pause(); spdylay_frame_ping_init(&frame.ping, SPDYLAY_PROTO_SPDY3, 1); framelen = spdylay_frame_pack_ping(&buf, &buflen, &frame.ping); spdylay_frame_ping_free(&frame.ping); data_feed_init(&df, buf, framelen); spdylay_failmalloc_unpause(); rv = spdylay_session_recv(session); if(rv != 0) { goto fail; } /* RST_STREAM */ spdylay_failmalloc_pause(); spdylay_frame_rst_stream_init(&frame.rst_stream, SPDYLAY_PROTO_SPDY3, 1, SPDYLAY_PROTOCOL_ERROR); framelen = spdylay_frame_pack_rst_stream(&buf, &buflen, &frame.rst_stream); spdylay_frame_rst_stream_free(&frame.rst_stream); spdylay_failmalloc_unpause(); rv = spdylay_session_recv(session); if(rv != 0) { goto fail; } /* SETTINGS */ spdylay_failmalloc_pause(); iv[0].settings_id = SPDYLAY_SETTINGS_UPLOAD_BANDWIDTH; iv[0].flags = SPDYLAY_ID_FLAG_SETTINGS_PERSIST_VALUE; iv[0].value = 256; iv[1].settings_id = SPDYLAY_SETTINGS_MAX_CONCURRENT_STREAMS; iv[1].flags = SPDYLAY_ID_FLAG_SETTINGS_NONE; iv[1].value = 100; spdylay_frame_settings_init(&frame.settings, SPDYLAY_PROTO_SPDY3, SPDYLAY_FLAG_SETTINGS_CLEAR_SETTINGS, spdylay_frame_iv_copy(iv, 2), 2); framelen = spdylay_frame_pack_settings(&buf, &buflen, &frame.settings); spdylay_frame_settings_free(&frame.settings); spdylay_failmalloc_unpause(); rv = spdylay_session_recv(session); if(rv != 0) { goto fail; } /* CREDENTIAL */ spdylay_failmalloc_pause(); proof.data = (uint8_t*)strcopy("PROOF"); proof.length = strlen("PROOF"); ncerts = 2; certs = malloc(sizeof(spdylay_mem_chunk)*ncerts); certs[0].data = (uint8_t*)strcopy("CERT0"); certs[0].length = strlen("CERT0"); certs[1].data = (uint8_t*)strcopy("CERT1"); certs[1].length = strlen("CERT1"); spdylay_frame_credential_init(&frame.credential, SPDYLAY_PROTO_SPDY3, 1, &proof, certs, ncerts); framelen = spdylay_frame_pack_credential(&buf, &buflen, &frame.credential); spdylay_frame_credential_free(&frame.credential); spdylay_failmalloc_unpause(); rv = spdylay_session_recv(session); if(rv != 0) { goto fail; } fail: free(buf); free(nvbuf); spdylay_session_del(session); spdylay_zlib_deflate_free(&deflater); }
static int spdylay_submit_syn_stream_shared (spdylay_session *session, uint8_t flags, int32_t assoc_stream_id, uint8_t pri, const char **nv, const spdylay_data_provider *data_prd, void *stream_user_data) { int r; spdylay_frame *frame; char **nv_copy; uint8_t flags_copy; spdylay_data_provider *data_prd_copy = NULL; spdylay_syn_stream_aux_data *aux_data; if(pri > spdylay_session_get_pri_lowest(session)) { return SPDYLAY_ERR_INVALID_ARGUMENT; } if(assoc_stream_id != 0) { if(session->server == 0) { assoc_stream_id = 0; } else if(spdylay_session_is_my_stream_id(session, assoc_stream_id)) { return SPDYLAY_ERR_INVALID_ARGUMENT; } } if(!spdylay_frame_nv_check_null(nv)) { return SPDYLAY_ERR_INVALID_ARGUMENT; } if(data_prd != NULL && data_prd->read_callback != NULL) { data_prd_copy = malloc(sizeof(spdylay_data_provider)); if(data_prd_copy == NULL) { return SPDYLAY_ERR_NOMEM; } *data_prd_copy = *data_prd; } aux_data = malloc(sizeof(spdylay_syn_stream_aux_data)); if(aux_data == NULL) { free(data_prd_copy); return SPDYLAY_ERR_NOMEM; } aux_data->data_prd = data_prd_copy; aux_data->stream_user_data = stream_user_data; frame = malloc(sizeof(spdylay_frame)); if(frame == NULL) { free(aux_data); free(data_prd_copy); return SPDYLAY_ERR_NOMEM; } nv_copy = spdylay_frame_nv_norm_copy(nv); if(nv_copy == NULL) { free(frame); free(aux_data); free(data_prd_copy); return SPDYLAY_ERR_NOMEM; } flags_copy = 0; if(flags & SPDYLAY_CTRL_FLAG_FIN) { flags_copy |= SPDYLAY_CTRL_FLAG_FIN; } if(flags & SPDYLAY_CTRL_FLAG_UNIDIRECTIONAL) { flags_copy |= SPDYLAY_CTRL_FLAG_UNIDIRECTIONAL; } spdylay_frame_syn_stream_init(&frame->syn_stream, session->version, flags_copy, 0, assoc_stream_id, pri, nv_copy); r = spdylay_session_add_frame(session, SPDYLAY_CTRL, frame, aux_data); if(r != 0) { spdylay_frame_syn_stream_free(&frame->syn_stream); free(frame); free(aux_data); free(data_prd_copy); } return r; }