示例#1
0
void nghttp2_frame_unpack_goaway_payload(nghttp2_goaway *frame,
                                         const uint8_t *payload,
                                         size_t payloadlen)
{
  frame->last_stream_id = nghttp2_get_uint32(payload) & NGHTTP2_STREAM_ID_MASK;
  frame->error_code = nghttp2_get_uint32(payload+4);
  /* TODO Currently we don't buffer debug data */
  frame->opaque_data = NULL;
  frame->opaque_data_len = 0;
}
示例#2
0
void nghttp2_frame_unpack_window_update_payload(nghttp2_window_update *frame,
                                                const uint8_t *payload,
                                                size_t payloadlen)
{
  frame->window_size_increment = nghttp2_get_uint32(payload) &
    NGHTTP2_WINDOW_SIZE_INCREMENT_MASK;
}
示例#3
0
void nghttp2_frame_unpack_frame_hd(nghttp2_frame_hd *hd, const uint8_t* buf)
{
  hd->length = nghttp2_get_uint16(&buf[0]) & NGHTTP2_FRAME_LENGTH_MASK;
  hd->type = buf[2];
  hd->flags = buf[3];
  hd->stream_id = nghttp2_get_uint32(&buf[4]) & NGHTTP2_STREAM_ID_MASK;
}
示例#4
0
int nghttp2_frame_unpack_push_promise_payload(nghttp2_push_promise *frame,
                                              const uint8_t *payload,
                                              size_t payloadlen)
{
  frame->promised_stream_id = nghttp2_get_uint32(payload) &
    NGHTTP2_STREAM_ID_MASK;
  frame->nva = NULL;
  frame->nvlen = 0;
  return 0;
}
示例#5
0
int nghttp2_frame_unpack_settings_payload(nghttp2_settings_entry **iv_ptr,
                                          size_t *niv_ptr,
                                          const uint8_t *payload,
                                          size_t payloadlen)
{
  size_t i;
  *niv_ptr = payloadlen / 8;
  *iv_ptr = malloc((*niv_ptr)*sizeof(nghttp2_settings_entry));
  if(*iv_ptr == NULL) {
    return NGHTTP2_ERR_NOMEM;
  }
  for(i = 0; i < *niv_ptr; ++i) {
    size_t off = i*8;
    (*iv_ptr)[i].settings_id = nghttp2_get_uint32(&payload[off]) &
      NGHTTP2_SETTINGS_ID_MASK;
    (*iv_ptr)[i].value = nghttp2_get_uint32(&payload[4+off]);
  }
  return 0;
}
示例#6
0
int nghttp2_frame_unpack_rst_stream(nghttp2_rst_stream *frame,
                                    const uint8_t *head, size_t headlen,
                                    const uint8_t *payload, size_t payloadlen)
{
  if(payloadlen != 4) {
    return NGHTTP2_ERR_INVALID_FRAME;
  }
  nghttp2_frame_unpack_frame_hd(&frame->hd, head);
  frame->error_code = nghttp2_get_uint32(payload);
  return 0;
}
示例#7
0
int nghttp2_frame_unpack_priority(nghttp2_priority *frame,
                                  const uint8_t *head, size_t headlen,
                                  const uint8_t *payload, size_t payloadlen)
{
  if(payloadlen != 4) {
    return NGHTTP2_ERR_INVALID_FRAME;
  }
  nghttp2_frame_unpack_frame_hd(&frame->hd, head);
  frame->pri = nghttp2_get_uint32(payload) & NGHTTP2_PRIORITY_MASK;
  return 0;

}
示例#8
0
int nghttp2_frame_unpack_headers_payload(nghttp2_headers *frame,
                                         const uint8_t *payload,
                                         size_t payloadlen)
{
  if(frame->hd.flags & NGHTTP2_FLAG_PRIORITY) {
    frame->pri = nghttp2_get_uint32(payload) & NGHTTP2_PRIORITY_MASK;
  } else {
    frame->pri = NGHTTP2_PRI_DEFAULT;
  }
  frame->nva = NULL;
  frame->nvlen = 0;
  return 0;
}
示例#9
0
int nghttp2_frame_unpack_window_update(nghttp2_window_update *frame,
                                       const uint8_t *head, size_t headlen,
                                       const uint8_t *payload,
                                       size_t payloadlen)
{
  if(payloadlen != 4) {
    return NGHTTP2_ERR_INVALID_FRAME;
  }
  nghttp2_frame_unpack_frame_hd(&frame->hd, head);
  frame->window_size_increment = nghttp2_get_uint32(payload) &
    NGHTTP2_WINDOW_SIZE_INCREMENT_MASK;
  return 0;
}
示例#10
0
int nghttp2_frame_unpack_goaway(nghttp2_goaway *frame,
                                const uint8_t *head, size_t headlen,
                                const uint8_t *payload, size_t payloadlen)
{
  nghttp2_frame_unpack_frame_hd(&frame->hd, head);
  if(payloadlen < 8) {
    return NGHTTP2_ERR_INVALID_FRAME;
  }
  frame->last_stream_id = nghttp2_get_uint32(payload) & NGHTTP2_STREAM_ID_MASK;
  frame->error_code = nghttp2_get_uint32(payload+4);
  frame->opaque_data_len = payloadlen - 8;
  if(frame->opaque_data_len == 0) {
    frame->opaque_data = NULL;
  } else {
    frame->opaque_data = malloc(frame->opaque_data_len);
    if(frame->opaque_data == NULL) {
      return NGHTTP2_ERR_NOMEM;
    }
    memcpy(frame->opaque_data, &payload[8], frame->opaque_data_len);
  }
  return 0;
}
示例#11
0
int nghttp2_frame_unpack_push_promise_without_nv(nghttp2_push_promise *frame,
                                                 const uint8_t *head,
                                                 size_t headlen,
                                                 const uint8_t *payload,
                                                 size_t payloadlen)
{
  nghttp2_frame_unpack_frame_hd(&frame->hd, head);
  /* TODO Return error if header continuation is used for now */
  if((head[3] & NGHTTP2_FLAG_END_PUSH_PROMISE) == 0) {
    return NGHTTP2_ERR_PROTO;
  }
  if(payloadlen < 4) {
    return NGHTTP2_ERR_INVALID_FRAME;
  }
  frame->promised_stream_id = nghttp2_get_uint32(payload) &
    NGHTTP2_STREAM_ID_MASK;
  frame->nva = NULL;
  frame->nvlen = 0;
  return 0;
}
示例#12
0
int nghttp2_frame_unpack_headers_without_nv(nghttp2_headers *frame,
                                            const uint8_t *head,
                                            size_t headlen,
                                            const uint8_t *payload,
                                            size_t payloadlen)
{
  nghttp2_frame_unpack_frame_hd(&frame->hd, head);
  /* TODO Return error if header continuation is used for now */
  if((head[3] & NGHTTP2_FLAG_END_HEADERS) == 0) {
    return NGHTTP2_ERR_PROTO;
  }
  if(head[3] & NGHTTP2_FLAG_PRIORITY) {
    if(payloadlen < 4) {
      return NGHTTP2_ERR_INVALID_FRAME;
    }
    frame->pri = nghttp2_get_uint32(payload) & NGHTTP2_PRIORITY_MASK;
  } else {
    frame->pri = NGHTTP2_PRI_DEFAULT;
  }
  frame->nva = NULL;
  frame->nvlen = 0;
  return 0;
}
示例#13
0
#include "nghttp2_net.h"
#include "nghttp2_priority_spec.h"

