46 size_t name_value_strm_size = 0;
47 unsigned int compressed_data_size;
49 void *name_value_strm =
NULL;
50 struct SPDYF_Control_Frame *frame;
55 "the function is called wrong");
62 if(0 == frame->length)
96 compressed_data_size = frame->length
105 if(compressed_data_size > 0
108 compressed_data_size,
110 &name_value_strm_size))
117 free(name_value_strm);
129 if(0 == name_value_strm_size || 0 == compressed_data_size)
145 free(name_value_strm);
154 free(name_value_strm);
159 free(name_value_strm);
181 struct SPDYF_Control_Frame *frame;
182 uint32_t last_good_stream_id;
187 "the function is called wrong");
198 if(0 != frame->flags || 8 != frame->length)
215 if(8 == frame->length)
218 last_good_stream_id =
NTOH31(last_good_stream_id);
222 status = ntohl(status_int);
260 struct SPDYF_Control_Frame *frame;
267 "the function is called wrong");
271 if(0 != frame->flags || 8 != frame->length)
288 stream_id =
NTOH31(stream_id);
300 while(
NULL != stream)
308 stream = stream->
next;
333 struct SPDYF_Data_Frame * frame;
338 "the function is called wrong");
368 SPDYF_DEBUG(
"No callback for DATA frame set; Ignoring DATA frame!");
424 struct SPDYF_Control_Frame control_frame;
425 void *compressed_headers =
NULL;
426 size_t compressed_headers_size=0;
429 uint32_t stream_id_nbo;
433 memcpy(&control_frame, response_queue->
control_frame,
sizeof(control_frame));
436 response_queue->
data,
440 &compressed_headers_size))
449 free(compressed_headers);
457 total_size =
sizeof(
struct SPDYF_Control_Frame)
459 + compressed_headers_size;
469 free(compressed_headers);
477 control_frame.length = compressed_headers_size + 4;
504 free(compressed_headers);
518 struct SPDYF_Control_Frame control_frame;
520 int last_good_stream_id;
524 memcpy(&control_frame, response_queue->
control_frame,
sizeof(control_frame));
528 total_size =
sizeof(
struct SPDYF_Control_Frame)
540 control_frame.length = 8;
573 struct SPDYF_Data_Frame data_frame;
579 memcpy(&data_frame, response_queue->
data_frame,
sizeof(data_frame));
586 total_size =
sizeof(
struct SPDYF_Data_Frame)
587 + response_queue->data_size;
597 data_frame.length = response_queue->data_size;
614 total_size =
sizeof(
struct SPDYF_Data_Frame)
615 + SPDY_MAX_SUPPORTED_FRAME_SIZE;
626 session->
write_buffer +
sizeof(
struct SPDYF_Data_Frame),
681 response_queue->
frqcb,
683 response_queue->
rrcb,
696 new_response_queue->
prev = response_queue;
697 new_response_queue->
next = response_queue->
next;
704 response_queue->
next->
prev = new_response_queue;
706 response_queue->
next = new_response_queue;
718 data_frame.length = ret;
724 sizeof(
struct SPDYF_Data_Frame));
743 struct SPDYF_Control_Frame control_frame;
748 memcpy(&control_frame, response_queue->
control_frame,
sizeof(control_frame));
750 total_size =
sizeof(
struct SPDYF_Control_Frame)
762 control_frame.length = 8;
788 struct SPDYF_Control_Frame control_frame;
793 memcpy(&control_frame, response_queue->
control_frame,
sizeof(control_frame));
795 total_size =
sizeof(
struct SPDYF_Control_Frame)
807 control_frame.length = 8;
830 struct SPDYF_Control_Frame *frame;
834 "the function is called wrong");
868 size_t actual_buf_size;
888 if(actual_buf_size <
sizeof(
struct SPDYF_Control_Frame))
898 "no frame for session");
940 bytes_read = session->
fio_recv(session,
1006 while(
NULL != response_queue)
1078 bytes_written = session->
fio_send(session,
1082 switch(bytes_written)
1155 size_t read_buffer_beginning;
1156 size_t frame_length;
1157 struct SPDYF_Control_Frame* control_frame;
1158 struct SPDYF_Data_Frame *data_frame;
1179 <
sizeof(
struct SPDYF_Control_Frame))
1188 if(
NULL == (control_frame = malloc(
sizeof(
struct SPDYF_Control_Frame))))
1195 memcpy(control_frame,
1197 sizeof(
struct SPDYF_Control_Frame));
1203 switch(control_frame->type){
1223 if(
NULL == (data_frame = malloc(
sizeof(
struct SPDYF_Data_Frame))))
1232 sizeof(
struct SPDYF_Data_Frame));
1243 SPDYF_DEBUG(
"another protocol or version received!");
1277 frame_length = ((
struct SPDYF_Control_Frame *)session->
frame_handler_cls)->length;
1286 SPDYF_DEBUG(
"received frame with unsupported size: %zu", frame_length);
1292 + read_buffer_beginning
1320 "Session is in wrong state");
1393 struct sockaddr *addr;
1396 struct sockaddr_in6 addr6;
1398 addr = (
struct sockaddr *)&addr6;
1399 addr_len =
sizeof(addr6);
1401 struct sockaddr_in addr4;
1403 addr = (
struct sockaddr *)&addr4;
1404 addr_len =
sizeof(addr6);
1407 new_socket_fd = accept (daemon->
socket_fd, addr, &addr_len);
1409 if(new_socket_fd < 1)
1418 session->
daemon = daemon;
1440 if (
NULL == (session->
addr = malloc (addr_len)))
1445 memcpy (session->
addr, addr, addr_len);
1476 shutdown (new_socket_fd, SHUT_RDWR);
1477 (void)close (new_socket_fd);
1482 free (session->
addr);
1494 int consider_priority)
1501 "called with consider_priority but no stream provided");
1503 last = response_to_queue;
1509 if(
SPDY_NO == consider_priority)
1520 else if(-1 == consider_priority)
1558 response_to_queue->
prev = pos;
1559 pos->
next = response_to_queue;
1564 response_to_queue->
prev = pos;
1566 pos->
next = response_to_queue;
1607 free(session->
addr);
1620 struct SPDYF_Control_Frame *control_frame;
1629 if(
NULL == (control_frame = malloc(
sizeof(
struct SPDYF_Control_Frame))))
1631 free(response_to_queue);
1634 memset(control_frame, 0,
sizeof(
struct SPDYF_Control_Frame));
1636 if(
NULL == (data = malloc(4)))
1638 free(control_frame);
1639 free(response_to_queue);
1642 *(data) = htonl(status);
1644 control_frame->control_bit = 1;
1647 control_frame->flags = 0;
1651 response_to_queue->
data = data;
1668 struct SPDYF_Control_Frame *control_frame;
1683 if(
NULL == (control_frame = malloc(
sizeof(
struct SPDYF_Control_Frame))))
1685 free(response_to_queue);
1688 memset(control_frame, 0,
sizeof(
struct SPDYF_Control_Frame));
1690 if(
NULL == (data = malloc(8)))
1692 free(control_frame);
1693 free(response_to_queue);
1696 *(data) =
HTON31(stream_id);
1697 *(data + 1) = htonl(status);
1699 control_frame->control_bit = 1;
1702 control_frame->flags = 0;
1706 response_to_queue->
data = data;
1708 response_to_queue->
stream = stream;
1721 int32_t delta_window_size)
1724 struct SPDYF_Control_Frame *control_frame;
1735 if(
NULL == (control_frame = malloc(
sizeof(
struct SPDYF_Control_Frame))))
1737 free(response_to_queue);
1740 memset(control_frame, 0,
sizeof(
struct SPDYF_Control_Frame));
1742 if(
NULL == (data = malloc(8)))
1744 free(control_frame);
1745 free(response_to_queue);
1749 *(data + 1) =
HTON31(delta_window_size);
1751 control_frame->control_bit = 1;
1754 control_frame->flags = 0;
1758 response_to_queue->
data = data;
1760 response_to_queue->
stream = stream;
struct SPDYF_Response_Queue * SPDYF_response_queue_create(bool is_data, void *data, size_t data_size, struct SPDY_Response *response, struct SPDYF_Stream *stream, bool closestream, SPDYF_ResponseQueueResultCallback frqcb, void *frqcb_cls, SPDY_ResponseResultCallback rrcb, void *rrcb_cls)
int SPDYF_zlib_deflate(z_stream *strm, const void *src, size_t src_size, size_t *data_used, void **dest, size_t *dest_size)
SPDY_NewSessionCallback new_session_cb
#define SPDYF_CONTROL_FRAME_NTOH(frame)
#define SPDYF_DATA_FRAME_NTOH(frame)
static void spdyf_handler_read_goaway(struct SPDY_Session *session)
static void spdyf_handler_read_data(struct SPDY_Session *session)
void SPDYF_zlib_deflate_end(z_stream *strm)
struct SPDYF_Response_Queue * response_queue_tail
struct SPDYF_Stream * streams_head
z_stream zlib_recv_stream
int SPDYF_zlib_inflate(z_stream *strm, const void *src, size_t src_size, void **dest, size_t *dest_size)
void SPDYF_stream_destroy(struct SPDYF_Stream *stream)
struct SPDY_Daemon * daemon
int SPDYF_handler_write_goaway(struct SPDY_Session *session)
unsigned long long session_timeout
uint32_t current_stream_id
#define DLL_remove(head, tail, element)
int SPDYF_name_value_from_stream(void *stream, size_t size, struct SPDY_NameValue **container)
int SPDYF_session_read(struct SPDY_Session *session)
struct SPDYF_Response_Queue * response_queue_head
#define SPDYF_INITIAL_WINDOW_SIZE
SPDYF_IOCloseSession fio_close_session
SPDYF_IONewSession fio_new_session
int SPDYF_prepare_goaway(struct SPDY_Session *session, enum SPDY_GOAWAY_STATUS status, bool in_front)
uint32_t last_replied_to_stream_id
struct SPDYF_Control_Frame * control_frame
TCP connection/SPDY session handling.
size_t write_buffer_beginning
int SPDYF_handler_write_data(struct SPDY_Session *session)
void SPDYF_response_queue_destroy(struct SPDYF_Response_Queue *response_queue)
static void spdyf_handler_read_syn_stream(struct SPDY_Session *session)
int SPDYF_prepare_window_update(struct SPDY_Session *session, struct SPDYF_Stream *stream, int32_t delta_window_size)
void(* frame_handler)(struct SPDY_Session *session)
int(* process_response_handler)(struct SPDY_Session *session)
internal functions and macros for the framing layer
SPDY_SessionClosedCallback session_closed_cb
unsigned long long last_activity
void SPDYF_queue_response(struct SPDYF_Response_Queue *response_to_queue, struct SPDY_Session *session, int consider_priority)
internal and public structures – most of the structs used by the library are defined here ...
Signatures for IO functions.
struct SPDYF_Response_Queue * prev
enum SPDY_IO_SUBSYSTEM io_subsystem
int SPDYF_prepare_rst_stream(struct SPDY_Session *session, struct SPDYF_Stream *stream, enum SPDY_RST_STREAM_STATUS status)
SPDYF_ResponseQueueResultCallback frqcb
#define SPDY_MAX_SUPPORTED_FRAME_SIZE
SPDY_ResponseCallback rcb
#define SPDYF_CONTROL_FRAME_HTON(frame)
void SPDYF_session_close(struct SPDY_Session *session)
struct SPDY_Session * cleanup_head
unsigned long long SPDYF_monotonic_time(void)
int SPDYF_session_write(struct SPDY_Session *session, bool only_one_frame)
#define SPDYF_BUFFER_SIZE
struct SPDYF_Stream * next
void SPDYF_session_destroy(struct SPDY_Session *session)
int SPDYF_io_set_session(struct SPDY_Session *session, enum SPDY_IO_SUBSYSTEM io_subsystem)
struct SPDY_Session * sessions_head
#define SPDYF_DEBUG(fmt,...)
SPDYF_IOAfterWrite fio_after_write
void SPDYF_stream_set_flags_on_write(struct SPDYF_Response_Queue *response_queue)
struct SPDYF_Data_Frame * data_frame
SPDYF_NewStreamCallback fnew_stream_cb
size_t read_buffer_beginning
enum SPDY_SESSION_STATUS status
#define SPDYF_ASSERT(expr, msg)
struct SPDY_Session * cleanup_tail
size_t write_buffer_offset
void SPDYF_handler_ignore_frame(struct SPDY_Session *session)
int SPDYF_session_accept(struct SPDY_Daemon *daemon)
int SPDYF_handler_write_window_update(struct SPDY_Session *session)
struct SPDYF_Stream * SPDYF_stream_find(uint32_t stream_id, struct SPDY_Session *session)
static void spdyf_handler_read_rst_stream(struct SPDY_Session *session)
struct SPDY_NameValue * headers
SPDY_ResponseResultCallback rrcb
#define DLL_insert(head, tail, element)
struct SPDY_Session * sessions_tail
struct SPDYF_Stream * streams_tail
#define SPDYF_DATA_FRAME_HTON(frame)
int SPDYF_zlib_deflate_init(z_stream *strm)
size_t read_buffer_offset
struct SPDYF_Response_Queue * next
int SPDYF_handler_write_syn_reply(struct SPDY_Session *session)
struct SPDYF_Stream * stream
int SPDYF_session_idle(struct SPDY_Session *session)
SPDYF_NewDataCallback freceived_data_cb
int SPDYF_handler_write_rst_stream(struct SPDY_Session *session)
z_stream zlib_send_stream
SPDYF_IOBeforeWrite fio_before_write
struct SPDY_Response * response
SPDY_NewDataCallback received_data_cb
int SPDYF_stream_new(struct SPDY_Session *session)
void SPDYF_zlib_inflate_end(z_stream *strm)
int SPDYF_zlib_inflate_init(z_stream *strm)