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) &&
109 compressed_data_size,
111 &name_value_strm_size)) )
118 free(name_value_strm);
130 if(0 == name_value_strm_size || 0 == compressed_data_size)
137 free(name_value_strm);
147 free(name_value_strm);
156 free(name_value_strm);
166 free(name_value_strm);
183 struct SPDYF_Control_Frame *frame;
184 uint32_t last_good_stream_id;
189 "the function is called wrong");
200 if(0 != frame->flags || 8 != frame->length)
217 if(8 == frame->length)
220 last_good_stream_id =
NTOH31(last_good_stream_id);
224 status = ntohl(status_int);
262 struct SPDYF_Control_Frame *frame;
269 "the function is called wrong");
273 if(0 != frame->flags || 8 != frame->length)
290 stream_id =
NTOH31(stream_id);
302 while(
NULL != stream)
310 stream = stream->
next;
335 struct SPDYF_Data_Frame * frame;
340 "the function is called wrong");
370 SPDYF_DEBUG(
"No callback for DATA frame set; Ignoring DATA frame!");
426 struct SPDYF_Control_Frame control_frame;
427 void *compressed_headers =
NULL;
428 size_t compressed_headers_size=0;
431 uint32_t stream_id_nbo;
435 memcpy(&control_frame, response_queue->
control_frame,
sizeof(control_frame));
438 response_queue->
data,
442 &compressed_headers_size))
451 free(compressed_headers);
459 total_size =
sizeof(
struct SPDYF_Control_Frame)
461 + compressed_headers_size;
471 free(compressed_headers);
479 control_frame.length = compressed_headers_size + 4;
506 free(compressed_headers);
520 struct SPDYF_Control_Frame control_frame;
522 int last_good_stream_id;
526 memcpy(&control_frame, response_queue->
control_frame,
sizeof(control_frame));
530 total_size =
sizeof(
struct SPDYF_Control_Frame)
542 control_frame.length = 8;
575 struct SPDYF_Data_Frame data_frame;
581 memcpy(&data_frame, response_queue->
data_frame,
sizeof(data_frame));
588 total_size =
sizeof(
struct SPDYF_Data_Frame)
589 + response_queue->data_size;
599 data_frame.length = response_queue->data_size;
616 total_size =
sizeof(
struct SPDYF_Data_Frame)
617 + SPDY_MAX_SUPPORTED_FRAME_SIZE;
628 session->
write_buffer +
sizeof(
struct SPDYF_Data_Frame),
683 response_queue->
frqcb,
685 response_queue->
rrcb,
698 new_response_queue->
prev = response_queue;
699 new_response_queue->
next = response_queue->
next;
706 response_queue->
next->
prev = new_response_queue;
708 response_queue->
next = new_response_queue;
720 data_frame.length = ret;
726 sizeof(
struct SPDYF_Data_Frame));
745 struct SPDYF_Control_Frame control_frame;
750 memcpy(&control_frame, response_queue->
control_frame,
sizeof(control_frame));
752 total_size =
sizeof(
struct SPDYF_Control_Frame)
764 control_frame.length = 8;
790 struct SPDYF_Control_Frame control_frame;
795 memcpy(&control_frame, response_queue->
control_frame,
sizeof(control_frame));
797 total_size =
sizeof(
struct SPDYF_Control_Frame)
809 control_frame.length = 8;
832 struct SPDYF_Control_Frame *frame;
836 "the function is called wrong");
870 size_t actual_buf_size;
890 if(actual_buf_size <
sizeof(
struct SPDYF_Control_Frame))
900 "no frame for session");
942 bytes_read = session->
fio_recv(session,
1008 while(
NULL != response_queue)
1080 bytes_written = session->
fio_send(session,
1084 switch(bytes_written)
1157 size_t read_buffer_beginning;
1158 size_t frame_length;
1159 struct SPDYF_Control_Frame* control_frame;
1160 struct SPDYF_Data_Frame *data_frame;
1181 <
sizeof(
struct SPDYF_Control_Frame))
1190 if(
NULL == (control_frame = malloc(
sizeof(
struct SPDYF_Control_Frame))))
1197 memcpy(control_frame,
1199 sizeof(
struct SPDYF_Control_Frame));
1205 switch(control_frame->type){
1225 if(
NULL == (data_frame = malloc(
sizeof(
struct SPDYF_Data_Frame))))
1234 sizeof(
struct SPDYF_Data_Frame));
1245 SPDYF_DEBUG(
"another protocol or version received!");
1279 frame_length = ((
struct SPDYF_Control_Frame *)session->
frame_handler_cls)->length;
1288 SPDYF_DEBUG(
"received frame with unsupported size: %zu", frame_length);
1294 + read_buffer_beginning
1322 "Session is in wrong state");
1395 struct sockaddr *addr;
1398 struct sockaddr_in6 addr6;
1400 addr = (
struct sockaddr *)&addr6;
1401 addr_len =
sizeof(addr6);
1403 struct sockaddr_in addr4;
1405 addr = (
struct sockaddr *)&addr4;
1406 addr_len =
sizeof(addr6);
1409 new_socket_fd = accept (daemon->
socket_fd, addr, &addr_len);
1411 if(new_socket_fd < 1)
1420 session->
daemon = daemon;
1442 if (
NULL == (session->
addr = malloc (addr_len)))
1447 memcpy (session->
addr, addr, addr_len);
1478 shutdown (new_socket_fd, SHUT_RDWR);
1484 free (session->
addr);
1496 int consider_priority)
1503 "called with consider_priority but no stream provided");
1505 last = response_to_queue;
1511 if(
SPDY_NO == consider_priority)
1522 else if(-1 == consider_priority)
1560 response_to_queue->
prev = pos;
1561 pos->
next = response_to_queue;
1566 response_to_queue->
prev = pos;
1568 pos->
next = response_to_queue;
1609 free(session->
addr);
1622 struct SPDYF_Control_Frame *control_frame;
1631 if(
NULL == (control_frame = malloc(
sizeof(
struct SPDYF_Control_Frame))))
1633 free(response_to_queue);
1636 memset(control_frame, 0,
sizeof(
struct SPDYF_Control_Frame));
1638 if(
NULL == (data = malloc(4)))
1640 free(control_frame);
1641 free(response_to_queue);
1644 *(
data) = htonl(status);
1646 control_frame->control_bit = 1;
1649 control_frame->flags = 0;
1670 struct SPDYF_Control_Frame *control_frame;
1685 if(
NULL == (control_frame = malloc(
sizeof(
struct SPDYF_Control_Frame))))
1687 free(response_to_queue);
1690 memset(control_frame, 0,
sizeof(
struct SPDYF_Control_Frame));
1692 if(
NULL == (data = malloc(8)))
1694 free(control_frame);
1695 free(response_to_queue);
1699 *(data + 1) = htonl(status);
1701 control_frame->control_bit = 1;
1704 control_frame->flags = 0;
1710 response_to_queue->
stream = stream;
1723 int32_t delta_window_size)
1726 struct SPDYF_Control_Frame *control_frame;
1737 if(
NULL == (control_frame = malloc(
sizeof(
struct SPDYF_Control_Frame))))
1739 free(response_to_queue);
1742 memset(control_frame, 0,
sizeof(
struct SPDYF_Control_Frame));
1744 if(
NULL == (data = malloc(8)))
1746 free(control_frame);
1747 free(response_to_queue);
1751 *(data + 1) =
HTON31(delta_window_size);
1753 control_frame->control_bit = 1;
1756 control_frame->flags = 0;
1762 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_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)
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
_MHD_EXTERN int SPDYF_name_value_from_stream(void *stream, size_t size, struct SPDY_NameValue **container)
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
int(* process_response_handler)(struct SPDY_Session *session)
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)