void nghttp2_frame_pack_frame_hd(uint8_t *buf, const nghttp2_frame_hd *hd) {
  nghttp2_put_uint32be(&buf[0], (uint32_t)(hd->length << 8));
  buf[3] = hd->type;
  buf[4] = hd->flags;
  nghttp2_put_uint32be(&buf[5], (uint32_t)hd->stream_id);
  /* ignore hd->reserved for now */
}

void nghttp2_frame_unpack_frame_hd(nghttp2_frame_hd *hd, const uint8_t *buf) {
  hd->length = nghttp2_get_uint32(&buf[0]) >> 8;
  hd->type = buf[3];
  hd->flags = buf[4];
  hd->stream_id = nghttp2_get_uint32(&buf[5]) & NGHTTP2_STREAM_ID_MASK;
  hd->reserved = 0;
}

void nghttp2_frame_hd_init(nghttp2_frame_hd *hd, size_t length, uint8_t type,
                           uint8_t flags, int32_t stream_id) {
  hd->length = length;
  hd->type = type;
  hd->flags = flags;
  hd->stream_id = stream_id;
  hd->reserved = 0;
}

void nghttp2_frame_headers_init(nghttp2_headers *frame, uint8_t flags,
                                int32_t stream_id, nghttp2_headers_category cat,
                                const nghttp2_priority_spec *pri_spec,
示例#14
0
void nghttp2_frame_unpack_settings_entry(nghttp2_settings_entry *iv,
                                         const uint8_t *payload)
{
  iv->settings_id = payload[0];
  iv->value = nghttp2_get_uint32(&payload[1]);
}
示例#15
0
void nghttp2_frame_unpack_rst_stream_payload(nghttp2_rst_stream *frame,
                                             const uint8_t *payload,
                                             size_t payloadlen)
{
  frame->error_code = nghttp2_get_uint32(payload);
}
示例#16
0
void nghttp2_frame_unpack_priority_payload(nghttp2_priority *frame,
                                           const uint8_t *payload,
                                           size_t payloadlen)
{
  frame->pri = nghttp2_get_uint32(payload) & NGHTTP2_PRIORITY_MASK;
}