Beispiel #1
0
int spdylay_submit_syn_reply(spdylay_session *session, uint8_t flags,
                             int32_t stream_id, const char **nv)
{
    int r;
    spdylay_frame *frame;
    char **nv_copy;
    uint8_t flags_copy;
    if(!spdylay_frame_nv_check_null(nv)) {
        return SPDYLAY_ERR_INVALID_ARGUMENT;
    }
    frame = malloc(sizeof(spdylay_frame));
    if(frame == NULL) {
        return SPDYLAY_ERR_NOMEM;
    }
    nv_copy = spdylay_frame_nv_norm_copy(nv);
    if(nv_copy == NULL) {
        free(frame);
        return SPDYLAY_ERR_NOMEM;
    }
    flags_copy = 0;
    if(flags & SPDYLAY_CTRL_FLAG_FIN) {
        flags_copy |= SPDYLAY_CTRL_FLAG_FIN;
    }
    spdylay_frame_syn_reply_init(&frame->syn_reply, session->version, flags_copy,
                                 stream_id, nv_copy);
    r = spdylay_session_add_frame(session, SPDYLAY_CTRL, frame, NULL);
    if(r != 0) {
        spdylay_frame_syn_reply_free(&frame->syn_reply);
        free(frame);
    }
    return r;
}
void spdylay_outbound_item_free(spdylay_outbound_item *item)
{
  if(item == NULL) {
    return;
  }
  if(item->frame_cat == SPDYLAY_CTRL) {
    spdylay_frame_type frame_type;
    spdylay_frame *frame;
    frame_type = spdylay_outbound_item_get_ctrl_frame_type(item);
    frame = spdylay_outbound_item_get_ctrl_frame(item);
    switch(frame_type) {
    case SPDYLAY_SYN_STREAM:
      spdylay_frame_syn_stream_free(&frame->syn_stream);
      free(((spdylay_syn_stream_aux_data*)item->aux_data)->data_prd);
      break;
    case SPDYLAY_SYN_REPLY:
      spdylay_frame_syn_reply_free(&frame->syn_reply);
      break;
    case SPDYLAY_RST_STREAM:
      spdylay_frame_rst_stream_free(&frame->rst_stream);
      break;
    case SPDYLAY_SETTINGS:
      spdylay_frame_settings_free(&frame->settings);
      break;
    case SPDYLAY_NOOP:
      /* We don't have any public API to add NOOP, so here is
         unreachable. */
      assert(0);
    case SPDYLAY_PING:
      spdylay_frame_ping_free(&frame->ping);
      break;
    case SPDYLAY_GOAWAY:
      spdylay_frame_goaway_free(&frame->goaway);
      break;
    case SPDYLAY_HEADERS:
      spdylay_frame_headers_free(&frame->headers);
      break;
    case SPDYLAY_WINDOW_UPDATE:
      spdylay_frame_window_update_free(&frame->window_update);
      break;
    case SPDYLAY_CREDENTIAL:
      assert(0);
      break;
    }
  } else if(item->frame_cat == SPDYLAY_DATA) {
    spdylay_data *data_frame;
    data_frame = spdylay_outbound_item_get_data_frame(item);
    spdylay_frame_data_free(data_frame);
  } else {
    /* Unreachable */
    assert(0);
  }
  free(item->frame);
  free(item->aux_data);
}
Beispiel #3
0
int spdylay_submit_response(spdylay_session *session,
                            int32_t stream_id, const char **nv,
                            const spdylay_data_provider *data_prd)
{
    int r;
    spdylay_frame *frame;
    char **nv_copy;
    uint8_t flags = 0;
    spdylay_data_provider *data_prd_copy = NULL;
    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;
    }
    frame = malloc(sizeof(spdylay_frame));
    if(frame == NULL) {
        free(data_prd_copy);
        return SPDYLAY_ERR_NOMEM;
    }
    nv_copy = spdylay_frame_nv_norm_copy(nv);
    if(nv_copy == NULL) {
        free(frame);
        free(data_prd_copy);
        return SPDYLAY_ERR_NOMEM;
    }
    if(data_prd_copy == NULL) {
        flags |= SPDYLAY_CTRL_FLAG_FIN;
    }
    spdylay_frame_syn_reply_init(&frame->syn_reply, session->version, flags,
                                 stream_id, nv_copy);
    r = spdylay_session_add_frame(session, SPDYLAY_CTRL, frame,
                                  data_prd_copy);
    if(r != 0) {
        spdylay_frame_syn_reply_free(&frame->syn_reply);
        free(frame);
        free(data_prd_copy);
    }
    return r;
}
void spdylay_outbound_item_free(spdylay_outbound_item *item)
{
  if(item == NULL) {
    return;
  }
  switch(item->frame_type) {
  case SPDYLAY_SYN_STREAM:
    spdylay_frame_syn_stream_free(&item->frame->syn_stream);
    free(((spdylay_syn_stream_aux_data*)item->aux_data)->data_prd);
    break;
  case SPDYLAY_SYN_REPLY:
    spdylay_frame_syn_reply_free(&item->frame->syn_reply);
    break;
  case SPDYLAY_RST_STREAM:
    spdylay_frame_rst_stream_free(&item->frame->rst_stream);
    break;
  case SPDYLAY_SETTINGS:
    spdylay_frame_settings_free(&item->frame->settings);
    break;
  case SPDYLAY_NOOP:
    /* We don't have any public API to add NOOP, so here is
       unreachable. */
    abort();
  case SPDYLAY_PING:
    spdylay_frame_ping_free(&item->frame->ping);
    break;
  case SPDYLAY_GOAWAY:
    spdylay_frame_goaway_free(&item->frame->goaway);
    break;
  case SPDYLAY_HEADERS:
    spdylay_frame_headers_free(&item->frame->headers);
    break;
  case SPDYLAY_WINDOW_UPDATE:
    spdylay_frame_window_update_free(&item->frame->window_update);
    break;
  case SPDYLAY_DATA:
    spdylay_frame_data_free(&item->frame->data);
    break;
  }
  free(item->frame);
  free(item->aux_data);
}