48 fprintf (stdout,
"Fatal error in libmicrospdy %s:%u: %s\n",
140 daemon->
address = va_arg (valist,
struct sockaddr *);
187 struct sockaddr_in* servaddr4 =
NULL;
189 struct sockaddr_in6* servaddr6 =
NULL;
252 SPDYF_DEBUG(
"SPDY_DAEMON_FLAG_ONLY_IPV6 set but IPv4 address provided");
256 addrlen =
sizeof (
struct sockaddr_in6);
260 if (
NULL == (servaddr6 = malloc (addrlen)))
265 memset (servaddr6, 0, addrlen);
266 servaddr6->sin6_family = AF_INET6;
267 servaddr6->sin6_addr = in6addr_any;
268 servaddr6->sin6_port = htons (port);
269 daemon->
address = (
struct sockaddr *) servaddr6;
272 if(AF_INET6 == daemon->
address->sa_family)
284 SPDYF_DEBUG(
"SPDY_DAEMON_FLAG_ONLY_IPV6 set but no support");
288 addrlen =
sizeof (
struct sockaddr_in);
292 if (
NULL == (servaddr4 = malloc (addrlen)))
297 memset (servaddr4, 0, addrlen);
298 servaddr4->sin_family = AF_INET;
299 servaddr4->sin_addr = INADDR_ANY;
300 servaddr4->sin_port = htons (port);
301 daemon->
address = (
struct sockaddr *) servaddr4;
307 daemon->
socket_fd = socket (afamily, SOCK_STREAM, 0);
315 ret = setsockopt(daemon->
socket_fd, SOL_SOCKET, SO_REUSEADDR, &option_on,
sizeof(option_on));
318 SPDYF_DEBUG(
"WARNING: SO_REUSEADDR was not set for the server");
324 ret = setsockopt(daemon->
socket_fd, IPPROTO_IPV6, IPV6_V6ONLY, &option_on,
sizeof(option_on));
327 SPDYF_DEBUG(
"setsockopt with IPPROTO_IPV6 failed");
393 unsigned long long *timeout)
395 unsigned long long earliest_deadline = 0;
396 unsigned long long now;
404 have_timeout =
false;
407 if ( (! have_timeout) ||
415 earliest_deadline = 0;
422 if (earliest_deadline <= now)
425 *timeout = earliest_deadline - now;
434 fd_set *write_fd_set,
435 fd_set *except_fd_set,
446 FD_SET (fd, read_fd_set);
454 FD_SET(fd, read_fd_set);
464 FD_SET(fd, write_fd_set);
483 struct timeval timeout;
494 num_ready = select (max + 1, &rs, &ws, &es, &timeout);
500 (FD_ISSET (ds, &rs)) ){
505 while (
NULL != (pos = next))
526 if (FD_ISSET (ds, &ws)){
SPDY_NewSessionCallback new_session_cb
struct SPDY_Daemon * SPDYF_start_daemon_va(uint16_t port, const char *certfile, const char *keyfile, SPDY_NewSessionCallback nscb, SPDY_SessionClosedCallback sccb, SPDY_NewRequestCallback nrcb, SPDY_NewDataCallback npdcb, SPDYF_NewStreamCallback fnscb, SPDYF_NewDataCallback fndcb, void *cls, void *fcls, va_list valist)
static int spdyf_parse_options_va(struct SPDY_Daemon *daemon, va_list valist)
int SPDYF_get_fdset(struct SPDY_Daemon *daemon, fd_set *read_fd_set, fd_set *write_fd_set, fd_set *except_fd_set, bool all)
int SPDYF_get_timeout(struct SPDY_Daemon *daemon, unsigned long long *timeout)
SPDY_PanicCallback spdyf_panic
struct SPDY_Daemon * daemon
unsigned long long session_timeout
struct SPDY_Session * next
#define DLL_remove(head, tail, element)
int SPDYF_session_read(struct SPDY_Session *session)
SPDYF_IODeinit fio_deinit
struct SPDYF_Response_Queue * response_queue_head
int SPDYF_prepare_goaway(struct SPDY_Session *session, enum SPDY_GOAWAY_STATUS status, bool in_front)
TCP connection/SPDY session handling.
SPDY_NewRequestCallback new_request_cb
void(* SPDY_NewSessionCallback)(void *cls, struct SPDY_Session *session)
void(* SPDY_PanicCallback)(void *cls, const char *file, unsigned int line, const char *reason)
struct sockaddr * address
internal functions and macros for the framing layer
void(* SPDY_NewRequestCallback)(void *cls, struct SPDY_Request *request, uint8_t priority, const char *method, const char *path, const char *version, const char *host, const char *scheme, struct SPDY_NameValue *headers, bool more)
SPDY_SessionClosedCallback session_closed_cb
unsigned long long last_activity
internal and public structures – most of the structs used by the library are defined here ...
Signatures for IO functions.
enum SPDY_IO_SUBSYSTEM io_subsystem
#define SPDYF_NUM_SENT_FRAMES_AT_ONCE
void SPDYF_session_close(struct SPDY_Session *session)
int(* SPDYF_NewStreamCallback)(void *cls, struct SPDYF_Stream *stream)
struct SPDY_Session * cleanup_head
unsigned long long SPDYF_monotonic_time(void)
void(* SPDY_SessionClosedCallback)(void *cls, struct SPDY_Session *session, int by_client)
int SPDYF_session_write(struct SPDY_Session *session, bool only_one_frame)
static void spdyf_panic_std(void *cls, const char *file, unsigned int line, const char *reason)
void SPDYF_session_destroy(struct SPDY_Session *session)
int(* SPDY_NewDataCallback)(void *cls, struct SPDY_Request *request, const void *buf, size_t size, bool more)
void SPDYF_stop_daemon(struct SPDY_Daemon *daemon)
enum SPDY_DAEMON_OPTION options
struct SPDY_Session * sessions_head
#define SPDYF_DEBUG(fmt,...)
SPDYF_NewStreamCallback fnew_stream_cb
static void spdyf_cleanup_sessions(struct SPDY_Daemon *daemon)
size_t read_buffer_beginning
enum SPDY_SESSION_STATUS status
struct SPDY_Session * cleanup_tail
void SPDYF_run(struct SPDY_Daemon *daemon)
int SPDYF_session_accept(struct SPDY_Daemon *daemon)
int SPDYF_io_set_daemon(struct SPDY_Daemon *daemon, enum SPDY_IO_SUBSYSTEM io_subsystem)
static void spdyf_close_all_sessions(struct SPDY_Daemon *daemon)
_MHD_EXTERN void SPDY_set_panic_func(SPDY_PanicCallback cb, void *cls)
int(* SPDYF_NewDataCallback)(void *cls, struct SPDYF_Stream *stream, const void *buf, size_t size, bool more)
enum SPDY_DAEMON_FLAG flags
SPDYF_IOIsPending fio_is_pending
size_t read_buffer_offset
int SPDYF_session_idle(struct SPDY_Session *session)
SPDYF_NewDataCallback freceived_data_cb
SPDY_NewDataCallback received_data_cb