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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
#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,
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]); }
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); }
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; }