Esempio n. 1
0
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);
}
Esempio n. 2
0
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;
}