// called when a new session is created static int fastrouter_alloc_session(struct uwsgi_corerouter *ucr, struct uwsgi_gateway_socket *ugs, struct corerouter_session *cs, struct sockaddr *sa, socklen_t s_len) { // set the retry hook cs->retry = fr_retry; // wait for requests... if (uwsgi_cr_set_hooks(cs->main_peer, fr_recv_uwsgi_header, NULL)) return -1; return 0; }
void hr_setup_ssl(struct http_session *hr, struct uwsgi_gateway_socket *ugs) { hr->ssl = SSL_new(ugs->ctx); SSL_set_fd(hr->ssl, hr->session.main_peer->fd); SSL_set_accept_state(hr->ssl); #ifdef UWSGI_SPDY SSL_set_ex_data(hr->ssl, uhttp.spdy_index, hr); #endif uwsgi_cr_set_hooks(hr->session.main_peer, hr_ssl_read, NULL); hr->session.close = hr_session_ssl_close; hr->func_write = hr_ssl_write; }
ssize_t hr_ssl_shutdown(struct corerouter_peer *peer) { // ensure no hooks are set if (uwsgi_cr_set_hooks(peer, NULL, NULL)) return -1; struct corerouter_session *cs = peer->session; struct http_session *hr = (struct http_session *) cs; hr_ssl_clear_errors(); int ret = SSL_shutdown(hr->ssl); int err = 0; if (ret != 1 && ERR_peek_error()) { err = SSL_get_error(hr->ssl, ret); } // no error, close the connection if (ret == 1 || err == 0 || err == SSL_ERROR_ZERO_RETURN) return 0; if (err == SSL_ERROR_WANT_READ) { if (uwsgi_cr_set_hooks(peer, hr_ssl_shutdown, NULL)) return -1; return 1; } else if (err == SSL_ERROR_WANT_WRITE) { if (uwsgi_cr_set_hooks(peer, NULL, hr_ssl_shutdown)) return -1; return 1; } else if (err == SSL_ERROR_SYSCALL) { if (errno != 0) uwsgi_cr_error(peer, "hr_ssl_shutdown()"); } else if (err == SSL_ERROR_SSL && uwsgi.ssl_verbose) { ERR_print_errors_fp(stderr); } return -1; }
// allocate a new session static int sslrouter_alloc_session(struct uwsgi_corerouter *ucr, struct uwsgi_gateway_socket *ugs, struct corerouter_session *cs, struct sockaddr *sa, socklen_t s_len) { // set close hook cs->close = sr_session_close; // set retry hook cs->retry = sr_retry; struct sslrouter_session *sr = (struct sslrouter_session *) cs; sr->ssl = SSL_new(ugs->ctx); SSL_set_fd(sr->ssl, cs->main_peer->fd); SSL_set_accept_state(sr->ssl); if (uwsgi_cr_set_hooks(cs->main_peer, sr_read, NULL)) return -1; return 0; }